如何在PictureBox上检测按住鼠标按钮?

时间:2008-10-04 02:27:55

标签: c# winforms mouse picturebox

我需要在鼠标位于PictureBox上方且点击并按住鼠标按钮时触发事件。

问题:

MouseDown和MouseEnter事件处理程序无法很好地协同工作。

例如,一旦单击并按住鼠标按钮,C#将触发MouseDown事件处理程序,但是当光标移动到PictureBox上时,MouseEnter事件不会触发,直到鼠标按钮被重新发布。

7 个答案:

答案 0 :(得分:14)

当按下鼠标时,大多数控件将 Control.Capture 鼠标输入。这意味着所有 MouseMove 事件都被发送到捕获的原始控件,而不是鼠标碰巧结束的控件。这一直持续到鼠标失去捕获,这通常发生在鼠标上。

如果您确实需要知道鼠标何时在您的控制之上,即使另一个控件捕获了鼠标输入,那么您只有一种方法。您需要窥探发往应用程序内其他控件的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;
    }
}

然后你会观察鼠标移动事件并检查它们是否在你的照片框上并做你想做的任何事情。

答案 1 :(得分:13)

鼠标事件

使用MouseDown事件只检测向下按下鼠标按钮并将此.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.
   }
}

答案 2 :(得分: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
}

答案 3 :(得分:3)

如果您尝试实现某种拖放操作,接收图片框上的拖动...事件(DragEnter,DragDrop等)就是您想要的使用。基本上,您使用源代码管理的DoDragDrop方法启动拖动操作,然后您拖动的任何控件都会引发其Drag ...事件。

在MSDN上搜索“DoDragDrop”以了解如何实现此目的。

答案 4 :(得分:1)

您可以使用预览事件

例如说我要检测按钮上的mousedown事件。 MouseDown事件将不起作用,因为作为此处答案之一,鼠标捕获将发送到主控件,但是您可以使用鼠标预览事件。

这是一个代码示例

我想检查何时在我的按钮上按下了鼠标左键,因此我使用了PreviewMouseLeftButtonDown

    private void MyButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // code here
    }

WPF具有许多其他事件的预览事件,您可以在此处阅读有关它们的信息

Preview Events -它特别讨论了Button以及鼠标事件如何与之交互,因此,我强烈建议您阅读

答案 5 :(得分:0)

根据鼠标位置和控制相对位置移动表单的最佳方式与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控件。

Bruno Ratnieks

Sniffer Networks

答案 6 :(得分:-1)

在鼠标按下时设置标志或状态。在鼠标上释放它。 当鼠标悬停在图片框的火上时,请检查您的状态。 现在,您可以检测到某人拖动某物的时间。