Я пытаюсь сделать безграничные формы, которые выходят из панели инструментов. Я хочу, чтобы пользователь мог захватить в нижнем правом углу ( "ручка изменения размера" ) и иметь возможность изменять размер формы, но не иметь возможности изменять размер или изменять форму любым другим способом.
Я слышал, что я могу перехватить сообщение 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);
}
Я делаю что-то неправильно или есть лучший способ сделать то, что я пытаюсь сделать?
Большое спасибо.