-
Invalidate
鎖定
Invalidate( ) :使整個窗口客户區無效, 並進行更新顯示的函數
- 中文名
- Invalidate
- 外文名
- BOOL bErase = TRUE
- 參 數
- bErase
- 作 用
- 整個窗口客户區無效
- 出現場合
- MFC
Invalidate基本介紹
void Invalidate( BOOL bErase = TRUE );
參數: bErase 決定了是否要在WM_PAINT消息前發送WM_ERASEBKGND
窗口的客户區無效意味着需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前台窗口,那麼原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。
Invalidate區別
UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函數後窗口不會立即重繪,這是由於WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完後才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目標窗口,從而導致窗口立即重繪。
Invalidate關係
系統會在多個不同的時機發送WM_PAINT消息:當第一次創建一個窗口時,當改變窗口的大小時,當把窗口從另一個窗口背後移出時,當最大化或最小化窗口時,等等,這些動作都是由系統管理的,應用只是被動地接收該消息,在消息處理函數中進行繪製操作;大多數的時候應用也需要能夠主動引發窗口中的繪製操作,比如當窗口顯示的數據改變的時候,這一般是通過InvalidateRect和 InvalidateRgn函數來完成的。InvalidateRect和InvalidateRgn把指定的區域加到窗口的Update Region中,當應用的消息隊列沒有其他消息時,如果窗口的Update Region不為空時,系統就會自動產生WM_PAINT消息
[1]
。
系統為什麼不在調用Invalidate時發送WM_PAINT消息呢?又為什麼非要等應用消息隊列為空時才發送WM_PAINT消息呢?這是因為系統把在窗口中的繪製操作當作一種低優先級的操作,於是儘可能地推後做,這樣有利於提高繪製的效率:在兩個WM_PAINT消息之間多個Invalidate調用使之失效的區域就會被累加起來,然後在一個WM_PAINT消息中一次得到更新,不僅能避免多次重複地更新同一區域,也優化了應用的更新操作。像這種通過InvalidateRect和InvalidateRgn來使窗口區域無效,依賴於系統在合適的時機發送WM_PAINT消息的機 制實際上是一種異步工作方式,也就是説,在無效化窗口區域和發送WM_PAINT消息之間是有延遲的;有時候這種延遲並不是我們希望的,這時我們當然可以在無效化窗口區域後利用SendMessage 發送一條WM_PAINT消息來強制立即重畫,但不如使用Windows GDI為我們提供的更方便和強大的函數:UpdateWindow和RedrawWindow。UpdateWindow會檢查窗口的Update Region,當其不為空時才發送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫非客户區和背景,是否總是發送WM_PAINT消息而不管Update Region是否為空等。
- 參考資料
-
- 1. InvalidateRect只是增加重繪區域,在下次WM_PAINT的時候才生效 .博客園[引用日期2013-05-23]
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:19次歷史版本
- 最近更新: 杨家将1206