我正在尝试制作从工具栏弹出的无边框表单。我希望用户能够抓住右下角(“调整大小手柄”)并能够调整表单大小,但不能以任何其他方式调整表单大小或重新定位表单。
我听说我可以拦截WM_NCHITTEST
发送到表单的消息并将其结果设置为HTBOTTOMRIGHT
让操作系统处理表单的大小调整,就好像它有一个相当大的框架一样。我的想法是检测鼠标指针是否进入了我在角落定义的框,如果进入则返回HTBOTTOMRIGHT
结果。
这并不像我预期的那样工作。我能够截获该消息,但似乎只有当用户将鼠标光标放在表单的 1px 粗边框上时才会发送该消息。这意味着它可以按照我的意愿工作,如果您将光标非常精确地定位在右下角边缘。
这是我的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);
}
我做错了什么还是有更好的方法来做我想做的事情?
非常感谢。