最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年04月27日 14:54:12   作者:  
paint是事件onpaint方法onpaint方法是調用paint事件的,用哪一個,效果是一樣,就看那一個方便了內部是這樣實現(xiàn)的:

復制代碼 代碼如下:

protected virtual OnPaint(PaintEventArgs e)
{
if(paint != null)
{
paint(this,e);
}
}

如果直接重寫onpaint,paint就會失效;這樣就不會失效:
復制代碼 代碼如下:

protected override OnPaint(PaintEventArgs e)

base.OnPaint(e);  //自己的代碼
}

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

1.OnPaint方法是對一個控件來說的;而Paint事件是對一個控件對象來說的。它們中前者相當于是類的一個成員函數(shù),而后者相當于是類的一個函數(shù)指針類型的變量(會因對象的不同而不同)。   
2.OnPaint方法引發(fā)Paint事件,所以重寫OnPaint方法,一定要調用base.OnPaint,否則就不會引發(fā)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);//引發(fā)Paint事件處理(處理該事件時候調用Form1_Paint方法)
            ..........
        }

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

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

2.在實現(xiàn)派生類的時候,遵循 C# 原則35:選擇重寫函數(shù)而不是使用事件句柄。

許多.net類庫中的類都提供了兩種不同的處理事件句柄的方法。既可以為其添加事件,也可以重寫其基類的事件抽象方法。在實現(xiàn)派生類的時候,更好的選擇是重寫基類中的抽象方法。

因為這樣,一旦事件句柄拋出異常,不會再有其他的事件句柄被調用。這避免了一些錯誤代碼繼續(xù)被調用而引發(fā)的問題。通過重寫受保護的虛方法,我們的句柄可以 第一個被調用?;愔刑摵瘮?shù)負責其他相關句柄的調用。這意味著如果需要調用那些事件句柄(一般來說是需要的),就要調用基類的虛函數(shù)。在有些特殊情況下我 們需要替換基類的默認行為,可能不需要調用任何原有的事件句柄。雖然我們不能保證所有的事件句柄都被執(zhí)行,因為其可能會拋出異常,但是我們可以保證派生類 的行為是正確的。

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

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

相關文章

  • C# 獲取某個時間的0點0分和23點59分59秒

    C# 獲取某個時間的0點0分和23點59分59秒

    這篇文章主要介紹了C# 獲取某個時間的0點0分和23點59分59秒,文中給大家提到了java 獲取某一日期的0點0分0秒和23點59分59秒,需要的朋友可以參考下
    2019-09-09
  • C#動態(tài)查詢之巧用Expression組合多條件表達式的方法和步驟

    C#動態(tài)查詢之巧用Expression組合多條件表達式的方法和步驟

    在C#中,可以使用AndAlso和OrElse方法組合兩個Expression<Func<T, bool>>類型的表達式,下面通過實例代碼給大家分享C#動態(tài)查詢之巧用Expression組合多條件表達式,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C#控件Picturebox實現(xiàn)鼠標拖拽功能

    C#控件Picturebox實現(xiàn)鼠標拖拽功能

    這篇文章主要為大家詳細介紹了C#控件Picturebox實現(xiàn)鼠標拖拽功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#使用標簽軟件Bartender打印標簽模板

    C#使用標簽軟件Bartender打印標簽模板

    這篇文章介紹了C#使用標簽軟件Bartender打印標簽模板,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • C#排序算法之歸并排序

    C#排序算法之歸并排序

    這篇文章主要為大家詳細介紹了C#排序算法之歸并排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 關于C#中async/await的用法實例詳解

    關于C#中async/await的用法實例詳解

    這篇文章主要介紹了關于C#中async/await的用法,今天寫一個demo徹底搞明白async/await的用法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • C#實現(xiàn)QQ郵箱發(fā)送郵件

    C#實現(xiàn)QQ郵箱發(fā)送郵件

    今天小編就為大家分享一篇關于C#實現(xiàn)QQ郵箱發(fā)送郵件,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C#?壓榨cpu的辦法(推薦)

    C#?壓榨cpu的辦法(推薦)

    這篇文章主要介紹了C#?壓榨cpu的辦法,通過修改num的值,觀察cpu的核數(shù),例如我電腦是8核的,改成8,運行時各個核都能跑滿,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • WCF入門教程之Windows通訊接口

    WCF入門教程之Windows通訊接口

    這篇文章介紹了WCF入門教程之Windows通訊接口,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#組合模式實例詳解

    C#組合模式實例詳解

    這篇文章主要介紹了C#組合模式,實例分析了C#實現(xiàn)組合模式的原理與相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

深泽县| 武宁县| 新蔡县| 新兴县| 措美县| 阳东县| 江阴市| 海门市| 临清市| 吴堡县| 唐河县| 佛坪县| 绩溪县| 临漳县| 修水县| 永新县| 登封市| 疏勒县| 宣城市| 加查县| 荃湾区| 长兴县| 达州市| 广南县| 凤翔县| 赤城县| 莎车县| 安西县| 黎川县| 碌曲县| 临夏市| 札达县| 云龙县| 民勤县| 深水埗区| 玛纳斯县| 江都市| 温宿县| 鄯善县| 黔南| 稷山县|