如果只是使用该事件,不需要调用OnPaint()函数。
如果是派生了一个窗体类,需要修改OnPaint()函数,那要重写,并调用base.OnPaint();因为在C#中,委托不能被继承,如果要在子类中触发父类所定义的事件,Mircrosoft建议的方法就是在父类中写一个OnEvent()函数,函数中触发事件,并在子类中重写该函数,并调用base.OnEvent();
消息这个概念很广,在OO中,消息就是指类间调用。而在windows中,具体定义我也记不清了,例如鼠标和键盘会产生消息,应用程序也会产生消息。
事件是由对象发出的消息,通知重要事情的发生。事件是使用委托来实现的
如果是派生了一个窗体类,需要修改OnPaint()函数,那要重写,并调用base.OnPaint();因为在C#中,委托不能被继承,如果要在子类中触发父类所定义的事件,Mircrosoft建议的方法就是在父类中写一个OnEvent()函数,函数中触发事件,并在子类中重写该函数,并调用base.OnEvent();
消息这个概念很广,在OO中,消息就是指类间调用。而在windows中,具体定义我也记不清了,例如鼠标和键盘会产生消息,应用程序也会产生消息。
事件是由对象发出的消息,通知重要事情的发生。事件是使用委托来实现的
举个例来说吧:
有一个MySocket类来接收数据,当数据接收完成之后,应当通知使用该Socket的客户对象(Client)来处理这些数据,怎么做呢。在Socket声明一个委托
delegate void RcvEventHandle(EventArgs args);
和一个事件
public event RcvEventHandle RcvEvent;
然后添加一个函数OnRcvEvent():
protected virtual void OnRcvEvent()/*应当让子类可以重写该函数*/
{
RcvEvent(args);
}
当MySocket收完数据之后:便可以调用OnRcvEvent()来触发该事件,以通知使用它的客户对象。注意是由MySocket触发该事件,而不是Client。MySocket也可以直接调用 RcvEvent(args);来触发事件,提供OnRcvEvent()函数来触发,是为了让MySocket的子类也能触发该事件,这点在前面已经说过了。
客户对象需要做的就是注册该事件,并添加自己的处理代码。
还是问你怎样注册事件
可以做个实验,你向一个Form添加一个Paint事件,然后在事件处理函数中添加
MessageBox.Show("Paint event occupied");
试着改变窗体大小看看有什么结果。
在添加一个Button,为Button添加事件处理函数:
this.OnPaint(null);