【问题标题】:How to position a Popup menu right underneath a button in VB6如何在VB6中的按钮下方放置弹出菜单
【发布时间】:2009-07-03 06:02:55
【问题描述】:

我有一个 VB6 应用程序。有一个主要形式。它包含一个用户控件。这个用户控件有一个按钮控件。当我单击按钮时,我希望弹出一个菜单,使菜单的左上角位于按钮左下角的正下方。

如果我这样做:

frm.PopupMenu mnuBlah

菜单出现在鼠标所在的位置。

如果我尝试提供坐标

frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height

数学完全错误,菜单显示偏离目标。

我不太确定 PopupMenu 调用需要什么类型的坐标以及如何计算按钮下方的位置。

【问题讨论】:

    标签: vb6 popupmenu


    【解决方案1】:

    PopupMenu 想要弹出菜单的窗体的 ScaleMode 中的 X 和 Y 坐标。在这种情况下,这可能意味着用户控件。

    但这实际上取决于您在哪里处理 MouseDown 事件。 (您不会通过 Click 事件获得坐标。)如果您的事件处理程序位于用户控件本身中,那么使用提供的坐标应该不会有任何问题。但是,您发布的代码缺少 Flags 参数(应该是 vbPopupMenuLeftAlign),这可以解释为什么您的坐标数学不起作用。另外,您必须将菜单定义为用户控件本身的属性。

    另一方面,如果您从用户控件中引发 MouseDown 事件,并在包含表单中处理它,则弹出菜单必须是包含表单的属性。在这种情况下,您可以忽略 X 和 Y 参数,但您必须自己进行坐标计算。按钮的左边缘,相对于主窗体,将是用户控件的左边缘按钮在控件内的偏移量之和。类似的数学将用于计算按钮的底部边缘。换句话说:

    Private Sub UserControl1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        PopupMenu mnuPopup, vbPopupMenuLeftAlign, _
            UserControl1.Left + UserControl1.Button.Left, _
            UserControl1.Top + UserControl1.Button.Top + UserControl1.Button.Height
    End Sub
    

    请注意,这将要求您还将按钮 (Button) 作为用户控件的属性公开,以便您可以访问其 Left、Top 和 Height 属性。这很容易:

    Public Property Get Button() As CommandButton
        Set Button = Command1
    End Property
    

    发起事件也很简单;就放

    Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    

    在用户控件的顶部,然后使用:

    RaiseEvent MouseDown(Button, Shift, X, Y)
    

    在用户控件中按钮的 MouseDown 事件中。

    最后,要在主窗体中连接事件处理程序,请使用代码编辑窗口顶部的两个下拉菜单。从左侧选择用户控件,然后从右侧选择 MouseDown 事件。这将插入事件处理程序,您使用上面的代码填写。

    至于哪种方式更好,处理用户控件本身内部的菜单,并在选择一个事件时引发有意义的事件,可以将事情分开。用户控件处理 UI 工作,让主应用程序处理响应用户选择需要执行的任何操作,而无需担心菜单的位置。

    因此您实际上不会引发 MouseDown 事件;而是引发像 OptionOneSelected、OptionTwoSelected 或 OptionThreeSelected 这样的事件。 (当然,更有意义的名字会更好。)

    无论如何,我希望这还不算太晚...

    【讨论】:

      【解决方案2】:

      您需要将 vbPopupMenuLeftAlign 标志传递给 PopupMenu 方法。请注意,这与 PopupMenu 方法的文档相矛盾(Microsoft 是否真的犯了错误?),但它确实有效。

      frm.PopupMenu mnuBlah, vbPopupMenuLeftAlign, btn.Left, btn.Top + btn.Height
      

      【讨论】:

        【解决方案3】:

        您需要包含父容器的高度和左侧值(这通常是表单,但也可以是框架或其他容器)。

        我认为您正在寻找这样的东西:

        btn.Parent.PopupMenu mnuBlah, vbPopupMenuLeftAlign , btn.Left, btn.Top + btn.Height
        

        【讨论】:

        • 这不能编译,即使你修复它使它编译,它也不起作用。
        • @raven 正如我在回答中提到的,我没有方便的编译器来检查它。这个修改后的版本应该可以工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        相关资源
        最近更新 更多