一直用的WIN2K系統,寫的一個程序在本機正常,到XP系統的機器運行發現調整窗口大小時界面閃得厲害,程序比較大,而且這種閃爍還不好調試,因爲單步調試沒有閃爍效果,只能排除法找原因,最後以爲找到原因了,就寫了一個測試程序,就是用VC6嚮導自動生成API的Hello World程序,然後修改一下其WM_PAINT代碼:
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: Add any drawing code here...
- RECT rt;
- GetClientRect(hWnd, &rt);
- InflateRect(&rt,-20,-20);
- BitBlt(hdc,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,hdc,0,0,BLACKNESS);
- EndPaint(hWnd, &ps);
- break;
效果是在窗口中間顯示一個黑框,編譯後調整窗口大小時畫面閃爍,這是正常的。把窗口類型的CS_HREDRAW | CS_VREDRAW取消掉,即把ATOM MyRegisterClass(HINSTANCE hInstance)函數裏改成
wcex.style = 0;//CS_HREDRAW | CS_VREDRAW;
這下不閃了,但是也不畫黑框了,因爲不刷新了,需要在WM_SIZE消息裏面通知刷新一下:
- case WM_SIZE:
- InvalidateRect(hWnd,NULL,FALSE);
- return DefWindowProc(hWnd, message, wParam, lParam);
按道理這段代碼造成的效果應該是:黑框跟着窗口尺寸變化,但是背景會花,因爲InvalidateRect的最後一個參數如果是FALSE,是不刷新背景的。在WIN2000下運行的確是這個效果,而在XP下,不管這最後一個參數是TRUE還是FALSE,效果跟原始代碼是一樣的,黑框閃爍得厲害,好象這個參數在XP下無效了。
解決方案是響應WM_ERASEBKGND,直接返回TRUE,在WIN2000和XP下就表現一致了。但是這個InvalidateRect的最後一個參數無效的問題就不知道怎麼回事了,不知道是不是XP的BUG。