Invalidate和UpdateWindow的區(qū)別
Invalidate在消息隊列中加入一條WM_PAINT消息,其無效區(qū)為整個客戶區(qū)。
UpdateWindow直接發(fā)送一個WM_PAINT消息,其無效區(qū)范圍就是消息隊列中WM_PAINT消息(最多只有一條)的無效區(qū)。
效果很明顯,當(dāng)調(diào)用Invalidate之后,屏幕不一定馬上更新,因為WM_PAINT消息不一定在隊列頭部,而調(diào)用UpdateWindow會使WM_PAINT消息馬上執(zhí)行的,繞過了消息隊列。
如果調(diào)用Invalidate之后想馬上更新屏幕,那就加上UpdateWindow()這條語句。
MSDN的解釋
UpdateWindow
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT
message to the window if the window's update region is not empty. The function sends a WM_PAINT
message directly to the window procedure of the specified window, bypassing the application queue.
If the update region is empty, no message is sent.
InvalidateRect
The system sends a WM_PAINT message to a window whenever its update region is not empty and
there are no other messages in the application queue for that window.
翻譯成中文大概的解釋如下:
UpdateWindow:如果有無效區(qū),則馬上sending a WM_PAINT message到窗口處理過程,不進(jìn)消息隊列進(jìn)行排隊等待,立即刷新窗口,否則,什么都不做。
InvalidateRect:設(shè)置無效區(qū),如果為NULL參數(shù),則設(shè)置整個窗口為無效區(qū)。當(dāng)應(yīng)用程序的那個窗口的消息隊列為空時,則sending a WM_PAINT message(即使更新區(qū)域為空).在sending a WM_PAINT message的所有InvalidateRect的更新區(qū)域會累加。
1:設(shè)置無效區(qū)
InvalidateRect
2:立即刷新
UpdateWindow();
如果不調(diào)用 InvalidateRect就調(diào)用 UpdateWindow,那么UpdateWindow什么都不做。 ??????
如果調(diào)用 InvalidateRect 后不調(diào)用UpdateWindow,則系統(tǒng)會自動在窗口消息隊列為空的時候,系統(tǒng)自動發(fā)送一WM_PAINT消息。
調(diào)用UpdateWindow()時將會發(fā)送一個WM_PAINT消息,而應(yīng)用程序在接收到WM_PAINT消息后,將自動地調(diào)用Invalidate(),所以,在程序代碼中,不一定要出現(xiàn)Invalidate()!
UpdateWindow()就是立即發(fā)送WM_PAINT消息,只對聲明無效的區(qū)域起作用,
Invalidate()則是聲明無效的方式之一。
Invalidate()表示客戶區(qū)域無效,在下次WM_PAINT發(fā)生時重繪。而WM_PAINT是由系統(tǒng)進(jìn)行維護(hù)的,每當(dāng)CWnd的更新區(qū)域不為空,并且在應(yīng)用程序的窗口消息隊列中沒有其它消息時,Windows就發(fā)送一條WM_PAINT消息。
Invalidate里面有個bool型的參數(shù),用來標(biāo)識重繪的時候是否用背景色填充。是不是用SetBkcolor函數(shù)?下去繼續(xù)研究。
updateWindow則是要求系統(tǒng)對區(qū)域進(jìn)行立即重繪。
看到有人在網(wǎng)上提出問題,他在Invalidate后面又寫了繪圖的函數(shù)但是沒有執(zhí)行,因為invalidate執(zhí)行過以后轉(zhuǎn)到PAINT命令了。所以后面的都沒有顯示。
也終于想通我繪的圖一直在閃啊閃,因為我在PAINT里面用到Invalidate()函數(shù),所以他不停的自嵌套,倒是繪的圖不停的閃。
Invalidate讓客戶區(qū)處于可以重畫的狀態(tài),而UpdateWindow開始重畫,但是它先判斷客戶區(qū)是否為空,不空UpdateWindow不執(zhí)行,為空才執(zhí)行重畫。
Invalidat最后也是調(diào)用InvalidatRect,在windows API里只有InvalidatRect的