引用:出處
Invalidate()是System.Windows.Forms.Form的一個成員,它把客戶視窗地區標記為無效,因此在需要重新繪製時,它可以確保引發Paint事件。Invalidate()有兩個重載方法:可以給它傳送一個矩形,指定(使用頁面座標)需要重新繪製哪個視窗地區,如果不提供任何參數,它就把整個用戶端區域標記為無效。
為什麼要這麼做如果知道需要繪製某些內容,為什麼不調用OnPaint()或直接完成繪製任務的其他方法一般情況下,最好不要直接調用繪圖常式,如果代碼要完成某些繪圖任務,此時一般應調用Invalidate()。其原因如下所示:
● 繪圖總是GDI+應用程式可以執行的一種處理器密集型的任務。在其他工作的中間進行繪圖會妨礙其他工作的進行。在前面的樣本中,如果在LoadFile()方法中直接調用一個方法來完成繪圖,LoadFile()方法就將在繪圖工作完成後才能返回。在這段時間裡,應用程式不會響應其他事件。另一方面,通過調用Invalidate(),在從LoadFile返回之前,就可以讓Windows引發一個Paint事件。接著Windows就可以檢查等待處理的事件了。其內部的工作方式是事件被當作訊息佇列中一個訊息。Windows會定期檢查該隊列,如果其中有事件,Windows就選擇它,並調用相應的事件處理常式。現在Paint事件是隊列中的惟一事件,所以OnPaint()會被立即調用。但是,在一個比較複雜的應用程式中,可能會有其他事件,其中一些的優先權比OnPaint()高。特別是如果使用者已決定退出應用程式,該事件就會用訊息WM_QUIT來標記。
● 與第一個原因相關,如果有一個比較複雜的多線程應用程式,就會希望用一個線程處理所有的繪圖操作。使用Invalidate()可以把所有的繪圖操作傳遞到資訊隊列中,這有助於確保無論其他線程請求什麼繪圖操作,都由同一個線程完成所有的繪圖操作(無論什麼線程負責資訊隊列,都是由線程Application.Run()處理繪圖操作)。
● 還有一個與效能有關的原因。假定在某一時刻有幾個不同的螢幕繪製請求,也許代碼僅能修改文檔,以確保顯示更新的文檔,而同時使用者剛剛移開另一個覆蓋部分用戶端區域的視窗。調用Invalidate(),可以讓Windows注意到發生的事件。Windows就會在需要時合并Paint事件,合并無效的地區,這樣繪圖操作就只執行一次。
● 最後,執行繪圖的代碼可能是應用程式中最複雜的代碼部分,特別是當有一個比較專業化的使用者介面時,就更是如此。需要長時間維護該代碼的人員希望我們把所有的繪圖代碼都放在一個地方,且儘可能簡單—— 如果程式的其他部分沒有過多的路徑進入該代碼部分,維護就更容易。
其底線是最好把所有的繪圖代碼都放在OnPaint()常式中,或者在該方法中調用的其他方法中。但是要維持一個平衡。如果要在螢幕上替換一個字元,最好不要影響到已經繪製好的其他內容,此時可能不需要使用Invalidate(),而只需編寫一個獨立的繪圖常式。
注意:
在非常複雜的應用程式中,甚至可以編寫一個完整的類,專門負責在螢幕上繪圖。幾年前MFC仍是GDI密集型應用程式的標準技術,MFC就遵循這個模式,使用一個C++類CView完成繪圖操作。但即使是這樣,這個類也有一個成員函數OnDraw(),用作大多數繪圖請求的進入點。
轉自:http://www.tzwhx.com/newOperate/html/1/12/124/10475.html
C#中Invalidate() 方法
重載列表
使控制項的特定地區無效並向控制項發送繪製訊息。
受 .NET Framework 精簡版的支援。
[C#] public void Invalidate();[C++] public: void Invalidate();使控制項的特定地區無效並向控制項發送繪製訊息。還可以使分配給該控制項的子控制項無效。
[C#] public void Invalidate(bool);使控制項的指定地區無效(將其添加到控制項的更新地區,下次繪製操作時將重新繪製更新地區),並向控制項發送繪製訊息。
受 .NET Framework 精簡版的支援。
[C#] public void Invalidate(Rectangle);使控制項的指定地區無效(將其添加到控制項的更新地區,下次繪製操作時將重新繪製更新地區),並向控制項發送繪製訊息。
[C#] public void Invalidate(Region);使控制項的指定地區無效(將其添加到控制項的更新地區,下次繪製操作時將重新繪製更新地區),並向控制項發送繪製訊息。還可以使分配給該控制項的子控制項無效。
[C#] public void Invalidate(Rectangle, bool);使控制項的指定地區無效(將其添加到控制項的更新地區,下次繪製操作時將重新繪製更新地區),並向控制項發送繪製訊息。還可以使分配給該控制項的子控制項無效。
[C#] public void Invalidate(Region, bool);樣本
[Visual Basic, C#, C++] 下面的樣本使使用者能夠將映像或影像檔拖到表單上,並使它在放置點顯示。每次繪製表單時,都重寫 OnPaint 方法以重新繪製映像;否則映像將保持到下一次重新繪製。DragEnter 事件處理方法決定拖到表單中的資料的類型,並提供適當的反饋。如果 Image 可以從該資料中建立,則 DragDrop 事件處理方法就會在該表單上顯示此映像。因為 DragEventArgs.X 和 DragEventArgs.Y 值為螢幕座標,所以樣本使用 PointToClient 方法將它們轉換成工作區座標。
轉自:http://www.tzwhx.com/newOperate/html/1/12/122/16848.html
MSDN:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(VS.71).aspx