' 类的名称为cPopupMenu
Option Explicit
'
Private Type POINT
x As Long
y As Long
End Type
'
Private Const MF_ENABLED = & H0 &
Private Const MF_SEPARATOR = & H800 &
Private Const MF_STRING = & H0 &
Private Const TPM_RIGHTBUTTON = & H2 &
Private Const TPM_LEFTALIGN = & H0 &
Private Const TPM_NONOTIFY = & H80 &
Private Const TPM_RETURNCMD = & H100 &
Private Declare Function CreatePopupMenu Lib " user32 " () As Long
Private Declare Function AppendMenu Lib " user32 " Alias " AppendMenuA " (ByVal hMenu As Long , ByVal wFlags As Long , ByVal wIDNewItem As Long , ByVal sCaption As String ) As Long
Private 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 , nIgnored As Long ) As Long
Private Declare Function DestroyMenu Lib " user32 " (ByVal hMenu As Long ) As Long
Private Declare Function GetCursorPos Lib " user32 " (lpPoint As POINT) As Long
Private Declare Function GetForegroundWindow Lib " user32 " () As Long
Private Declare Function GetMenuString Lib " user32 " Alias " GetMenuStringA " (ByVal hMenu As Long , ByVal wIDItem As Long , ByVal lpString As String , ByVal nMaxCount As Long , ByVal wFlag As Long ) As Long
Private mSelMenuString As String
Public Property Get SelMenuString() As String
SelMenuString = mSelMenuString
End Property
'
Public Function Popup(ParamArray param()) As Long
Dim iMenu As Long
Dim hMenu As Long
Dim nMenus As Long
Dim p As POINT
' get the current cursor pos in screen coordinates
GetCursorPos p
' create an empty popup menu
hMenu = CreatePopupMenu()
' determine # of strings in paramarray
nMenus = 1 + UBound (param)
' put each string in the menu
For iMenu = 1 To nMenus
' the AppendMenu function has been superseeded by the InsertMenuItem
' function, but it is a bit easier to use.
If Trim $( CStr (param(iMenu - 1 ))) = " - " Then
' if the parameter is a single dash, a separator is drawn
AppendMenu hMenu, MF_SEPARATOR, iMenu, ""
Else
AppendMenu hMenu, MF_STRING + MF_ENABLED, iMenu, CStr (param(iMenu - 1 ))
End If
Next iMenu
' show the menu at the current cursor location;
' the flags make the menu aligned to the right (!); enable the right button to select
' an item; prohibit the menu from sending messages and make it return the index of
' the selected item.
' the TrackPopupMenu function returns when the user selected a menu item or cancelled
' the window handle used here may be any window handle from your application
' the return value is the (1-based) index of the menu item or 0 in case of cancelling
iMenu = TrackPopupMenu(hMenu, TPM_RIGHTBUTTON + TPM_LEFTALIGN + TPM_NONOTIFY + TPM_RETURNCMD, p.x, p.y, 0 , GetForegroundWindow(), 0 )
Dim result As Long
Dim buffer As String
Const MF_BYPOSITION = & H400 & 
buffer = Space ( 255 )
result = GetMenuString(hMenu, (iMenu - 1 ), buffer, _
Len (buffer), MF_BYPOSITION)
' Debug.Print buffer
mSelMenuString = Trim (buffer)
' release and destroy the menu (for sanity)
DestroyMenu hMenu
' return the selected menu item's index
Popup = iMenu
End Function 
' 结束
' 以下是实例,在Form上添加一个ListBox控件
Option Explicit 
Private Sub Form_Load()
List1.AddItem " Right-Click here for a menu "
End Sub 
Private Sub List1_MouseUp(Button As Integer , Shift As Integer , x As Single , y As Single )
Dim oMenu As cPopupMenu
Dim lMenuChosen As Long
'
If Button = vbRightButton Then
Set oMenu = New cPopupMenu
'
' Pass in the desired menu, use '-' for a separator
'
lMenuChosen = oMenu.Popup( " Menu 1 " , " Menu 2 " , " Menu 3 " , _
" - " , " Menu 4 " )
'
Debug.Print lMenuChosen
Debug.Print oMenu.SelMenuString
End If 
'
End Sub 

版权声明:本文为pzhan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。