如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?

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) 方法返回 TrueFalse 如果 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

【讨论】:

以上是关于如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?的主要内容,如果未能解决你的问题,请参考以下文章

苹果系统如何设置鼠标指针的大小?

调整面板大小以适应 Windows 窗体中包含的元素

调整窗口大小时如何使用鼠标单击获取图像坐标?

(C#)Winform 关于隐藏标题栏后的问题

调整窗口大小后无法正确检索鼠标坐标

如何在窗口调整大小时隐藏 Facebook 聊天框?