protected override void OnPaint(PaintEventArgs e)在何时运行?
 我下载了一些源码,看到有人在窗体代码里有:
 protected override void OnPaint(PaintEventArgs e)
 {
     Graphics g = e.Graphics;
    ..........
 }
这样的写法,来在窗体上边画一些图案。
查到Form里有:
        protected override void OnPaint(PaintEventArgs e);
        //
        //
        // 参数:
        //   e:
        //     包含事件数据的 System.EventArgs。
        [EditorBrowsable(EditorBrowsableState.Advanced)] 开始搞不清她是方法,还是事件?(即如果是方法,不知道她是何时被调用的?)  后来回忆起,老师讲C#语言规范时,拿事件event举例:写事件的发行者时触发事件要 提供一个受保护的虚拟方法,来触发事件,即按老师说的上边Form里
应该是这样的:
        protected override void OnPaint(PaintEventArgs e);
        {
            PaintEventHandler handler = paint;
            //声明一个临时的委托,防止可能的线程同步
            if (handler != null)
            {
                handler(this, e);
            }
        }
          
    public delegate void PaintEventHandler (object sender,PubEventArgs e);//声明所需代理
    public event PaintEventHandler paint;//事件的声明
 他是重写了这个受保护的虚拟方法吗?他是在哪被触发而运行的呢?
                       好像有点乱,呵呵

解决方案 »

  1.   


    System.Windows.Forms.Control 的 OnPaint 实现[EditorBrowsable(EditorBrowsableState.Advanced)]
    protected virtual void OnPaint(PaintEventArgs e)
    {
        PaintEventHandler handler = (PaintEventHandler) base.Events[EventPaint];
        if (handler != null)
        {
            handler(this, e);
        }
    }
      

  2.   


    OnPaint用于在窗体区域失效时重新绘制。一个简单的例子就是窗口拖动到屏幕外会使部分区域失效。
    如果窗口再被拖回到屏幕,会发现窗口中该有的东西并未丢失。这就是OnPaint在大显身手了。
    实际上,在被拖到屏幕以外的过程中,OnPaint仍在起作用,只是有些部分被屏幕裁剪了。OnPaint会在任何窗体区域需要重绘的时候运行! 例如最大化、拖动
      

  3.   

    windows 是基于消息(Message)的, 绘制消息是 WM_PAINTwinform 是基于事件的, 绘制事件是 Paint,消息到事件的转换是在控件类的 WndProc 函数中完成的.
      

  4.   

    OnPaint会在任何窗体区域需要重绘的时候运行