如何在VB6中将弹出菜单定位在按钮的正下方

如何在VB6中将弹出菜单定位在按钮的正下方,vb6,popupmenu,Vb6,Popupmenu,我有一个VB6应用程序。有一种主要形式。它包含一个用户控件。此用户控件有一个按钮控件。当我点击按钮时,我希望弹出一个菜单,这样菜单的左上角就在按钮左下角的正下方 如果我这样做: frm.PopupMenu mnuBlah 菜单在鼠标所在的位置出现 如果我试图提供坐标 frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height 计算结果完全错了,菜单显示得离目标很远 我不太确定PopupMenu调用需要什么类型的坐标,以及如何计算按钮下方的位置。

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

如果我这样做:

frm.PopupMenu mnuBlah
菜单在鼠标所在的位置出现

如果我试图提供坐标

frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height
计算结果完全错了,菜单显示得离目标很远


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

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

我想你在找这样的东西:

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

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

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

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

但这实际上取决于你在哪里处理MouseDown事件。(您不能通过单击事件获取坐标。)如果您的事件处理程序在用户控件本身中,那么使用提供的坐标应该不会有任何问题。但是,您发布的代码缺少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、OptionWoSelected或OptionThreeSelected之类的事件。(当然,更有意义的名字会更好。)


无论如何,我希望这不会太晚,对您有所帮助…

这不会编译,即使您修复它使其能够编译,它也不会工作。@raven正如我在回答中提到的,我手边没有编译器来检查它。这个修改过的版本应该可以用。