C#中 paint()與Onpaint()的區別

來源:互聯網
上載者:User

複製代碼 代碼如下:protected virtual OnPaint(PaintEventArgs e)
{
if(paint != null)
{
paint(this,e);
}
}

如果直接重寫onpaint,paint就會失效;這樣就不會失效:複製代碼 代碼如下:protected override OnPaint(PaintEventArgs e)
{
base.OnPaint(e); //自己的代碼
}

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

1.OnPaint方法是對一個控制項來說的;而Paint事件是對一個控制項對象來說的。它們中前者相當於是類的一個成員函數,而後者相當於是類的一個函數指標類型的變數(會因對象的不同而不同)。
2.OnPaint方法引發Paint事件,所以重寫OnPaint方法,一定要調用base.OnPaint,否則就不會引發Paint事件了。OnPaint原形應該類似以下形式(從中便可以看出):

複製代碼 代碼如下: protected virtual void OnPaint(PaintEventArgs e)
{
if (this.Paint != null)
{
this.Paint(this,e);
}
}

3.從執行個體中觀察二者調用順序複製代碼 代碼如下: private void Form1_Paint(object sender, PaintEventArgs e)
{
test t = new test();
t.AntiAlias = true;
t.SetColor(test.eShapeColor.Circle1FillColor, Color.DarkCyan);
e.Graphics.DrawImageUnscaled(t.Image, 10, 10);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);//引發Paint事件處理(處理該事件時候調用Form1_Paint方法)
..........
}

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

(二)那麼應分別在什麼情況下使用它們呢?
1.如果想對所有控制項都按照某種固定的方式顯示,如:自己寫控制項時,則需要修改重載控制項的OnPaint方法;而如果僅僅在某個環境下,對某個對象要做不同的顯示,則只需在其的Paint事件中做即可。

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

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

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

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.