按下鼠标时检测MouseEnter事件

时间:2014-09-19 16:32:25

标签: vb.net winforms events drag-and-drop mouseenter

是否可以在鼠标按下时检测鼠标是否进入Control

我认为如果按下鼠标,传统的MouseEnter event不会触发,因为DragAndDrop功能存在一些冲突?

在这种情况下设置.Capture = false是不合适的,因为在MouseDown期间必须捕获/处理MouseMove事件

2 个答案:

答案 0 :(得分:3)

嗯,是的,这在技术上是可行的。不过你不应该这样做。

重要的是当您按下鼠标按钮时鼠标光标所在的位置。这将触发底层控件上的MouseDown事件。但做其他事情,它也捕获鼠标。由Control.Capture属性公开。

这很重要,它确保可靠地触发MouseUp事件。许多控件使用该事件来触发Click事件。像一个按钮。副作用是在按住按钮的同时将鼠标移动到的控件将不会看到任何鼠标消息。他们改为点击控件。即使您将鼠标完全移出控件之外。

这可以修补。您可以在控件的MouseDown事件处理程序中将Capture属性设置回 false ,实际上使点击完全失效。或者您可以使用MouseMove监视鼠标位置,并在看到它移动到DisplayRectangle之外时取消捕获。

你可以做的事情,但你可能不应该这样做。您使UI的行为与用户熟悉的大多数其他程序的UI不同。或者更糟糕的是,它在您自己的UI中不一致,很可能发生。像这样困惑用户很少是一个好主意。这取决于你。

答案 1 :(得分:0)

首先,我要感谢@Hans的回答。这是非常翔实的,结构良好的+1!

但就我而言,这个答案并不是一个有效的解决方案。在.Capture = False事件中设置MouseDown有太多缺点。

我通过将应对Controls事件作出反应的MouseEnter传递给List(Of)中的Control来解决问题,MouseDown会触发{{1} }和MouseMove个事件。

MouseMove句柄中,检查鼠标位置是否位于List(Of)-Controls之一内如果鼠标位于其中一个Controls的范围内,{{1}明确调用。