gpt4 book ai didi

winforms - WM_NCHITTEST、HTCAPTION 和最大化窗口

转载 作者:行者123 更新时间:2023-12-02 14:41:37 28 4
gpt4 key购买 nike

我正在通过指定边框样式 NONE 和 WM_NCHITTEST 的自定义处理来创建自定义绘制窗口。我已将某些区域定义为“我的窗口标题”,并在该区域中返回 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 方法负责评估我的自定义绘制表单上的 HitTest 结果。实现可能看起来很难看,但非常简单。

最佳答案

这是我用来防止窗口最大化时可拖动的代码。

// Indicates the form caption
Const HT_CAPTION As Integer = &H2
// Windows Message Non Client Button Down
Const WM_NCLBUTTONDOWN As Integer = &HA1

//Routine to implement the 'Drag Window' functionality.
Private Sub frm_Drag(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Me.MouseDown

//Do not move the form if it is maximized.
If Not Me.WindowState = FormWindowState.Maximized Then
If e.Button = Windows.Forms.MouseButtons.Left Then
sender.Capture = False
Me.WndProc(Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
CType(HT_CAPTION, IntPtr), IntPtr.Zero))
End If
End If
End Sub

关于winforms - WM_NCHITTEST、HTCAPTION 和最大化窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com