用VB制作可自调位置的弹出式菜单
由于VB能够很轻松地调用Windows函数,因此笔者试着用VB完成了这类菜单的制作。其制作原理主要是应用两个Windows函数:GetMenu()和TrackPopupMenu()。前者的用途是从一个窗口中取得其菜单,其调用格式为:
hMenu=GetMenu(form.hWnd)
其中hMenu为一数字,以标识调用后所取得的菜单,form.hWnd为菜单所在窗口的标识数字。
后者的用途是将该菜单在用户指定的范围动态地显示,其调用格式为:
R=TrackPopupMenu(hMenu,flag,x,y,0,form.hWnd,Rect)
其中hMenu为要弹出的菜单标识数,flag的值用于确定是用鼠标右键还是左键来启动弹出菜单,当为0时是左键,为2时是右键。x为屏幕上弹出菜单所在位置的横轴值,y为相应的纵轴值,form.hWnd为菜单所在窗口的标识数,Rect为菜单的坐标值,它是一个结构型变量,包含了四个子变量(Top,Left,Bottom,Right,前两个定义菜单左上角的坐标值,后两个定义菜单右下角的坐标值)。
下面举的例子即为制作的示范。其执行效果为在一窗口中用鼠标右键点击其中的一个图标后,会立即弹出一个活动菜单,无论你将主窗口移至何方,弹出的菜单都能自调位置。
具体的步骤如下:
#2 一、首先建立一个名为declares.bas模块文件,在该模块中写入如下代码:
Option Explicit
Global Const TWIPS=1
Type Rect
Left As Integer
Top As Integer
Right As Integer
Bottom As Integer
End Type
Declare Function TrackPopupMenu Lib "User32"(ByVal hMenu As Long,ByVal wFlags As Long,ByVal X As Long,ByVal Y As Long,ByVal nReserved As Long,ByVal hWnd As Long,lpReserved As Any)As Long
Declare Function GetMenu Lib "User32"(ByVal hWnd As Long)As Long
#2 二、建一个名为PopupMenuDemo的窗体(form),在该窗体中写入如下代码:
Private Sub Form-MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
Dim IX As Integer,IY As Integer
Dim hMenu As Long,R As Integer
Dim WinRect As Rect
If Button And 2 Then
ScaleMode=TWIPS
WinRect.Left=0
WinRect.Top=0
WinRect.Right=Screen.Width/Screen.TwipsPerPixelX
WinRect.Bottom=Screen.Height/Screen.TwipsPerPixelY
IX=(X+Left)\Screen.TwipsPerPixelX
IY=(Y+Top+Height)\Screen.TwipsPerPixelY
hMenu=GetMenu(frmMenus.hWnd)
R=TrackPopupMenu(hMenu,2,IX,IY,0,frmMenus.hWnd,WinRect)
End If
End Sub
#2 三、建立一个名为frmMenus的窗体,并在其上建立一个菜单,为简单起见,可在菜单中不加任何代码。
需注意的是只能建一个菜单,而该菜单包括的菜单项的数目可不限。
现在,一个自调位置的弹出式菜单就做成了,你不妨试试。