Invalidate和UpdateWindow的區別

在編程的時候經常把UpdateData、Invalidate、InvalidateRect和UpdateWindow四個函數混淆,在這裏將簡單介紹它們的區別。
UpdateData():

    當你使用了ClassWizard建立了控件和變量之間的聯繫後:當你修改了變量的值,而希望對話框控件更新顯示,就應該在修改變量後調用UpdateData(FALSE);如果你希望知道用戶在對話框中到底輸入了什麼,就應該在訪問變量前調用UpdateData(TRUE),將控件的輸入映射到變量中。

Invalidate():
     該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味着需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那麼原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC爲窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase爲TRUE時,重繪區域內的背景 將被擦除,否則,背景將保持不變。

InvalidateRect():
    該函數的功能與Invalidate基本一樣,不同的是,它是使指定的某個區域無效,需要輸入一個區域。

UpdateWindow():
     UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函數後窗口不會立即重繪,這是由於WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完後才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目標窗口,從而導致窗口立即重繪。

 


文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20071111/85617.html

 

 

 

  1. Invalidate在消息隊列中加入一條WM_PAINT消息,其無效區爲整個客戶區。
  2. UpdateWindow直接發送一個WM_PAINT消息,其無效區範圍就是消息隊列中WM_PAINT消息(最多隻有一條)的無效區。
  3. 效果很明顯,當調用Invalidate之後,屏幕不一定馬上更新,因爲WM_PAINT消息不一定在隊列頭部,而調用UpdateWindow會使WM_PAINT消息馬上執行的,繞過了消息隊列。
  4. 如果調用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:如果有無效區,則馬上sending a WM_PAINT message到窗口處理過程,不進消息隊列進行排隊等待,立即刷新窗口,否則,什麼都不做。 
 InvalidateRect:設置無效區,如果爲NULL參數,則設置整個窗口爲無效區。當應用程序的那個窗口的消息隊列爲空時,則sending a WM_PAINT message(即使更新區域爲空).在sending a WM_PAINT message的所有InvalidateRect的更新區域會累加。 

 1:設置無效區 
 InvalidateRect 

 2:立即刷新 
 UpdateWindow(); 

如果不調用 InvalidateRect就調用 UpdateWindow,那麼UpdateWindow什麼都不做。 ??????
如果調用 InvalidateRect 後不調用UpdateWindow,則系統會自動在窗口消息隊列爲空的時候,系統自動發送一WM_PAINT消息。 

調用UpdateWindow()時將會發送一個WM_PAINT消息,而應用程序在接收到WM_PAINT消息後,將自動地調用Invalidate(),所以,在程序代碼中,不一定要出現Invalidate()!

UpdateWindow()就是立即發送WM_PAINT消息,只對聲明無效的區域起作用,   
  Invalidate()則是聲明無效的方式之一。

Invalidate()表示客戶區域無效,在下次WM_PAINT發生時重繪。而WM_PAINT是由系統進行維護的,每當CWnd的更新區域不爲空,並且在應用程序的窗口消息隊列中沒有其它消息時,Windows就發送一條WM_PAINT消息。   
  Invalidate裏面有個bool型的參數,用來標識重繪的時候是否用背景色填充。是不是用SetBkcolor函數?下去繼續研究。

 updateWindow則是要求系統對區域進行立即重繪。

 看到有人在網上提出問題,他在Invalidate後面又寫了繪圖的函數但是沒有執行,因爲invalidate執行過以後轉到PAINT命令了。所以後面的都沒有顯示。

 也終於想通我繪的圖一直在閃啊閃,因爲我在PAINT裏面用到Invalidate()函數,所以他不停的自嵌套,倒是繪的圖不停的閃。

Invalidate讓客戶區處於可以重畫的狀態,而UpdateWindow開始重畫,但是它先判斷客戶區是否爲空,不空UpdateWindow不執行,爲空才執行重畫。

Invalidat最後也是調用InvalidatRect,在windows API裏只有InvalidatRect的

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