我正在嘗試使無邊框窗體彈出工具欄。我希望用戶能夠在右下角抓取(「調整大小手柄」),並且可以調整表單的大小,但無法以任何其他方式調整大小或重新定位表單。自定義調整無邊框窗體C中的句柄#
我聽說我可以攔截髮送給表單的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);
}
難道我做錯了什麼,還是有更好的方法做我想要做什麼?
非常感謝。
我認爲這將是有益的http://stackoverflow.com/questions/2575216/resize-winform-沒有邊界和http://www.codeproject.com/Articles/24005/Resizable-Moveable-Customizable-Borderless-Form –
我在想這個,或者你不能只是改變FormBorderStyle爲Sizeable每當你的用戶鼠標懸停在您的自定義hitbox上,以及FixedSingle何時離開它?處理Rectangle類中的MouseEnter和MouseLeave事件。 –
@AntonSemenov:第二種解決方案繞過操作系統處理程序。第一個是我想要的,但不起作用。除了窗口的邊緣,我沒有收到WM_NCHITTEST消息。 –