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