Вам потребуется WM_
NC
LBUTTONDOWN
(и передать HTCAPTION
как wParam
). Я все еще не совсем уверен, что это достигнет того, что вы пытаетесь сделать.
Как правило, способ, позволяющий пользователю перемещать вашу форму при щелчке мышью где-либо, кроме строки заголовка, - это обрабатывать сообщение WM_NCHITTEST
и возвращать HTCAPTION
, когда курсор находится над областью, из которой вы хотите начать движение. Однако, если эта область занята дочерним элементом управления, вы также должны обработать WM_NCHITTEST
из дочернего элемента управления и вернуть HTTRANSPARENT
.
Кстати, более простой, хотя и несколько менее правильный, способ сделать это - сделать так, как Мехрдад Афшари предложил , и просто установить свойство формы 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-решением, которое не зависит от вызова любой платформы (поэтому оно должно быть переносимым на Mono в Unix).
К сожалению. Я только что понял, что дал вам пример кода на 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. Я использовал Отражатель , чтобы помочь мне перевести его.