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

问题:

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

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

有帮助吗?

解决方案

当按下鼠标时,大多数控件将 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;
    }
}

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

其他提示

鼠标事件

使用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
}

如果您尝试实现某种拖放操作,接收图片框上的拖动...事件(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控件。

Bruno Ratnieks

Sniffer Networks

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top