C 中 paint 與Onpaint 的區別

2022-09-26 09:33:11 字數 1594 閱讀 6754

複製** **如下:

protected virtual onpaint(painteventar程式設計客棧gs e)

}如果直接重寫onpaint,p就會失效;這樣就不會失效:

複製** **如下:

protected override onpaint(painteventargs e)

(一)重繪時候經常會用到onpaint()和paint,它們有什麼區別呢?

1.onpaint方法是對乙個控制項來說的;而paint事件是對乙個控制項物件來說的。它們中前者相當於是類的乙個成員函式,而後者相當於是類的乙個函式指標型別的變數(會因物件的不同而不同)。   

2.onpaint方法引發paint事件,所以重寫onpaint方法,一定要呼叫base.onpaint,否則就不會引發paint事件了。onpaint原形應該類似以下形式(從中便可以看出):

複製** **如下:

protected virtual void onpaint(painteventargs e)

}3.從例項中觀察二者呼叫順序

複製** **如下:

private void form1_paint(object sender, painteventargs e)

protected override void onpaint(painteventargs e)

form1_paint()只是處理paint事件的方法,也可將它的四行**在onpaint方法中寫,此時可以不寫base.onpaint(e),即不引發事件處理,也可達到同樣的效果。

(二)那麼應分別在什麼情況下使用程式設計客棧它們呢?

1.如果想對所有控制項都按照某種固定的方式顯示,如:自己寫控制項時,則需要修改過載控制項的onpaint方法;而如果僅僅在某個環境下,對某個物件要做不同的顯示,則只需在其的paint事件中做即可。

2.在實現派生類的時候,遵循 c# 原則35:選擇重寫函式而不是使用事件控制代碼。

許多.net類庫中的類都提供了兩種不同的處理事件控制代碼的方法。既可以為其新增事件,也可以重寫其基類的事件抽象方法。在實現派生類的時候,更好的選擇是重寫基類中的抽象方法。

因為這樣,一旦事件控制代碼丟擲異常,不會再有其他的事件控制代碼被呼叫。這避免了一些錯誤**繼續被呼叫而引發的問題。通過重寫受保護的虛方法,我們的控制代碼可以 第乙個被呼叫。基類中虛函式負責其他相關控制代碼的呼叫。這意味著如果需要呼叫那些事件控制代碼(一般來說是需要的),就要呼叫基類的虛函式。在有些特殊情況下我 們需要替換基類的預設行為,可能不需要呼叫任何原有的事件控制代碼。雖然我們不能保證所有的事件控制代碼都被執行,因為其可能會丟擲異常,但是我們可以保證派生類 的行為是正hkgwb確的。

使用override比新增事件控制代碼高效的多。在 條款 22中展示了system.windows.forms.control類是如何儲存控制代碼時間並將其對應到每乙個事件的。這種事件機制由於要檢查事件控制代碼將造成更多的消耗。事件控制代碼列表中的每個方法都需要執行。相比重寫虛方法,通過事件處理會消耗更多的時間。

此外,重寫虛方法只需要維護乙個函式就可以達到檢查和修改的目的,**更清晰。而事件機制需要兩個維護點:事件控制代碼函式和事件繫結**。其中任何一點都可能造成整體功能上的失敗。乙個函式顯然要簡單些。

本文標題: c#中 paint()與onpaint()的區別

本文位址:

關於Onpaint和Paint的區別

關於onpaint和paint的區別 2011 年3月22日 14 23 44 paint事件 onpaint方法 onpaint 方法是呼叫 paint 事件的,用哪乙個 效果是一樣 就看那乙個方便了 內 實現的 protected virtual onpaint painteventargs e...

MFC中 OnPaint()與OnDraw的區別

onpaint 與ondraw的區別 1 invalidate 和invalidaterect 其實是觸發對onpaint 函式的呼叫,onpaint 函式呼叫ondraw 函式,ondraw函式還需要同時支援印表機輸出。onpaint 函式和onprint 函式都要呼叫ondraw 於是同樣的繪圖...

OnPaint()與OnDraw的區別

onpaint 與ondraw的區別 1 invalidate 和invalidaterect 其實是觸發對onpaint 函式的呼叫,onpaint 函式呼叫ondraw 函式,ondraw函式還需要同時支援印表機輸出。onpaint 函式和onprint 函式都要呼叫ondraw 於是同樣的繪圖...