用VB制作可自调位置的弹出式菜单 胡亮 1997-01-01   用过Windows 95的人一定都会对其灵活的弹出式菜单有很深的印象。几乎在Windows 95桌面的任一地方点一下鼠标右键,都会调出一个弹出式菜单,而且即使点在最边缘的地方,它都能自动调整其位置以完整地显示出本身的菜单窗口。   由于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的窗体,并在其上建立一个菜单,为简单起见,可在菜单中不加任何代码。   需注意的是只能建一个菜单,而该菜单包括的菜单项的数目可不限。   现在,一个自调位置的弹出式菜单就做成了,你不妨试试。