假设我有一个像这样的按钮类:
class SpecicalButton : Button
{
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
}
}
重写方法将通过调用Click
委托来通知所有侦听器。
但我的问题是,如何调用OnClick
方法?肯定需要对按钮尺寸以及点击是否在其范围内进行某种类型的检查。
答案 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
。
无论如何,要回答你的问题......在创建消息并将其发布到窗口之前,先进行测试。消息队列。