您需要WM_NCLBUTTONDOWN(并将HTCAPTION 传递为wParam)。不过,我仍然不能完全确定这会完成你想要做的事情。
通常,允许用户在单击标题栏以外的位置时移动表单的方法是处理 WM_NCHITTEST 消息并在光标位于您想要移动的区域上时返回 HTCAPTION开始移动。但是,如果该区域被子控件占用,则还必须处理子控件中的WM_NCHITTEST 并返回HTTRANSPARENT。
顺便说一句,完成此操作的更简单(如果稍微不太正确)的方法是像 Mehrdad Afshari suggested 一样,只需设置表单的 Location 属性。你对他说“它需要随着鼠标移动而移动”,而这正是你可以而且应该做的。
class MyForm : Form{
Point downAt;
MyForm(){
Label lbl = new Label();
lbl.AutoSize = true;
lbl.BackColor = Color.Blue;
lbl.ForeColor = Color.White;
lbl.Location = new Point(50, 50);
lbl.Text = "Drag me to move this form.";
lbl.Parent = this;
lbl.MouseDown += (s, e)=>downAt = e.Location;
lbl.MouseMove += (s, e)=>{if(lbl.Capture) Location += (Size)e.Location - (Size)downAt;};
}
}
这种方法的问题在于它绕过了 Windows 用于移动顶级窗口的代码。这意味着如果用户没有在“显示属性”对话框中选择“拖动时显示窗口内容”选项,这将有效地忽略该设置(它不会显示拖动轮廓)。可能还有其他我没有想到的缺点。
不过,总的来说,这是一种简单易行的实现方式,它是一个完全 .NET 的解决方案,不依赖于任何平台调用(因此它应该可以移植到 Unix 上的 Mono)。
哎呀。我刚刚意识到我给了你 C# 示例代码,但你的代码似乎是 VB.NET。我猜你需要的是:
Sub New()
Dim lbl As New Label
lbl.AutoSize = True
lbl.BackColor = Color.Blue
lbl.ForeColor = Color.White
lbl.Location = New Point(50, 50)
lbl.Text = "Drag me to move this form."
lbl.Parent = Me
AddHandler lbl.MouseDown, Function(ByVal s As Object, ByVal e As MouseEventArgs)
Me.downAt = e.Location
End Function
AddHandler lbl.MouseMove, Function(ByVal s As Object, ByVal e As MouseEventArgs)
If lbl.Capture Then
Me.Location = Me.Location + DirectCast(e.Location, Size) - DirectCast(Me.downAt, Size)
End If
End Function
End Sub
这可能不是在 VB.NET 中表达这一点的最简洁的方式。我用Reflector帮我翻译了。