我需要在鼠标位于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 }