這裏注意這樣幾點(這裏討論的函數都是CWnd對象的成員函數):
@1.Invalidate()函數只是標記窗口區域需要重畫,但不意味着窗口會被直接重畫。它只會在下一個WM_PAINT消息被接收到時,調用OnPaint()才被重畫。
@2.當窗口的“消息隊列中沒有其他消息”且“窗口需要被重畫的區域不爲空時”,Windows系統會自動向窗口發送WM_PAINT消息,引發窗口的重畫(這解釋了爲什麼有時我們不需要自己調用SendMessage(WM_PAINT);)
@3.當窗口區域在被Invalidate()掉後,並且在WM_PAINT消息接收到之前,我們仍然可以調用ValidateRect(NULL)來取消掉這次窗口重畫。
@4.當你需要讓窗口在Invalidate()後立即重畫,標準的做法應該是Invalidate()之後馬上調用UpdateWindow(),這樣窗口會立即把自己重畫一次。
@5.UpdateWindow()的實現方式,仍然是對窗口的Client area發送一個WM_PAINT消息,這個機制也可以用SendMessage(WM_PAINT)做到。
http://kcclub.kingsoft.com/forum.php?mod=attachment&aid=NjU2fDZhYWQ3OTI0fDEzMzE3MDU3ODh8OTM%3D
注意最後兩個按鈕產生效果的區別。爲什麼會這樣?