【发布时间】:2015-05-27 05:12:16
【问题描述】:
我正在.NET Windows 窗体中编写自定义控件。考虑以下代码:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case WM_LBUTTONDOWN: // Yes, it's defined correctly.
MessageBox.Show("Left Button Down");
break;
}
}
它在运行时工作,但我需要它在设计器中工作。我怎样才能做到这一点?
注意:
我猜有人可能会说“您无法检测设计器中的点击,因为设计界面会捕获它们并将它们作为设计过程的一部分进行处理”
...以TabControl 为例。添加新选项卡时,您可以单击以浏览选项卡,然后单击选项卡的可设计区域开始设计选项卡页面的内容。它是如何工作的?
【问题讨论】:
-
我可能在这里遗漏了一些东西,但它是如何工作的?当您查看设计器时,您的程序没有运行。
-
@Octopoid - 即使在设计模式下,您的代码仍然可以运行 - 某些消息允许通过 WndProc 循环,但根据我的评论,我认为点击在到达控件本身之前就已处理。 (见更新)
-
很公平,我并没有真正使用设计器 - 在处理完事件后将
base.WndProc(ref m);移动到方法的末尾会发生什么? -
@Octopoid - 没什么,同样的问题。
-
嗯,我希望基本方法只是将消息重置为无。我刚刚发现了这个:
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)- 不会立即提供帮助,但我想知道这是否是实现自定义设计器功能的难题的一部分。我经常想知道TabControl等是如何做到的..
标签: c# .net winforms wndproc windows-messages