MFC OnPaint被不斷調用的問題

本人最近在開發一個繪圖程序,需用到OnPaint。雖說MFC也用了比較久了,但對OnPaint還是理解不深。在OnPaint中我把 CPaintDC dc(this); 註釋掉了。然後自己手動獲取 CDC 進行操作。導致OnPaint被不斷的調用。導致這個問題的原因就是不應該把 CPaintDC dc(this); 註釋掉。要使用它。

因爲CPaintDC dc(this); 的構造,析構裏調用了CWnd::BeginPaint、CWnd::EndPaint 。具體如下:

CPaintDC的獨到之處就在於,它在構造函數中調用了 CWnd::BeginPaint在析構時調用了CWnd::EndPaint,而且它只能響應WM_ONPAINT消息。而這個BeginPaint會 發送WM_ONERASEBKGND消息,因此,它只擦除指定的背景並重畫,不影響對話框內的其他控件。值得注意的是,在這操作之後不要再調用 CDialog::Onpaint函數。


而之前的方法之所以不成功是因爲:

BeginPaint() 和EndPaint() 可以刪除消息隊列中的WM_PAINT消息,並使無效區域有效。
GetDC()和ReleaseDC()並不刪除也不能使無效區域有效,因此當程序跳出 WM_PAINT 時 ,無效區域仍然存在。系統就回不斷髮送WM_PAINT消息,於是程序不斷處理WM_PAINT消息。其中無效區域是指需要重畫的區域,無效的意思是:當前內容是舊的,過時的。

只 有當一個窗口消息空閒時,系統纔會抽空檢查一下這個窗口的無效區域是否爲非空(WM_PAINT的優先級是最低的。這也就是爲什麼系統很忙時窗口和桌面往 往會出現變白、刷新不了、留拖拽痕跡等現象的原因),如果非空,系統就發送WM_PAINT。所以一定要用BeginPaint、EndPaint把無效 區域設爲空,否則WM_PAINT將一直被髮送。


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