我正在尝试制作一个可以从工具栏中弹出的无边框表单。我希望用户能够在右下角(即“调整大小手柄”)抓取并调整表单大小,但不能以其他任何方式调整或重新定位表单。
我听说可以拦截发送到表单的 WM_NCHITTEST
消息,并将其结果设置为 HTBOTTOMRIGHT
,这样操作系统就会处理表单的重新调整大小,就像它有一个可调整大小的框架一样。我的想法是检测鼠标指针是否进入了我在角落里定义的一个框,并在确实如此时返回 HTBOTTOMRIGHT
结果。
这不像我预期的那样工作。我能够拦截消息,但似乎只有当用户将鼠标光标放在表单的 1 像素厚边框上时才发送该消息。也就是说,如果您在底部右侧精确地定位光标,则它就按照我想要的方式工作。
以下是我的 WndProc
覆盖:
protected override void WndProc(ref Message m)
{
const UInt32 WM_NCHITTEST = 0x0084;
const UInt32 HTBOTTOMRIGHT = 17;
const int RESIZE_HANDLE_SIZE = 40;
bool handled = false;
if (m.Msg == WM_NCHITTEST)
{
Size formSize = this.Size;
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);
Rectangle hitBox = new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE);
if (hitBox.Contains(clientPoint))
{
m.Result = (IntPtr)HTBOTTOMRIGHT;
handled = true;
}
}
if (!handled)
base.WndProc(ref m);
}
我是不是做错了什么,或者有更好的方法可以实现我想要做的事情?
非常感谢。