Delphi Invalidate的用法

起初聽說delphi有個invalidate的函數,它可以使窗體畫板上被“抹掉”的圖像重新出現。當時我十分不解,因爲電腦怎麼知道原來的圖應該是什麼樣的呢?難道它能記住CPU執行過的最新一條繪圖指令並再度運行?看看作者這篇,讓你恍然大悟。

 

Delphi Invalidate的用法

 

作者:張志峯

1、Invalidate介紹  void Invalidate( BOOL bErase = TRUE );
  該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味着需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那麼原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC爲窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase爲TRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。
2、與UpdateWindow( )的區別
  UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函數後窗口不會立即重繪,這是由於WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完後才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目標窗口,從而導致窗口立即重繪。

Delphi中的代碼

procedure TWinControl.Invalidate;
begin
  Perform(CM_INVALIDATE, 0, 0);
end;

這個方法會使窗口重繪。

分類: Delphi

 

————————————————————————————————————————

讀後感:但invalidate絕不僅僅是執行用戶在onpaint函數內編寫的語句,那些shape、image也會在form刷完筆畫後重繪,並按一定順序覆蓋。真實的運行比我們看到的函數要複雜得多。一個窗口配備有onpaint、onclick等諸多敏感事件,待命階段隨時可以因觸發而進入,你點了button1click(這其實在button1的event內,但卻是爲button1的parent即form所爲),就會執行之內函數,結束在出來。但如果拿窗口去刷,那麼只有被刷的部分會執行上述重繪操作,其餘部分彷彿沒有受函數管轄一樣。對於填寫onpaint事件的程序,如果在程序運行時亂刷屏,那麼很多觸發(比如定時器)就極有可能丟失!

 

 

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章