【问题标题】:Button not hiding when mouse leaves from bottom鼠标从底部离开时按钮不隐藏
【发布时间】:2011-04-19 01:09:31
【问题描述】:

我有一个表单,我希望在表单的最底部边缘放置按钮,与边框没有间隙。这些按钮应为“自动隐藏”,因此它们仅在鼠标位于表单的下 20 像素时才会显示。所以我使用 MouseMove 事件来触发它,如下面的代码。但是,如果鼠标离开表单的底部边缘,也就是按钮所在的位置,那么按钮显然会保留。但我希望他们隐藏起来。所以我需要为此目的通过其他事件隐藏按钮。因此,我尝试将它们隐藏在表单的 MouseLeave 事件中。但这会使按钮无法点击并且处于不稳定状态,当鼠标移到按钮上时会闪烁。为什么会这样?我怎样才能避免这个问题来获得这样的自动隐藏功能?

  Private Sub ZgScale_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

    If e.Y > Me.ClientSize.Height - 30 Then
        Button1.Visible = True
    Else
        Button1.Visible = False
    End If
End Sub

Private Sub ZgScale_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    Button1.Visible = False
End Sub

【问题讨论】:

    标签: vb.net events animation button


    【解决方案1】:

    当鼠标不再直接在该控件(或窗体)上时,将触发 MouseLeave 事件。
    如果鼠标移到子控件上,该事件将触发。

    你需要检查鼠标是否不再在表单上,​​像这样:

    If Not Me.ClientRectangle.Contains(Me.PointToClient(e.Location)) Then
        Button1.Visible = False
    End If
    

    编辑:已修复

    【讨论】:

    • @bretddog:现在就试试吧。我也错误地检查了窗框。
    • 谢谢.. 我认为问题是鼠标离开表单时 MouseMove 事件不会触发.. 那么我可以把你的代码放在哪里?
    • 啊..是的。当然..似乎几乎可以工作..只有当我跨过按钮移到外面时,按钮才会保留..也许我还需要将它添加到 buttonLeave..
    • 是的;处理Button1.MouseLeave 并添加相同的逻辑(调用Me.PointToClient(MousePosition) 因为e.Location 是相对于按钮)
    • 是的..这有帮助..现在当我将鼠标放在按钮上时它也会隐藏(因为按钮正好在边缘)..仍然会是一个问题,因为我想要直接 5 个按钮彼此相邻(没有间隙)..当鼠标侧向离开按钮时,我不想隐藏它们..嗯..我必须认为..(是的,我使用了 Mouseposition :))
    【解决方案2】:

    Windows 为这种情况提供了内置的直接支持。也暴露在 Windows 窗体和 WPF 中。获得 MouseMove 事件后,将控件上的 Capture 属性设置为 True。这会强制将所有鼠标消息定向到控件,即使鼠标移出控件窗口也是如此。

    一旦您看到它移动到控件边界之外,请将 Capture 设置回 false 并隐藏您的控件。请注意,当用户单击鼠标时会关闭捕获功能,因此您可能必须在之后将其重新打开。虽然它应该是自动的,但您会得到另一个 MouseMove 事件。如果用户真的快速移动鼠标可能会失败。

    【讨论】:

    • 有趣..如果我理解正确,我应该让表单或底层控件捕获鼠标,而不是按钮(?)我看到了..但是如果我在上面滚动鼠标怎么办一个按钮,这个按钮会得到那个鼠标事件吗?
    • 哦..这不是按钮事件..抱歉。但例如按钮的 mouseLeave 事件。我不会用这个解决方案得到它?因为我需要在这样的事件上做点什么。比如改变按钮的颜色。
    • 当您有多个想要消失的控件时,它会变得模糊不清。协调他们的 MouseEnter/Leave 事件不起作用,它总是被用户快速移动鼠标所击败。鼠标经过采样,它不提供连续的像素位置流。唯一真正的解决方法是使用计时器,200 毫秒是可以的,然后查看 Mouse.Position。你需要 Control.PointToClient。
    • 谢谢!很高兴了解 Capture 属性。然而,对于这种情况,SLaks 给出的解决方案似乎是最好的。我只是检查底层控件的 MouseMove 事件,并且我为位于该下边缘的所有按钮注册了一个 MouseMove 处理程序,该处理程序调用隐藏我想要隐藏的内容的方法。然后我应该被覆盖,并且不会失去任何功能。至少到目前为止对我来说它似乎是失败的证明。
    • 当您将鼠标快速移出表单一圈时,这是否有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2014-01-10
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多