PictureBoxの上にマウスボタンを押したまま検出するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/169590

  •  05-07-2019
  •  | 
  •  

質問

マウスボタンがクリックされたままの状態で、マウスがPictureBoxの上にあるときにイベントを発生させる必要があります。

問題:

MouseDownイベントハンドラとMouseEnterイベントハンドラは、うまく連携しません。

たとえば、マウスボタンをクリックして押したままにすると、C#はMouseDownイベントハンドラーを起動しますが、カーソルがPictureBoxの上を移動しても、マウスボタンが再配置されるまで、MouseEnterイベントは起動しません。

役に立ちましたか?

解決

マウスを押すと、ほとんどのコントロールがマウス入力を 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;
    }
}

次に、マウス移動イベントを監視し、それらが画像ボックス上にあるかどうかを確認して、やりたいことを実行します。

他のヒント

マウスイベント

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.
   }
}

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 ...イベントが発生します。

検索" DoDragDrop" MSDNでこれを実装する方法を確認してください。

マウスの位置に基づいてフォームを移動し、相対位置を制御する最良の方法は、Ian Campbellが投稿したものと似ています。

    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コントロールである場合。

ブルーノ・ラトニーク

スニファーネットワーク

マウスダウンでフラグまたは状態を設定します。マウスを離すとリリースします。 マウスで画像ボックスの火災が発生したら、状態を確認します。 これで、人が何かをドラッグしていることを検出できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top