代码之家  ›  专栏  ›  技术社区  ›  Justin Tanner

如何检测图片框上按住的鼠标按钮?

  •  11
  • Justin Tanner  · 技术社区  · 16 年前

    当鼠标位于图片框上方且鼠标按钮已单击并按住时,我需要触发事件。

    问题:

    mousedown和mouseenter事件处理程序不能很好地协同工作。

    例如,一旦单击并按住鼠标按钮,C将启动mouse down事件处理程序,但当光标移到图片框上时,mouseenter事件不会启动,直到鼠标按钮真正松开。

    6 回复  |  直到 12 年前
        1
  •  14
  •   Phil Wright    16 年前

    当按下鼠标时,大多数控件将 捕获控制 鼠标输入。这意味着所有 鼠标移动 事件被发送到捕获的原始控件,而不是鼠标刚好结束的控件。这会一直持续到鼠标丢失捕获(通常在鼠标向上时发生)。

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

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

        2
  •  13
  •   Jeff Yates    12 年前

    鼠标事件

    使用MouseDown事件只需检测鼠标按钮的下压,并将其设置为“捕获”为“真”,这样即使鼠标离开控件,也可以获取其他鼠标事件(即,因为捕获了鼠标,所以不会获取MouseLeave事件)。通过设置此项释放捕获。发生mouseup时捕获为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.
       }
    }
    
        3
  •  5
  •   Ian Campbell    14 年前

    在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
    }
    
        4
  •  3
  •   MusiGenesis    16 年前

    如果您试图实现某种类型的拖放操作, 阻力…事件 接收图片框上的(DragEnter、DragDrop等)是您要使用的。基本上,使用源代码管理的DoDragDrop方法启动拖动操作,然后拖动的任何控件都将具有其拖动效果…引发的事件。

    在msdn上搜索“dodragdrop”以了解如何实现这一点。

        5
  •  0
  •   Bruno Ratnieks    13 年前

    移动基于鼠标位置和控制相对位置的表单的最佳方法类似于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控件。

    布鲁诺拉特尼克

    嗅探器网络

        6
  •  -1
  •   Jack B Nimble    16 年前

    在鼠标按下时设置标志或状态。鼠标向上松开。 当鼠标悬停在图片框上时,请选中您的状态。 现在,您可以检测到某人何时在拖动某个对象。