OnPaint不停刷新的問題

自定義控件響應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消息了。

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