あなたが必要です(そしてとして渡します)。ただし、これがあなたがやろうとしていることを達成できるかどうかはまだ完全にはわかりません。WM_
NC
LBUTTONDOWN
HTCAPTION
wParam
通常、タイトル バー以外の場所をクリックしたときにユーザーがフォームを移動できるようにする方法は、メッセージを処理し、カーソルが移動を開始する領域の上にあるときにWM_NCHITTEST
戻ることです。HTCAPTION
ただし、この領域が子コントロールで占有されている場合は、子コントロールWM_NCHITTEST
からも処理して返す必要がありHTTRANSPARENT
ます。
ちなみに、これを達成するためのより簡単な方法は、Mehrdad Afshariが提案したように、フォームの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を使用して翻訳しました。