C#鼠标离开和进入事件如果鼠标按下则不会触发

6

标题已经说明了一切。我有一个面板,可以充当白板。当鼠标移动时绘制鼠标轨迹…这很好,但如果鼠标离开面板的边缘,我希望调用鼠标向上事件和鼠标向下事件,如果鼠标在左键单击的情况下离开进入面板。

 private void panel2_MouseLeave(object sender, EventArgs e)
    {
        if (mousedraw == true)
        {
            panel2_MouseUp(sender, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 0, MousePosition.X, MousePosition.Y, 0));
        }
    }

    private void panel2_MouseEnter(object sender, EventArgs e)
    {
        if (mousedraw == true)
        {
            panel2_MouseDown(sender, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 0, MousePosition.X, MousePosition.Y, 0));
        }
    }

mousedraw 是一个用来判断鼠标左键是否被点击的布尔值。

问题 是:

如果鼠标按钮被按下,那么离开和进入事件将不会触发。


这是控件基类在鼠标按下事件上将Capture属性设置为true的副作用。这个问题不需要修复,因为在控件边界之外绘制也不会显示出来。 - Hans Passant
2个回答

7

当按钮被按下时,MouseEnter和mouseLeave事件不会触发。但是,当按钮最终释放后,如果鼠标在按钮按下时移入或移出面板,则相应的mouseEnter或mouseLeave事件将触发。只要按钮被按下,即使超出了面板的边界,mouseMove事件仍将继续触发。这使得鼠标即使在超出控件边界后也可以继续拖动或执行其他操作,并且这是大多数Windows应用程序的工作方式。

如果您可以在应用程序中使用此行为,则其用户界面将更加“标准化”。

如果您绝对需要在鼠标离开面板时触发mouseUp事件,则可以在mouseMove事件中检查鼠标位置,并在鼠标位于面板外部且按钮已被按下时调用mouseUp。在MouseMove处理程序中,您可以使用e.X和e.Y获取位置,使用e.Button获取按钮状态。

当鼠标按钮在控件外按下并移动到内部时,面板对鼠标没有管辖权,因为当按钮被按下时,鼠标被视为移动到窗体或任何控件中。因此,当鼠标按钮在面板外按下并移动到面板内时,您可能会遇到难以触发mouseDown事件的问题。


谢谢,这很有帮助和启发。我现在明白了,我所寻找的解决方案并不像我想象的那么简单。如果(当)我处理好了,我会在这里发布解决方案,让其他人进行评论和受益。 - Osama

0

我认为[mousedraw]可能做得不好

click = mouseDown + mouseUp 

所以,

When mouseDown :  mousedraw = false;

When mouseUp :    mousedraw = true;

也许我没有解释清楚,或者我没有理解你的意思。[mousedraw] 是一个布尔值,每当鼠标按下或鼠标松开事件被触发时就会改变。因此,在鼠标按下事件中,我将 mousedraw 设置为 true,在鼠标松开事件中,我将其设置为 false。 - Osama
我不明白这应该如何使用,也许你应该添加一些说明。 - Breeze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接