我有一个简单的窗口窗体,没有边框和几个标签控件(不需要单击任何内容)。我需要能够允许用户通过单击表单上的任意位置来移动表单,所以我发现this问题,并使用了在那里找到的以下代码。
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
protected override void WndProc(ref Message m)
{
switch (m.Msg) {
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT) {
m.Result = (IntPtr)HTCAPTION;
return;
} else {
return;
}
break;
}
base.WndProc(ref m);
}
在某种程度上,这很有效。如果我单击表单本身的任意位置(背景),WM_NCHITTEST
is HTCLIENT
,这样我就可以按预期移动我的表单。但是,如果我单击标签控件本身,则消息会有所不同,并且我无法分辨它是什么。
I found 本文关于各种可能的值WM_NCHITTEST
但它们似乎都不是我所需要的。
我意识到我可以禁用所有标签控件,这将允许我单击“它们”,就好像它是表单本身一样,但我想知道是否有更好/不同的方法来做到这一点。
谢谢您的帮助!
你正在覆盖WndProc
对于表单,但是当光标位于标签上时WM_NCHITTEST
消息被发送到标签。
您可以创建自己的标签控件,派生自Label
并覆盖它的WndProc
。这应该总是返回HTTRANSPARENT
回应WM_NCHITTEST
。就像是:
private const int HTTRANSPARENT = -1;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
m.Result = (IntPtr)HTTRANSPARENT;
return;
}
base.WndProc(ref m);
}
另请注意,您的程序中有一个小错误WndProc
。如果消息是WM_NCHITTEST
但该地区不是HTCLIENT
然后你调用基类两次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)