现在form 添加一个listbox
Option ExplicitPrivate Sub Form_Load()
List1.AddItem "Right-Click here for a menu"
End SubPrivate 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 5", ".Menu 6", ".Menu 7", "Menu 8", "Menu 9", ".Menu 10", "..Menu 11")
Debug.Print lMenuChosen
End If
End Sub然后添加一个类 名字叫cPopupMenu
Option Explicit
'微风软件
Private Type POINT
x As Long
y As Long
End Type
Private Const MF_BYPOSITION = &H400&
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 Const MF_CHECKED = &H8&
Private Const MF_APPEND = &H100&
Private Const MF_DISABLED = &H2&
Private Const MF_GRAYED = &H1&
Private Const MF_POPUP = &H10&
Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
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 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 Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
Private C As New Collection
Private LMenu As String '上一级菜单名字'
Public Function Popup(ParamArray param()) As Long
Dim iMenu As Long
Dim hMenu As Long
Dim nMenus As Long
Dim lMenus As Long
Dim hFileSubMenu As Long
Dim p As POINT
GetCursorPos p
hMenu = CreatePopupMenu()
nMenus = 1 + UBound(param)
lMenus = hMenu
hFileSubMenu = CreatePopupMenu()
C.Add hMenu
For iMenu = 1 To nMenus
InsertM CStr(param(iMenu - 1)), hMenu, iMenu, 1 '穷举菜单
Next iMenu
iMenu = TrackPopupMenu(hMenu, TPM_RIGHTBUTTON + TPM_LEFTALIGN + TPM_NONOTIFY + TPM_RETURNCMD, p.x, p.y, 0, GetForegroundWindow(), 0)
DestroyMenu hMenu
Popup = iMenu
End FunctionPublic Function InsertM(Str As String, Mmenu As Long, iMenu As Long, Ci As Integer) As Long
Dim s As String
Dim i As Integer
If Trim$(Str) = "-" Or Trim$(Str) = "" Then
AppendMenu Mmenu, MF_SEPARATOR, iMenu, ""
LMenu = CStr(Trim(Str))
For i = C.Count To Ci + 1 Step -1
DestroyMenu C.Item(i)
C.Remove i
Next i
InsertM = Ci
Else
If Left(Trim(Str), 1) = "." Then
If Ci = C.Count Then
Dim InsertMenu As Long
InsertMenu = CreatePopupMenu()
ModifyMenu Mmenu, iMenu - 1, MF_POPUP, InsertMenu, LMenu
C.Add InsertMenu
End If
Ci = Ci + 1
s = Right(Str, Len(Str) - 1)
InsertM = InsertM(s, C.Item(Ci), iMenu, Ci)
Else
AppendMenu Mmenu, MF_STRING + MF_ENABLED + MF_CHECKED, iMenu, CStr(Trim(Str))
LMenu = CStr(Trim(Str))
For i = C.Count To Ci + 1 Step -1
DestroyMenu C.Item(i)
C.Remove i
Next i
InsertM = Ci
End If
End If
End Function
之前在其他网址上找到类似的代码他那个不支持多级菜单的我这个支持
Option ExplicitPrivate Sub Form_Load()
List1.AddItem "Right-Click here for a menu"
End SubPrivate 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 5", ".Menu 6", ".Menu 7", "Menu 8", "Menu 9", ".Menu 10", "..Menu 11")
Debug.Print lMenuChosen
End If
End Sub然后添加一个类 名字叫cPopupMenu
Option Explicit
'微风软件
Private Type POINT
x As Long
y As Long
End Type
Private Const MF_BYPOSITION = &H400&
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 Const MF_CHECKED = &H8&
Private Const MF_APPEND = &H100&
Private Const MF_DISABLED = &H2&
Private Const MF_GRAYED = &H1&
Private Const MF_POPUP = &H10&
Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
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 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 Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
Private C As New Collection
Private LMenu As String '上一级菜单名字'
Public Function Popup(ParamArray param()) As Long
Dim iMenu As Long
Dim hMenu As Long
Dim nMenus As Long
Dim lMenus As Long
Dim hFileSubMenu As Long
Dim p As POINT
GetCursorPos p
hMenu = CreatePopupMenu()
nMenus = 1 + UBound(param)
lMenus = hMenu
hFileSubMenu = CreatePopupMenu()
C.Add hMenu
For iMenu = 1 To nMenus
InsertM CStr(param(iMenu - 1)), hMenu, iMenu, 1 '穷举菜单
Next iMenu
iMenu = TrackPopupMenu(hMenu, TPM_RIGHTBUTTON + TPM_LEFTALIGN + TPM_NONOTIFY + TPM_RETURNCMD, p.x, p.y, 0, GetForegroundWindow(), 0)
DestroyMenu hMenu
Popup = iMenu
End FunctionPublic Function InsertM(Str As String, Mmenu As Long, iMenu As Long, Ci As Integer) As Long
Dim s As String
Dim i As Integer
If Trim$(Str) = "-" Or Trim$(Str) = "" Then
AppendMenu Mmenu, MF_SEPARATOR, iMenu, ""
LMenu = CStr(Trim(Str))
For i = C.Count To Ci + 1 Step -1
DestroyMenu C.Item(i)
C.Remove i
Next i
InsertM = Ci
Else
If Left(Trim(Str), 1) = "." Then
If Ci = C.Count Then
Dim InsertMenu As Long
InsertMenu = CreatePopupMenu()
ModifyMenu Mmenu, iMenu - 1, MF_POPUP, InsertMenu, LMenu
C.Add InsertMenu
End If
Ci = Ci + 1
s = Right(Str, Len(Str) - 1)
InsertM = InsertM(s, C.Item(Ci), iMenu, Ci)
Else
AppendMenu Mmenu, MF_STRING + MF_ENABLED + MF_CHECKED, iMenu, CStr(Trim(Str))
LMenu = CStr(Trim(Str))
For i = C.Count To Ci + 1 Step -1
DestroyMenu C.Item(i)
C.Remove i
Next i
InsertM = Ci
End If
End If
End Function
之前在其他网址上找到类似的代码他那个不支持多级菜单的我这个支持
SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long
函数来给菜单添加图片,不喜欢用默认的Checked图标....