当前位置:  编程技术>.net/c#/asp.net

C#中 paint()与Onpaint()的区别

    来源: 互联网  发布时间:2014-10-19

    本文导语:  代码如下:protected virtual OnPaint(PaintEventArgs e){ if(paint != null){ paint(this,e);}}如果直接重写onpaint,paint就会失效;这样就不会失效: 代码如下:protected override OnPaint(PaintEventArgs e){  base.OnPaint(e);  //自己的代码} (一)重绘时候经常会用到On...

代码如下:

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类是如何存储句柄时间并将其对应到每一个事件的。这种事件机制由于要检查事件句柄将造成更多的消耗。事件句柄列表中的每个方法都需要执行。相比重写虚方法,通过事件处理会消耗更多的时间。

此外,重写虚方法只需要维护一个函数就可以达到检查和修改的目的,代码更清晰。而事件机制需要两个维护点:事件句柄函数和事件绑定代码。其中任何一点都可能造成整体功能上的失败。一个函数显然要简单些。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.awt类container的类成员方法: paint定义及介绍
  • Java Applet的paint问题 在线
  • java命名空间java.awt类canvas的类成员方法: paint定义及介绍
  • paint () and Paintcomponent()
  • java命名空间java.awt.event类paintevent的类成员方法: paint定义及介绍
  • 关于paint方法的问题???请大家都看看
  • java命名空间javax.swing类cellrendererpane的类成员方法: paint定义及介绍
  • 在什么情况下重载paint()或paintComponent(),我不知道怎么办?
  • java命名空间javax.swing.text接口highlighter的类成员方法: paint定义及介绍
  • 求Applet中paint,repaint,update的联系和区别。
  • java命名空间javax.swing.text接口caret的类成员方法: paint定义及介绍
  • Graphics and paint(Graphics g) 问题????
  • java命名空间javax.swing.tree类defaulttreecelleditor.editorcontainer的类成员方法: paint定义及介绍
  • 画图工具 Gnome-paint
  • java命名空间javax.swing.text类glyphview的类成员方法: paint定义及介绍
  • 绘图程序 Tux Paint
  • java命名空间javax.swing.text类componentview的类成员方法: paint定义及介绍
  • 请教: 关于paint(Graphics g).
  • java命名空间javax.swing.text类glyphview.glyphpainter的类成员方法: paint定义及介绍
  • HTML5-Paint-Bucket-Tool
  • java命名空间javax.swing.plaf.basic类basictoolbarui.dragwindow的类成员方法: paint定义及介绍
  • 为什么用paint()时上次的东西不擦除


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3