做一個MFC項目中重繪,開始的時候以為在OnPaint函數中使用哪個裝置繪圖都沒有問題。于是乎,OnPaint中大手一揮,出現了個CClientDC,代碼如下:
void CEriseBlockView::OnPaint()
{
CClientDC dc(this);
DrawBlock(&dc);
}
寫完之後發現完蛋了,怎麼本來好好的定時器壞了呢?大費周折調試了一番之後發現,诶?怎麼程式還賴在 OnPaint函數中,死活都不走了呢?這可有意思了,照這麼說,原因可能是OnPaint函數中又觸發了WM_PAINT。
按照這個思路,找啊找,找啊找,找到了在OnPaint函數中有個DrawBlock(&dc),這個函數内部有個::InvalidateRect!立馬果斷改,改完之後發現,诶?還是賴在這,難道我DC有問題?那好,我換...于是乎,代碼變成了下面這樣:
void CEriseBlockView::OnPaint()
{
CPaintDC dc(this);
DrawBlock(&dc);
}
神奇的事情發生了,竟然正常了!
這是為什麼呢,在好奇心的驅使下,我咬住這倆兄弟 CClientDC和CPaintDC就開始調試。結果終于被我找到了,關鍵在于 CPaintDC釋放的時候調用了 CWnd::EndPaint。至此恍然大悟,CWnd::EndPaint是用來清空WM_PAINT消息的,如果不清空,則系統一直發出WM_PAINT消息,是以。。。
看來,CPaintDC隻用在OnPaint消息處理函數裡,是有一定道理的啊~