a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2020-01-24 03:24:32
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

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類是如何存儲句柄時間并將其對應到每一個事件的。這種事件機制由于要檢查事件句柄將造成更多的消耗。事件句柄列表中的每個方法都需要執行。相比重寫虛方法,通過事件處理會消耗更多的時間。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av大片在线观看 | 亚洲欧美v国产一区二区 | 黄色免费网站在线看 | 中文一区二区 | 亚洲最黄视频 | 人人干人人爱 | 色婷婷小说 | 天天摸天天操 | 国产在线导航 | 日本三级网址 | 在线第一页 | 精品亚洲一区二区三区 | 在线播放亚洲 | 男人操女人bb视频 | 日韩毛片在线免费观看 | 亚洲第1页 | 国产精品夜夜春夜夜爽久久电影 | 免费观看a视频 | 九色91在线| 国产精品成av人在线视午夜片 | 日日骚| 成人免费视频观看视频 | 日本免费三片免费观看 | 中文天堂av | 国产日韩精品视频 | 欧美一区二区三区在线播放 | 欧美涩涩网 | 午夜在线观看视频网站 | 91精品视频在线播放 | 国产精品一区二区三区在线 | 日韩av一区二区三区在线观看 | 欧美日韩成人影院 | 成人午夜电影在线 | 在线看国产 | 青青草国产成人av片免费 | 欧美激情视频免费观看 | 91精品国产欧美一区二区成人 | 色欧美片视频在线观看 | 日本在线观看不卡 | 九九热这里 | 国产91九色一区二区三区 |