如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?
Posted
技术标签:
【中文标题】如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?【英文标题】:How to show or hide a Panel using Mouse coordinates if the Form is resized? 【发布时间】:2021-10-16 22:07:54 【问题描述】:我有一个包含面板的表单。 起初,此面板是不可见的,当鼠标进入其客户区时变为可见。 只要我不调整表单大小,我使用的代码就可以工作。 通过更改表单大小,此代码不再起作用。
我试过这段代码:
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
Label1.Text = e.Location.ToString
If e.Location.Y > 441 Then
Panel1.Visible = True
Else
Panel1.Visible = False
End If
End Sub
【问题讨论】:
【参考方案1】:由于此面板似乎停靠在表单的底部,因此您只需考虑面板的Bounds(描述控件在其容器内占据的区域的矩形)来确定鼠标位置是否在其内部客户专区。
Rectangle.Contains(Point) 方法返回 True
或 False
如果 Point 包含在指定的 Rectangle 的边界内。
然后您可以使用布尔结果来设置面板的可见性:
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
Panel1.Visible = Panel1.Bounds.Contains(e.Location)
End Sub
额外: 其他常见情况如何处理:
Panel1 不是 Form 的直接子级,因此当鼠标指针进入 Panel 的实际父级边界时,Form 不会接收鼠标事件 窗体的客户区被其他控件覆盖,因此当鼠标指针悬停在这些控件上时,它不会接收鼠标事件您不能将事件处理程序添加到表单中可能在某些时候参与这些操作的所有控件。可以在设计器中添加、删除或移动控件。不可行。
在这些和其他类似情况下,实现IMessageFilter 会派上用场。
您可以使用Application.AddMessageFilter / Application.RemoveMessageFilter 方法在将消息分派到目的地之前监视定向到任何控件的消息。
如果需要,您还可以阻止消息到达目的地,在 IMessageFilter.PreFilterMessage() 方法中返回 True
。
这里Form类直接实现了IMessageFilter。你当然可以创建一个可重用的帮助类来做同样的事情。
Public Class SomeForm
Implements IMessageFilter
Private Const WM_MOUSEMOVE As Integer = &H200
Public Sub New()
InitializeComponent()
Application.AddMessageFilter(Me)
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
Application.RemoveMessageFilter(Me)
MyBase.OnFormClosed(e)
End Sub
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
If m.Msg = WM_MOUSEMOVE Then
Panel1.Visible = Panel1.RectangleToScreen(Panel1.ClientRectangle).Contains(MousePosition)
End If
Return False
End Function
End Class
【讨论】:
【参考方案2】:试试这个:
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Label1.Text = e.Location.ToString
If e.X > Panel1.Left And e.X < Panel1.Left + Panel1.Width And e.Y > Panel1.Top And e.Y < Panel1.Top + Panel1.Height Then
Panel1.Visible = True
Else
Panel1.Visible = False
End If
End Sub
【讨论】:
以上是关于如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?的主要内容,如果未能解决你的问题,请参考以下文章