Vb.net 鼠标从底部离开时按钮未隐藏

Vb.net 鼠标从底部离开时按钮未隐藏,vb.net,events,animation,button,Vb.net,Events,Animation,Button,我有一个表单,我希望按钮位于表单的最底部边缘,与边框没有间隙。这些按钮应为“自动隐藏”,因此它们仅在鼠标位于表单较低的20个像素时显示。所以我使用MouseMove事件来触发它,就像下面的代码一样。但是,如果鼠标越过底部边缘(按钮所在的位置)离开窗体,则按钮将明显保留。但我想让他们藏起来。因此,我需要通过其他事件隐藏按钮。因此,我尝试将它们隐藏在窗体的MouseLeave事件中。但这会使按钮不可点击,并且处于不稳定状态,当鼠标移动到按钮上时,按钮会闪烁。。为什么会这样?我怎样才能避免这个问题来获

我有一个表单,我希望按钮位于表单的最底部边缘,与边框没有间隙。这些按钮应为“自动隐藏”,因此它们仅在鼠标位于表单较低的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

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

您需要检查鼠标是否不再位于窗体上,如下所示:

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

编辑:修复了当鼠标不再直接位于该控件(或窗体)上时触发MouseLeave事件的问题。
如果鼠标移到子控件上,事件将触发

您需要检查鼠标是否不再位于窗体上,如下所示:

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

编辑:已修复

Windows内置了此场景的直接支持。也在Windows窗体和WPF中公开。获得MouseMove事件后,将控件的Capture属性设置为True。这将强制将所有鼠标消息定向到控件,即使鼠标移动到控件窗口之外


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

Windows内置了此方案的直接支持。也在Windows窗体和WPF中公开。获得MouseMove事件后,将控件的Capture属性设置为True。这将强制将所有鼠标消息定向到控件,即使鼠标移动到控件窗口之外



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

@bretddog:现在试试。我也错检查了窗框。谢谢。。我认为问题在于当鼠标离开窗体时,MouseMove事件不会触发。。我可以把你的密码放在哪里?啊。。对当然似乎几乎奏效了。。只有当我穿过按钮向外移动时,按钮才会保留。。也许我还需要将它添加到buttonLeave中..是的;处理
Button1.MouseLeave
并添加相同的逻辑(调用
Me.PointToClient(MousePosition)
,因为
e.Location
是相对于按钮的)。。这有助于。。现在,当我把鼠标放在按钮上时,它也隐藏了起来(因为按钮正好在边缘)。。但这将是一个问题,因为我想像5个按钮直接紧挨着对方(没有差距)。。我不想在鼠标从侧面离开按钮时隐藏它们。。六羟甲基三聚氰胺六甲醚。。我必须想想。。(是的,我用了鼠标位置:)@bretddog:现在试试。我也错检查了窗框。谢谢。。我认为问题在于当鼠标离开窗体时,MouseMove事件不会触发。。我可以把你的密码放在哪里?啊。。对当然似乎几乎奏效了。。只有当我穿过按钮向外移动时,按钮才会保留。。也许我还需要将它添加到buttonLeave中..是的;处理
Button1.MouseLeave
并添加相同的逻辑(调用
Me.PointToClient(MousePosition)
,因为
e.Location
是相对于按钮的)。。这有助于。。现在,当我把鼠标放在按钮上时,它也隐藏了起来(因为按钮正好在边缘)。。但这将是一个问题,因为我想像5个按钮直接紧挨着对方(没有差距)。。我不想在鼠标从侧面离开按钮时隐藏它们。。六羟甲基三聚氰胺六甲醚。。我必须想想。。(是的,我用了鼠标位置:))有趣。。如果我理解正确,我应该让窗体或底层控件捕获鼠标,而不是我看到的按钮(?)。。但是如果我在一个按钮上滚动鼠标,这个按钮会得到那个鼠标事件吗?哦。。那不是按钮事件。。很抱歉但例如按钮的鼠标移动事件。我不会用这个解决方案得到它吗?因为我需要在这样的事件上做点什么。比如改变按钮的颜色。当你有多个控件想让它们消失时,它会变得模糊。协调他们的MouseEnter/Leave事件不起作用,它总是被用户快速移动鼠标所击败。对鼠标进行采样时,它不提供连续的像素位置流。唯一真正的解决办法是使用定时器,200毫秒就可以了,然后看看鼠标的位置。你需要控制。指向客户端。谢谢!很高兴了解Capture属性。然而,对于这种情况,斯拉克给出的解决方案似乎是最好的。我只需检查底层控件的MouseMove事件,并将MouseMove处理程序注册到位于该下边缘的所有按钮,这将调用隐藏我想要隐藏的内容的方法。然后我应该被覆盖,并且不会失去任何功能。至少到目前为止,我觉得它似乎是防故障的。当你将鼠标快速移动到窗体外一圈时,它就起作用了?有趣。。如果我理解正确,我应该让窗体或底层控件捕获鼠标,而不是我看到的按钮(?)。。但是,如果我将鼠标滚动到一个按钮的顶部,按钮是否会停止