如题
举个例子,继承 Form 的 MyForm.Click 事件,实现有两种方式1、重写 MyForm.OnClick 虚函数
2、实现 MyForm.Click 事件问在Form的内部 是怎么将 OnClick 虚函数与 Click 事件挂钩的呢?
如果是 Click,那么在 Form 父类内部中可以
if(Click!=null)//举个例子
{
    Click(obj,null);
}
来实现外界挂钩的委托。
但是OnClick虚函数在内部怎么调用执行的呢?

解决方案 »

  1.   

    是消息与事件挂钩吧,类似这种:
    protected override void WndProc(ref Message m)
            {
               
                if (m.Msg == WM_xx)
                    this.OnClick(EventArgs.Empty);
                base.WndProc(ref m);
            }
      

  2.   


    这个我知道,你说的是事件消息驱动机制。但是像你刚刚那种说法就得protected override void WndProc(ref Message m)
            {
               
                if (m.Msg == WM_xx)
                    this.OnClick(EventArgs.Empty);//虚函数好像不能直接调用
                if(m.Msg==Wm_xx)
                    if(this.Click!=null&&this.OnClick没有调用)//我用了点伪代码来表达我的意思
                        this.Click(obj,null);
                base.WndProc(ref m);
            }这样的话
    1是虚函数不能直接调用的问题
    2是这样判断了两次,会有性能上的丢失
      

  3.   

    我想问的是,Form内部是如何调用子类重写的OnClick的
      

  4.   

    void override OnClick(EventArgs e)
    {
    if(Click!=null)//举个例子
    {
      Click(obj,null);
      base.OnClick(e);
    }}
    在OnClick中,肯定得这样写.
      

  5.   

    肯定有性能损失,但必须要这样做.因为Click确实是允许为空的