当鼠标位于 PictureBox 上方且鼠标按钮已被单击并按住时,我需要触发一个事件。
问题:
MouseDown 和 MouseEnter 事件处理程序不能很好地协同工作。
例如,一旦单击并按住鼠标按钮,C# 将触发 MouseDown 事件处理程序,但是当光标移到 PictureBox 上时,MouseEnter 事件不会触发,直到鼠标按钮被释放。
当鼠标位于 PictureBox 上方且鼠标按钮已被单击并按住时,我需要触发一个事件。
问题:
MouseDown 和 MouseEnter 事件处理程序不能很好地协同工作。
例如,一旦单击并按住鼠标按钮,C# 将触发 MouseDown 事件处理程序,但是当光标移到 PictureBox 上时,MouseEnter 事件不会触发,直到鼠标按钮被释放。
鼠标事件
使用 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.
}
}
当鼠标被按下时,大多数控件将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;
}
}
然后你观察鼠标移动事件并检查它们是否在你的图片框上并做你想做的任何事情。
在 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... 事件。
在 MSDN 上搜索“DoDragDrop”以了解如何实现这一点。
您可以使用预览事件
例如,假设我想检测按钮上的 mousedown 事件。MouseDown 事件不起作用,因为作为这里的答案之一,鼠标捕获被发送到主控件,但是您可以做的是使用鼠标预览事件。
这是一个代码示例
我想检查何时在我的 Button 上按下鼠标左键,因此我使用 PreviewMouseLeftButtonDown
private void MyButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// code here
}
WPF 有很多其他事件的预览事件,你可以在这里阅读它们
预览事件- 它特别讨论了按钮以及鼠标事件如何与之交互,因此我强烈建议您阅读它
基于鼠标位置和控件相对位置移动表单的最佳方法类似于 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 控件。
布鲁诺·拉特尼克斯
嗅探器网络
您应该尝试使用图片框的 MouseMove 而不是 MouseEnter,无论鼠标按钮状态如何,MouseMove 通常都会触发。
在鼠标按下时设置标志或状态。松开鼠标。当鼠标悬停在图片框上时,请检查您的状态。现在您可以检测到一个人何时在拖动某物。