如果只是使用该事件,不需要调用OnPaint()函数。
如果是派生了一个窗体类,需要修改OnPaint()函数,那要重写,并调用base.OnPaint();因为在C#中,委托不能被继承,如果要在子类中触发父类所定义的事件,Mircrosoft建议的方法就是在父类中写一个OnEvent()函数,函数中触发事件,并在子类中重写该函数,并调用base.OnEvent();
消息这个概念很广,在OO中,消息就是指类间调用。而在windows中,具体定义我也记不清了,例如鼠标和键盘会产生消息,应用程序也会产生消息。
事件是由对象发出的消息,通知重要事情的发生。事件是使用委托来实现的

解决方案 »

  1.   

    那有谁来调用子类的OnEvent()函数呢?难道一有事件就会调用的?
      

  2.   

    比如 要触发基类的Paint事件,在子类重写OnPaint函数,用OnPaint函数触发Paint事件,那有谁来调用OnPaint函数呢?
      

  3.   

    纠正一点:不是一有事件就会调用OnEvent(),而是调用OnEvent()就会产生事件。由有能力触发该事件的类来调用,例如Form。
    举个例来说吧:
    有一个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的子类也能触发该事件,这点在前面已经说过了。
    客户对象需要做的就是注册该事件,并添加自己的处理代码。
      

  4.   

    我要问的是如果你移动一个窗口或改变窗口的大小不是会引发Paint事件,那这Paint事件难道是由OnPaint函数来引发的,那又由谁来调用这OnPaint函数呢?顺便问一句,上面客户对象怎么注册该事件?
      

  5.   

    如果不是,那为什么每次改变窗口大小都先调入OnPaint函数中??
      

  6.   

    不好意思,我看错了,是会调Paint()函数。
    还是问你怎样注册事件
      

  7.   

    windows中的kernel32.dll,gui32.dll和user32.dll这三个中心体管理消息。消息是由操作系统来发送到程序的。比如当你操作鼠标或键盘时,会产生相应的消息,操作系统在对消息进行一定的处理之后,将消息发给应用程序,由应用程序处理。
      

  8.   

    我没看错,每次改变窗口大小是都先调用OnPaint()函数,那OnPaint不就成了事件处理函数,而不是事件引发函数。
      

  9.   

    zengch24(zFin)呢,进来再讨论一下
      

  10.   

    经过一晚上的苦思冥想,得出下面的结论,一般的窗体控件,改变大小时先调用OnPaint函数,再由OnPaint函数触发Paint消息。
      

  11.   

    Bingo,不过是需要重绘时触发Paint事件。
    可以做个实验,你向一个Form添加一个Paint事件,然后在事件处理函数中添加
    MessageBox.Show("Paint event occupied");
    试着改变窗体大小看看有什么结果。
    在添加一个Button,为Button添加事件处理函数:
    this.OnPaint(null);