マウス ボタンが既にクリックされて押された状態で、マウスが PictureBox の上にあるときにイベントを発生させる必要があります。
問題:
MouseDown および MouseEnter イベント ハンドラーは、うまく連携しません。
たとえば、マウス ボタンをクリックして押したままにすると、C# は MouseDown イベント ハンドラーを起動しますが、カーソルが PictureBox 上に移動すると、マウス ボタンが離されるまで MouseEnter イベントは起動しません。
マウス ボタンが既にクリックされて押された状態で、マウスが PictureBox の上にあるときにイベントを発生させる必要があります。
問題:
MouseDown および MouseEnter イベント ハンドラーは、うまく連携しません。
たとえば、マウス ボタンをクリックして押したままにすると、C# は MouseDown イベント ハンドラーを起動しますが、カーソルが PictureBox 上に移動すると、マウス ボタンが離されるまで MouseEnter イベントは起動しません。
マウスイベント
MouseDown イベントを使用して、マウス ボタンが押されたことを検出し、this.Capture を true に設定して、マウスがコントロールから離れた場合でも他のマウス イベントを取得できるようにします (つまり、キャプチャしたため、MouseLeave イベントは取得されません)。ハツカネズミ)。MouseUp が発生したときに this.Capture を false に設定して、キャプチャを解放します。
マウスの状態を確認するだけです
これは関係ないかもしれませんが、 にあるSystem.Windows.Control.MousePosition
かどうかを確認して確認し、いつでもボタンが押されている可能性がある静的プロパティをPictureBox.ClientRectangle
確認できます。Control.MouseButtons
次のように:
if (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition)))
{
if ((Control.MouseButtons & MouseButtons.Left) != 0)
{
// Left button is down.
}
}
マウスが押されると、ほとんどのコントロールはマウス入力をControl.Captureします。これは、すべてのMouseMoveイベントが、マウスがたまたま上にあるコントロールではなく、キャプチャした元のコントロールに送信されることを意味します。これは、通常はマウスを上げたときに発生する、マウスのキャプチャが失われるまで続きます。
別のコントロールがマウス入力をキャプチャした場合でも、マウスがコントロール上にあることを本当に知る必要がある場合は、実際には 1 つの方法しかありません。アプリケーション内の他のコントロール宛ての Windows メッセージをスヌープする必要があります。そのためには、メッセージ フィルタを追加する必要があります ...
Application.AddMessageFilter(myFilterClassInstance);
次に、適切なクラスに IMessageFilter を実装する必要があります...
public class MyFilterClass : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_MOUSEMOVE)
// Check if mouse is over my picture box!
return false;
}
}
次に、マウス移動イベントを監視し、それらが画像ボックスの上にあるかどうかを確認し、やりたいことを何でもします。
PictureBox コントロール内で MouseMove イベントを設定します。
this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove);
次に、MouseMove イベント ハンドラー内で、マウスの左ボタン (または何か) が押されているかどうかを確認します。
private void myPictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
// Do what you want to do
}
ある種のドラッグ アンド ドロップ操作を実装しようとしている場合は、受信ピクチャ ボックスの Drag... イベント(DragEnter、DragDrop など) を使用します。基本的に、ソース コントロールの DoDragDrop メソッドを使用してドラッグ操作を開始すると、ドラッグしたすべてのコントロールで Drag... イベントが発生します。
これを実装する方法については、MSDN で「DoDragDrop」を検索してください。
マウスの位置に基づいてフォームを移動し、相対位置を制御する最良の方法は、IanCampbellが投稿したものと似ています。
private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2);
Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2);
}
}
ここで、imgMoveWindowはPictureBoxコントロールです。
ブルーノ・ラトニックス
スニファーネットワーク
マウスダウンでフラグまたは状態を設定します。マウスアップで離します。マウスオーバーで画像ボックスが起動したら、状態を確認してください。人が何かをドラッグしていることを検出できるようになりました。