【问题标题】:Detect MouseEnter event while mouse is pressed按下鼠标时检测 MouseEnter 事件
【发布时间】:2014-11-14 07:40:19
【问题描述】:

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

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

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

【问题讨论】:

  • 拖放有自己的 DragEnter、DragOver 和 DragDrop 事件。但我认为如果它进入时它是向下的,它不会触发。

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


【解决方案1】:

首先我要感谢@Hans 的回答。内容丰富且结构合理 +1!

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

我通过将应该对MouseEnter 事件作出反应的Controls 传递给Control 中的List(Of) 来解决问题,这会触发MouseDownMouseMove 事件。强>

MouseMove 句柄内,检查鼠标位置是否在List(Of)-Controls 之一内。如果鼠标在Controls 之一的范围内,则显式调用OnMouseEnter(ByVal e as System.EventArgs)

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • ... 它确保 MouseUp 事件将被可靠地触发。不会。mouseup 事件并不总是触发。 mouseleave 和 capturechanged 总是被触发。
    • 这话不假,Ctrl+Escape 是一个boss覆盖。我不认为合并它会使答案更容易理解:) 例外指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多