如何讓窗口重畫——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()

昨天晚上討論的問題,還有另外一個很重要的部分——如何讓窗口重畫。


這裏注意這樣幾點(這裏討論的函數都是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

附件程序是對上述說法的演示程序,程序中在OnPaint()函數中添加了代碼,用TextOut函數輸出OnPaint被調用了多少次。
注意最後兩個按鈕產生效果的區別。爲什麼會這樣?
發佈了69 篇原創文章 · 獲贊 53 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章