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;//事件的声明
他是重写了这个受保护的虚拟方法吗?他是在哪被触发而运行的呢?
好像有点乱,呵呵
www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
MSDN对OnPatint 的解释就是:Raises the
Paint
event.
其实这个OnPaint 是这么被调用的:
1) 要知道,在.NET 下面就是微软的Window32, 对于窗体、消息这一整套东西实际上都是一样的,只不过.NET 在Win32上包了一层。
2) 窗体的绘制、重绘时机是由操作系统发送WM_PAINT 消息通知的,窗体收到WM_PAINT 消息经过处理被.NET 转换为OnPaint 函数的调用
3) OnPaint 函数被设置为保护的、可重载的。其实从面向对象的角度来看父类的虚函数(即可重载的)都可以被认为是父类留给子类的接口,子类可通过重载父类的虚函数实现自己的功能,改变父类定义的行为。
基于以上我们可以这样理解使用OnPaint 函数:
1) 当控件的容器,比如Form类、Panel类等,需要改变子类控件的显示样式时,可保留该类的OnPaint 函数让其触发Paint 事件,在事件响应函数中做处理
2) 如果我们想创建一个自定义控件(Custom Control)时,应继承于某个控件类,并override 父类的OnPaint 函数,在子类的重载函数中实现控件的绘制,
MSDN对OnPatint 的解释就是:Raises the
Paint
event.
其实这个OnPaint 是这么被调用的:
1) 要知道,在.NET 下面就是微软的Window32, 对于窗体、消息这一整套东西实际上都是一样的,只不过.NET 在Win32上包了一层。
2) 窗体的绘制、重绘时机是由操作系统发送WM_PAINT 消息通知的,窗体收到WM_PAINT 消息经过处理被.NET 转换为OnPaint 函数的调用
3) OnPaint 函数被设置为保护的、可重载的。其实从面向对象的角度来看父类的虚函数(即可重载的)都可以被认为是父类留给子类的接口,子类可通过重载父类的虚函数实现自己的功能,改变父类定义的行为。
基于以上我们可以这样理解使用OnPaint 函数:
1) 当控件的容器,比如Form类、Panel类等,需要改变子类控件的显示样式时,可保留该类的OnPaint 函数让其触发Paint 事件,在事件响应函数中做处理
2) 如果我们想创建一个自定义控件(Custom Control)时,应继承于某个控件类,并override 父类的OnPaint 函数,在子类的重载函数中实现控件的绘制,