UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow


Invalidate

在消息隊列中加入一條WM_PAINT消息,其無效區為整個客戶區。

窗口的客戶區無效意味着需要重繪。例如,如果一個被其它窗口遮住的窗口變成了前台窗口,那么原來被遮住的部分就是無效的,需要重繪。

理論:這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bEraseTRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。

Invalidate()表示客戶區域無效,在下次WM_PAINT發生時重繪。而WM_PAINT是由系統進行維護的,每當CWnd的更新區域不為空,並且在應用程序的窗口消息隊列中沒有其它消息時,Windows就發送一條WM_PAINT消息。

Invalidat最后也是調用InvalidatRect。

UpdateWindow

如果有無效區,則馬上sending a WM_PAINT message到窗口處理過程,不進消息隊列進行排隊等待,立即刷新窗口,否則,什么都不做。不過在它發送前,先調用GetUpdateRect(hWnd,NULL,TRUE)看有無可繪制區域,如果沒有則不發送消息

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

updateWindow其只對聲明為無效的區域起作用,而Invalidate()是聲明無效區域的方式之一。

效果很明顯,調用Invalidate之后,屏幕不一定馬上更新,因為WM_PAINT消息不一定在隊列頭部,而調用UpdateWindow會使

WM_PAINT消息馬上執行的,繞過了消息隊列。如果你調用Invalidate之后想馬上更新屏幕,那就加上UpdateWindow這條語句。

UpdateData()

UpdateData(TRUE)
——刷新控件的值到對應的變量。(外部輸入值交給內部變量)
即:控件的值—>變量。

UpdateData(FALSE)
—— 拷貝變量值到控件顯示。(變量的最終運算結果值交給外部輸出顯示)
即:變量值—>控件顯示

 

InvalidateRect

該函數的功能與Invalidate基本一樣,不同的是,它是使指定的某個區域無效,需要輸入一個區域,如果參數為NULL,則設置整個窗口為無效區。

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

RedrawWindow

強制刷新,會調用WM_PAINT,但如果你強制刷新的部分不存在就不會調用WM_PAINT。若不帶任何參數,則本窗口全部刷新。

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

RedrawWindow()則是具有Invalidate()和UpdateWindow()的雙特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM