您需要WM_
NC
LBUTTONDOWN
(並通過HTCAPTION
作爲wParam
)。不過,我仍然不完全確定這會實現你想要做的事情。
通常,當單擊標題欄以外的其他位置時,允許用戶移動表單的方法是在光標位於要啓動移動的區域上時處理WM_NCHITTEST
消息並返回HTCAPTION
。但是,如果此區域被兒童控制器佔用,則您還必須從子控制器處理WM_NCHITTEST
,並返回HTTRANSPARENT
。
順便說一句,一個更簡單,如果略少正確的路來完成,這是做的邁赫達德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來幫我翻譯它。
不要擔心,我把這個問題標記爲c#和vb.net,因爲我不介意答案:) – Pondidum 2009-01-11 20:44:07