我有一个简单的窗体,没有边框和几个标签控件(不需要单击)。我需要能够允许用户通过单击表单上的任意位置来移动表单,所以我发现了这个问题,并使用了在那里找到的以下代码。
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
,那么我可以按预期移动我的表单。但是,如果我单击标签控件本身,则消息是不同的,我无法分辨它是什么。
我发现这篇关于各种可能值的文章,WM_NCHITTEST
但似乎都不是我需要的。
我意识到我可以禁用我所有的标签控件,这将允许我单击“打开”它们,就好像它是表单本身一样,但我想知道是否有更好/不同的方法来做到这一点。
谢谢您的帮助!