我有一个VB6应用程序。有一个主要形式。它包含用户控件。该用户控件具有按钮控件。当我点击按钮时,我想要弹出一个菜单,使菜单的左上方正好位于按钮的左下方。
如果我这样做:
frm.PopupMenu mnuBlah
菜单出现在鼠标所在的位置。
如果我尝试提供坐标
frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height
数学输出完全错误,菜单显示偏离目标。
我不太确定PopupMenu调用什么类型的坐标以及如何计算按钮下方的位置。
答案 0 :(得分:2)
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这样的事件。 (当然,更有意义的名字会好得多。)
无论如何,我希望现在为时尚晚,无法提供帮助......
答案 1 :(得分:1)
您需要包含父容器的高度值和左值(这通常是表单,但也可以是框架或其他容器)。
我认为你正在寻找这样的东西:
btn.Parent.PopupMenu mnuBlah, vbPopupMenuLeftAlign , btn.Left, btn.Top + btn.Height
答案 2 :(得分:1)
您需要将vbPopupMenuLeftAlign标志传递给PopupMenu方法。注意,这与PopupMenu方法的文档相矛盾(微软实际上可能犯了错误吗?),但它确实有效。
frm.PopupMenu mnuBlah, vbPopupMenuLeftAlign, btn.Left, btn.Top + btn.Height