我有一个表单,我希望窗体最底部的按钮与边框没有间隙。这些按钮应为“自动隐藏”,因此它们仅在鼠标位于例如表格的下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
答案 0 :(得分:2)
当鼠标不再直接在该控件(或表单)上时,将触发MouseLeave事件。
如果鼠标移动到子控件,则会触发该事件。
您需要检查表单上是否不再显示鼠标,如下所示:
If Not Me.ClientRectangle.Contains(Me.PointToClient(e.Location)) Then
Button1.Visible = False
End If
编辑:已修复
答案 1 :(得分:1)
Windows为此方案内置了直接支持。也在Windows窗体和WPF中公开。获得MouseMove事件后,将控件上的Capture属性设置为True。这会强制所有鼠标消息定向到控件,即使鼠标移动到控制窗口之外。
一旦你看到它移出控制范围之外,将Capture设置为false并隐藏你的控件。请注意,当用户单击鼠标时会关闭捕获功能,因此您可能必须在之后重新打开它。虽然它应该是自动的,但您将获得另一个MouseMove事件。如果用户快速移动鼠标 ,则可能会失败。