用VB制作可自调位置的弹出式菜单

Author: 胡亮 Date: 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的窗体,并在其上建立一个菜单,为简单起见,可在菜单中不加任何代码。
  需注意的是只能建一个菜单,而该菜单包括的菜单项的数目可不限。
  现在,一个自调位置的弹出式菜单就做成了,你不妨试试。