테두리 스타일 NONE 및 WM_NCHITTEST의 사용자 지정 처리를 지정하여 사용자 지정 그리기 창을 만듭니다. 일부 영역을 '내 창 캡션'으로 정의하고이 영역에서 WM_NCHITTEST에 대한 HTCAPTION 결과를 반환했습니다. 창문이 정상 상태에있을 때 그 행동은 저에게 기대됩니다. 창은 '내 창 캡션'을 드래그하여 이동할 수 있으며 두 번 클릭하여 최대화 할 수 있습니다.WM_NCHITTEST, HTCAPTION 및 최대화 된 창
문제는 최대화 된 상태에서 내 창의 동작입니다. 나는 여전히 '내 창 캡션'영역에서 WM_NCHITTEST에 대한 HTCAPTION 결과를 반환하고 창을 다시 두 번 클릭하여 원래 크기로 복원 할 수 있지만 여전히 이동할 수 있으며 원하는 것은 아닙니다. 그러한 행동을 수정하기 위해 무엇을해야합니까?
수정 :
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_NCHITTEST)
{
Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
pos = this.PointToClient(pos);
if(HitTestForNC(ref m, pos))
{
if(WindowState != FormWindowState.Maximized || m.Result != (IntPtr)HitTestValues.HTCAPTION)
{
return;
}
}
}
else if(m.Msg == WM_GETMINMAXINFO)
{
base.WndProc(ref m);
MinMaxInfo mmi = (MinMaxInfo)Marshal.PtrToStructure(m.LParam, typeof(MinMaxInfo));
mmi.ptMaxPosition = Screen.FromControl(this).WorkingArea.Location;
mmi.ptMaxSize = Screen.FromControl(this).WorkingArea.Size;
Marshal.StructureToPtr(mmi, m.LParam, false);
return;
}
base.WndProc(ref m);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
Message m = new Message();
if(HitTestForNC(ref m, e.Location))
{
if(m.Result == (IntPtr)HitTestValues.HTCAPTION && WindowState == FormWindowState.Maximized)
{
WindowState = FormWindowState.Normal;
return;
}
}
}
base.OnMouseDoubleClick(e);
}
HitTestForNC 방법은 내 사용자 지정 그려 양식의 적중 테스트 결과의 평가에 대한 책임이 있습니다. 구현이보기 흉하게 보일 수도 있지만 매우 간단합니다.
고정 코드로 내 질문을 업데이트했습니다. – okutane