引用:出處
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