【问题标题】:VB.NET Custom Menu in Panel面板中的 VB.NET 自定义菜单
【发布时间】:2015-08-18 03:21:33
【问题描述】:

您好,我正在像下面这张图片(链接)的面板中实现自定义菜单..

这是链接 http://i.imgur.com/5OlRk9c.png

我的问题是,我怎样才能检测到用户点击了我的表单的其他部分,除了菜单面板和按钮(在红色圆圈内)。

我已经使用了 LostFocus 事件,但没有任何反应。

请帮忙。

【问题讨论】:

    标签: vb.net winforms vb.net-2010 panels


    【解决方案1】:

    您可以在鼠标消息通过 IMessageFilter 路由到控件之前捕获它们。然后,您可以检查光标位置是在面板边界之内还是之外。这是 Panel1 的一个简单示例:

    Public Class Form1
    
        Private WithEvents filter As New MyFilter
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Application.AddMessageFilter(filter)
        End Sub
    
        Private Sub filter_LeftClick() Handles filter.LeftClick
            Dim rc As Rectangle = Panel1.RectangleToScreen(Panel1.ClientRectangle)
            If Not rc.Contains(Cursor.Position) Then
                Debug.Print("Click outside of Panel1")
            End If
        End Sub
    
        Private Class MyFilter
            Implements IMessageFilter
    
            Public Event LeftClick()
            Private Const WM_LBUTTONDOWN As Integer = &H201
    
            Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
                Select Case m.Msg
                    Case WM_LBUTTONDOWN
                        RaiseEvent LeftClick()
    
                End Select
                Return False
            End Function
    
        End Class
    
    End Class
    

    【讨论】:

    • 如何阻止这个函数运行?
    • 谢谢,我已经弄明白了!如果面板已经不可见,我使用 exit sub。非常感谢!你能给我这个解决方案的另一个解释,以便我将来可以自信地使用它。谢谢!
    • 基本上 IMessageFilter 允许您在一个地方捕获所有用于您的应用程序的消息。 IMessageFilter 可以将实现 IMessageFilter 接口的类添加到应用程序的消息泵中,以在将消息分派到窗体或控件之前过滤掉消息或执行其他操作。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2014-01-13
    • 2018-09-19
    相关资源
    最近更新 更多