10

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

問題:

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

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

4

8 に答える 8

13

マウスイベント

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.
   }
}
于 2008-10-04T02:39:47.507 に答える
13

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

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

于 2008-10-04T03:15:54.673 に答える
5

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
}
于 2010-11-29T16:43:56.003 に答える
3

ある種のドラッグ アンド ドロップ操作を実装しようとしている場合は、受信ピクチャ ボックスの Drag... イベント(DragEnter、DragDrop など) を使用します。基本的に、ソース コントロールの DoDragDrop メソッドを使用してドラッグ操作を開始すると、ドラッグしたすべてのコントロールで Drag... イベントが発生します。

これを実装する方法については、MSDN で「DoDragDrop」を検索してください。

于 2008-10-04T05:02:03.163 に答える
0

マウスの位置に基づいてフォームを移動し、相対位置を制御する最良の方法は、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コントロールです。

ブルーノ・ラトニックス

スニファーネットワーク

于 2011-05-19T15:05:05.920 に答える
-1

マウスダウンでフラグまたは状態を設定します。マウスアップで離します。マウスオーバーで画像ボックスが起動したら、状態を確認してください。人が何かをドラッグしていることを検出できるようになりました。

于 2008-10-04T02:30:11.020 に答える