2014-09-19 75 views
0

在按下鼠标时是否可以检测鼠标是否进入Control在按下鼠标的同时检测MouseEnter事件

我认为传统的MouseEnter event没有触发,如果按下鼠标,因为与DragAndDrop功能有一些冲突?

设置.Capture = false是不是在这种情况下,适当的,因为在MouseDownMouseMove事件必须被捕获/处理

+0

拖放具有自己的DragEnter,DragOver和DragDrop事件。但是,如果它进入时发生故障,我不认为它会发生火灾。 – Plutonix 2014-09-19 16:37:25

回答

3

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

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

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

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

你可以做的事情,但你可能不应该。您使您的用户界面与用户熟悉的大多数其他程序的用户界面行为不同。或者更糟的是,它在你自己的UI中不一致,很可能发生。如此混淆用户很少是一个好主意。它是由你决定。

+0

* ...它确保MouseUp事件可靠地被触发*。不。* mouseup *事件并不总是会触发。 mouseleave和capturechanged总是被触发。 – 2014-09-19 19:08:16

+0

这不是不真实的,Ctrl + Escape是老板重写。我不认为纳入这将使答案更容易理解,虽然:)异常指出。 – 2014-09-19 19:14:27

0

首先我要感谢@Hans的回答。这是非常丰富和结构良好的+1!

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

我通过传递Controls应在MouseEnter事件的List(Of)Control,这将触发MouseDownMouseMove事件作出反应解决了这个问题。

MouseMove处理,如果鼠标位置是内List(Of)-Controls之一如果鼠标是这些Controls之一的范围内时,OnMouseEnter(ByVal e as System.EventArgs)显式调用检查。

相关问题