奇怪的問題,InvalidateRect最後一個參數在XP下無效

一直用的WIN2K系統,寫的一個程序在本機正常,到XP系統的機器運行發現調整窗口大小時界面閃得厲害,程序比較大,而且這種閃爍還不好調試,因爲單步調試沒有閃爍效果,只能排除法找原因,最後以爲找到原因了,就寫了一個測試程序,就是用VC6嚮導自動生成API的Hello World程序,然後修改一下其WM_PAINT代碼:

  1. case WM_PAINT:
  2.             hdc = BeginPaint(hWnd, &ps);
  3.             // TODO: Add any drawing code here...
  4.             RECT rt;
  5.             GetClientRect(hWnd, &rt);
  6.             InflateRect(&rt,-20,-20);
  7.             BitBlt(hdc,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,hdc,0,0,BLACKNESS);
  8.             EndPaint(hWnd, &ps);
  9.             break;

效果是在窗口中間顯示一個黑框,編譯後調整窗口大小時畫面閃爍,這是正常的。把窗口類型的CS_HREDRAW | CS_VREDRAW取消掉,即把ATOM MyRegisterClass(HINSTANCE hInstance)函數裏改成

wcex.style   = 0;//CS_HREDRAW | CS_VREDRAW;

 

這下不閃了,但是也不畫黑框了,因爲不刷新了,需要在WM_SIZE消息裏面通知刷新一下:

  1. case WM_SIZE:
  2.             InvalidateRect(hWnd,NULL,FALSE);
  3.             return DefWindowProc(hWnd, message, wParam, lParam);

按道理這段代碼造成的效果應該是:黑框跟着窗口尺寸變化,但是背景會花,因爲InvalidateRect的最後一個參數如果是FALSE,是不刷新背景的。在WIN2000下運行的確是這個效果,而在XP下,不管這最後一個參數是TRUE還是FALSE,效果跟原始代碼是一樣的,黑框閃爍得厲害,好象這個參數在XP下無效了。

 

解決方案是響應WM_ERASEBKGND,直接返回TRUE,在WIN2000和XP下就表現一致了。但是這個InvalidateRect的最後一個參數無效的問題就不知道怎麼回事了,不知道是不是XP的BUG。

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章