c#onpaint_c#自绘控件中的onpaint方法是如何调用的 - CSDN
精华内容
参与话题
  • C#重绘OnPaint()事件调用机制

    千次阅读 2017-11-03 17:03:14
    OnPaint() Invalidate() 一个控件应该什么时候绘制主要有两个 : 一个是 系统来确定 这个控件需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_PAINT 消息来告知控件 你需要重绘了 另一个就是 人为的调用this....

    与绘制有关的函数

    • Paint()
    • OnPaint()
    • Invalidate()

    前两个函数的执行顺序,如果在OnPaint()中有base.OnPaint(e)函数,就相当于执行外部的Paint()函数。
    Invalidate()运行后,会通知系统要重绘控件,但是不是立即重绘,而是运行完所有程序之后再重绘。

    一个控件应该什么时候绘制主要有两个 :

    • 一个是 系统来确定 这个控件需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_PAINT 消息来告知控件 你需要重绘了
    • 另一个就是 人为的调用this.Invalidate()或者this.Invalidate(Rectangle)来自己触发一次重绘
      [引用]

    对于第一种 那是系统自身的一种行为 不管你是什么控件系统自带的还是自己写的 对于一些操作必然是要重绘界面的 比如最小化后 在最大化 控件隐藏后 在显示 得到焦点 失去焦点 之类的 这种是必然要重绘的

    实例

    • 目标:控件改动一个属性后希望重新绘制控件达到刷新的效果。

    修改版半径后在设计器中显示出来:

    public int Radius
            {
                get { return _radius; }
                set
                {
                    _radius = value;
                    this.Invalidate();
                }
            }

    选中后刷新显示:

     public bool IsSelected
            {
                get { return this._isSelected; }
                set
                {
                    this._isSelected = value;
                    this.Invalidate();
                }
            }
    展开全文
  • C# 图形显示Onpaint

    千次阅读 2018-01-19 11:52:35
    C#里面有一个Onpaint本来我以为是每一段时间刷新一次,但是不是的,这个事件好像只有界面重写的时候才会调用这个事件,所以需要修改显示的图像信息,通过这个事件就不能直接修改显示信息,必须触发重写事件才能刷新...

    C#里面有一个Onpaint本来我以为是每一段时间刷新一次,但是不是的,这个事件好像只有界面重写的时候才会调用这个事件,所以需要修改显示的图像信息,通过这个事件就不能直接修改显示信息,必须触发重写事件才能刷新我要显示的图像。

    1、对Paint事件编程,首先根据Paint事件参数获取无效区域,然后在无效区域中按要求绘制就可以了。
    无效区域是整个图形的一个部分,一般来说不可能对整个图形进行绘制,而是绘制其中的一部分,当前绘制的这个部分就被设置成无效区域,告诉C#当前的绘图区域,也就是局部绘制的意思啦。这样做的好处是提高图形运算的效率,像大图在视窗中的滚动、拖放就应用到了局部绘制技术的例子。
    
    protected override void OnPaint(PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                Rectangle myRec;
                if (Height > Width * Proportion)
                {
                    myRec = new Rectangle(0, 0, (int)(Width * Proportion),Width); //指定显示区域的位置的大小
                }
                else if(Height < Width * Proportion)
                {
                    myRec = new Rectangle(0, 0,Height, (int)(Height/Proportion)); //指定显示区域的位置的大小
                }
                else
                {
                    myRec = new Rectangle(0, 0,Height, Width); //指定显示区域的位置的大小
                }
                g.DrawImage(bmp, myRec);
            }

    通过设置myRec区域可以达到局部绘制的能力,缺点就是图像没有实时的更新回来。

    开头所说的问题不能实时更新图像,可以检测操作完成之后使用

    this.Refresh(); 刷新界面

    就可以调用Onpaint事件对图像重新绘制。


    展开全文
  • C#中 paint()与Onpaint()的区别

    千次阅读 2018-04-16 08:13:51
    Paint()和OnPaint()事件是用来重绘一:二者区别1.OnPaint方法是对一个控件来说的;而Paint事件是对一个控件对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于是类的一个函数指针类型的变量(会因对象的...

    Paint()和OnPaint()事件是用来重绘

    一:二者区别

    1.OnPaint方法是对一个控件来说的;而Paint事件是对一个控件对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于是类的一个函数指针类型的变量(会因对象的不同而不同)。    

    2.OnPaint方法引发Paint事件,所以重写OnPaint方法,一定要调用base.OnPaint,否则就不会引发Paint事件了。OnPaint原形应该类似以下形式(从中便可以看出):

    二:使用场景

    1.如果想对所有控件都按照某种固定的方式显示,如:自己写控件时,则需要修改重载控件的OnPaint方法;而如果仅仅在某个环境下,对某个对象要做不同的显示,则只需在其的Paint事件中做即可。

    2.在实现派生类的时候,遵循 C# 原则35:选择重写函数而不是使用事件句柄。

    许多.net类库中的类都提供了两种不同的处理事件句柄的方法。既可以为其添加事件,也可以重写其基类的事件抽象方法。在实现派生类的时候,更好的选择是重写基类中的抽象方法。

    因为这样,一旦事件句柄抛出异常,不会再有其他的事件句柄被调用。这避免了一些错误代码继续被调用而引发的问题。通过重写受保护的虚方法,我们的句柄可以 第一个被调用。基类中虚函数负责其他相关句柄的调用。这意味着如果需要调用那些事件句柄(一般来说是需要的),就要调用基类的虚函数。在有些特殊情况下我 们需要替换基类的默认行为,可能不需要调用任何原有的事件句柄。虽然我们不能保证所有的事件句柄都被执行,因为其可能会抛出异常,但是我们可以保证派生类 的行为是正确的。

    使用override比添加事件句柄高效的多。在 条款 22中展示了System.Windows.Forms.Control类是如何存储句柄时间并将其对应到每一个事件的。这种事件机制由于要检查事件句柄将造成更多的消耗。事件句柄列表中的每个方法都需要执行。相比重写虚方法,通过事件处理会消耗更多的时间。

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


    展开全文
  • c# 如何重写控件的OnPaint事件

    万次阅读 2008-11-26 11:57:00
    使用OnPaint事件可以随时绘制图形 调用窗体的OnPaint事件protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e); //绘图} 但是如何重写控件的OnPaint事件呢?比如说绘图是在PictureBox中绘制的,...

    使用OnPaint事件可以随时绘制图形

     

    调用窗体的OnPaint事件

    protected override void OnPaint(PaintEventArgs e)

    {

        base.OnPaint(e);
        //绘图

    }

     

    但是如何重写控件的OnPaint事件呢?比如说绘图是在PictureBox中绘制的,那么如何重写PictureBox的OnPaint事件?

     

    我们无法直接在窗体的代码中重写控件的OnPaint事件,只能重写窗体的OnPaint事件。

     

    重写控件的OnPaint事件,必须创建一个新的控件。这个控件继承Windows的控件,然后在创建的控件中重写控件的OnPaint事件。

     

    以PictureBox为例:

     

    //定义一个新的控件,继承PictureBox控件

     public class myPictureBox : PictureBox
        {

            //自定义控件的构造函数
            public myPictureBox()

            {

             }

            //重写控件的OnPaint属性

            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);

                //绘图
              }

        }

     

    使用这种方法,就可以重写任何一个控件的OnPaint事件了。 

    展开全文
  • winform中控件的绘制都是通过OnPaint它来完成的。因为OnPaint是Protected的,所以,它必然是在本类、子类中被调用的。根据控件的继承结构,最后知道在System.Windows.Forms.Control中应该有一个逻辑调用OnPaint。 ...
  • OnPaint不停刷新的问题

    千次阅读 2009-12-04 20:44:00
    自定义控件响应WM_PAINT消息,在OnPaint中,默认有CPaintDC dc(this); 如果注释掉CPaintDC dc(this);则程序不停地刷新(计数器不停地飞涨!!),可是如果保留CPaintDC dc(this);,如下: void COpenGLControl::...
  • //Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;...nam
  • C# Picturebox 刷新 Refresh()图像一闪而过 问题描述: 重载OnPaint函数 在OnPaint函数中使用了  Graphics gra = this.pictureBox1.CreateGraphics(); 重新创建了Graphics导致图像一闪而过。 改为e.Graphics...
  • C# OnPaint

    千次阅读 2017-02-28 11:51:32
    要让窗体在载入的时候就显示图像必须重写OnPaint方法 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System...
  • 我从CEdit类派生了一个子类CMyEidt,然后在CMyEidt::中绘图,并使用了Invalidate()来使编辑框进行重绘。但却导致CPU的占用率很高,并且,如何没有采用双缓冲机制,图片还会不停的闪烁。如下图 ...
  • 自己继承的控件,OnPaint无效问题 需要在构造函数内 SetStyle(ControlStyles.UserPaint, true);  
  • 我编写的是Windows应用程序用 OnPaint 进行实时绘图的protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e); Graphics dc = e.Graphics; //以下是绘图内容}由于每秒需要重绘一次图片,所以出现...
  • C#-创建圆形/椭圆形按钮

    千次阅读 2018-02-25 23:03:00
    创建圆形按钮挺简单的。public class EllipseButton : Button ... protected override void OnPaint(PaintEventArgs pevent) { GraphicsPath gPath = new GraphicsPath(); // 绘制椭圆形区域 gPath.AddE...
  • Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protected virtual OnPaint(PaintEventArgs e) { ...
  • .NET C# OnPaint 重绘

    2014-05-23 14:44:51
    调用窗体的OnPaint事件 protected override void OnPaint(PaintEventArgs e) {  base.OnPaint(e);  //绘图 }   但是如何重写控件的OnPaint事件呢?比如说绘图是在PictureBox中绘制的,那么...
  • 转载: .NET C# OnPaint 重绘

    千次阅读 2014-05-23 20:17:14
    C# OnPaint 重绘 分类: .NET2014-05-23 14:44 6人阅读 评论(0) 收藏 举报 .NETC#OnPaint重绘 调用窗体的OnPaint事件 protected override void OnPaint(PaintEventArgs e) {  base.OnPaint(e);...
  • 在使用C#进行界面开发的过程中,做界面开发经常会用到按钮,而C#界面中的按钮形状只有矩形的,而如果我们需要其他形状的按钮的话,就需要想点儿其他办法了,一般开发自己的控件有三种方法: 首先是复合控件,从字面...
  • C#)贝塞尔曲线画水滴

    千次阅读 2017-06-08 20:00:16
    protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; Point p1 = new Point(50, 200); Point p2 = new Poi
  • Invalidate之后无法OnPaint

    千次阅读 2013-06-27 15:00:41
    当时,开辟了一个线程用作刷新,但是每次执行到Flush最后的一句InvaliDate之后,始终没有进入OnPaint。后来,终于找到原因,是因为InvaliDate函数虽然提交了销毁了窗口的,提交重绘的消息,但是由于这个消息等级很低...
  • 控件的形状可以通过Region属性来改变,用GraphicsPath来闭合一个特殊形状,然后传给Region属性就可以了。 通过GraphicsPath绘制的图形好像不能去掉锯齿,我写了抗锯齿但是没有效果。 控件的属性可以用 ...
1 2 3 4 5 ... 20
收藏数 3,629
精华内容 1,451
关键字:

c#onpaint