如何将事件从操作系统转换为应用程序?

时间:2014-08-23 19:55:59

标签: c# events delegates

假设我有一个像这样的按钮类:

class SpecicalButton : Button
{
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);

    }

}

重写方法将通过调用Click委托来通知所有侦听器。

但我的问题是,如何调用OnClick方法?肯定需要对按钮尺寸以及点击是否在其范围内进行某种类型的检查。

1 个答案:

答案 0 :(得分:1)

嗯,鉴于事件most Windows Forms controls are native Windows controls,他们都会通过described in the link posted进行消息处理(评论中为Control.WndProc)。

当一个Window消息被发布到每个控件的消息队列时(通过主窗口的WndProc,它是所有消息的入口点),它由它的窗口proc处理。如果查看Control.WndProc的源代码,您将看到许多Windows消息由私有Wm*方法处理。反过来,这些通过调用OnSomethingHappened(实际上调用该特定事件的事件处理程序)将每个本机消息转换为托管事件。

现在,按钮是本机控件,它们有自己的WndProc覆盖。如果您查看ButtonBase source code in referencesource,您会在WndProc中看到这一点:

case NativeMethods.BM_CLICK:
    if (this is IButtonControl) {
        ((IButtonControl)this).PerformClick();
    }
    else {
        OnClick(EventArgs.Empty);
    }
    return;

这会将您带到调用事件处理程序的Control.OnClick

无论如何,要回答你的问题......在创建消息并将其发布到窗口之前,先进行测试。消息队列。