您可以使用API函数创建多级子菜单
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 lpNewItem As Any) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) 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, lprc As Any) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hmenu As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim hmenu As Long, hSubMenu As Long
Private Const MF_STRING = &H0&
Private Const MF_SEPARATOR = &H800&
Private Const MF_POPUP = &H10&
hSubMenu = CreatePopupMenu
AppendMenu hSubMenu, 0, 121, "Sub Menu1"
AppendMenu hSubMenu, 0, 122, "Sub Menu2"
hmenu = CreatePopupMenu
AppendMenu hmenu, 0, 107, "Menu1"
AppendMenu hmenu, 0, 106, "Menu2"
AppendMenu hmenu, MF_POPUP, hSubMenu, "Menu3"
AppendMenu hmenu, MF_POPUP, hSubMenu, "Menu4"
AppendMenu hmenu, 0, 101, "Menu5"
显示
If Button = vbRightButton Then
Dim P As POINTAPI
GetCursorPos P
TrackPopupMenu hmenu, 0, P.X, P.Y, 0, hwnd, 0
菜单不会显示,直到TrackPopupMenu
叫做。它的返回值可以指示选择了哪个(如果有)菜单项。例如,如果选择“Menu1”,它可能返回“107”。