Winforms WM_NCHITTEST、HTCAPTION和最大化窗口
我通过指定边框样式NONE和WM_NCHITTEST的自定义处理来创建自定义绘制窗口。我已经将某些区域定义为“我的窗口标题”,并在该区域中为WM_NCHITTEST返回HTCAPTION结果。当窗口处于正常状态时,我期望该行为。可以通过拖动“我的窗口标题”来移动窗口,也可以通过双击来最大化窗口 问题在于我的窗口在最大化状态下的行为。我仍然在“我的窗口标题”区域返回WM_NCHITTEST的HTCAPTION结果,再次双击窗口可以将其恢复到原始大小,但它仍然可以移动,这不是我想要的。我应该怎么做来纠正这种行为Winforms WM_NCHITTEST、HTCAPTION和最大化窗口,winforms,winapi,Winforms,Winapi,我通过指定边框样式NONE和WM_NCHITTEST的自定义处理来创建自定义绘制窗口。我已经将某些区域定义为“我的窗口标题”,并在该区域中为WM_NCHITTEST返回HTCAPTION结果。当窗口处于正常状态时,我期望该行为。可以通过拖动“我的窗口标题”来移动窗口,也可以通过双击来最大化窗口 问题在于我的窗口在最大化状态下的行为。我仍然在“我的窗口标题”区域返回WM_NCHITTEST的HTCAPTION结果,再次双击窗口可以将其恢复到原始大小,但它仍然可以移动,这不是我想要的。我应该怎么做来
修正:
HitTestForNC方法负责评估我定制表单上的命中测试结果。实现可能看起来很难看,但它非常简单。这是我用来防止窗口在最大化时被拖动的代码
// 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
你所描述的有点奇怪-最大化的窗口通常不能移动。特别是,它占据了整个桌面区域,而且在拖动其标题(即,命中测试为
HT_caption
的区域)时,系统不会“拖动”它
请指定更多信息:
WM_GETMINMAXINFO
上响应以防止您的窗口占用整个桌面区域HT\u字幕。相反,您可以返回HT\u CLIENT
,这将防止窗口拖动
但是,当双击时,您必须手动实现窗口的“恢复”。然后,您应该在WM_lbuttondblck
上做出响应,并手动恢复您的位置。从Windows 7中,预期和正确的行为是,最大化拖动的窗口应该是可拖动的。使用记事本或任何其他windows应用程序尝试:-停靠或最大化的窗口将自动恢复为“还原”大小并可拖动
// 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