自定義控件響應WM_PAINT消息,在OnPaint中,默認有CPaintDC dc(this);
如果註釋掉CPaintDC dc(this);則程序不停地刷新(計數器不停地飛漲!!),可是如果保留
則是正常響應。雖然問題解決了,但不知道具體原因???
答:原因得從CPaintDC說起。CPaintDC爲窗口的OnPaint函數所使用的設備環境類。該類的構造
函數會自動調用BeginPaint函數,析構函數自動調用EndPaint函數。
BeginPaint函數的作用就是將窗口需要重繪的區域設置爲空(也就是Update Region置空)
。在正常情況下,我們接收到了WM_PAINT消息後,窗口的Update Region都是非空的(如果爲空
就不需要發送WM_PAINT消息了)。而當你響應這個消息的時候又不調用BeginPaint來清空,窗口
的Update Region就一直是非空的,系統就會一直髮送WM_PAINT消息。這樣就形成了一個處理
WM_PAINT消息的死循環。這就是我出現錯誤的原因,低級錯誤。
BeginPaint和WM_ERASEBKGND消息也有關係。當窗口的Update Region被標誌爲需要擦除背
景時,BeginPaint會發送WM_ERASEBKGND消息來重畫背景,同時在其返回信息裏有一個標誌表明
窗口背景是否被重畫過。當我們用InvalidateRect和InvalidateRgn來把指定區域加到Update
Region中時,可以設置該區域是否需要被擦除背景,這樣下一個BeginPaint就知道是否需要發送
WM_ERASEBKGND消息了。