'************************* Form1 的代码 Option Explicit Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long '**************************************** 自制菜单用到的API 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 DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function CreatePopupMenu Lib "user32" () 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, ByVal lprc As Any) As Long '***************************************************** Const MF_CHECKED = &H8& Const MF_APPEND = &H100& Const TPM_LEFTALIGN = &H0& Const MF_DISABLED = &H2& Const MF_GRAYED = &H1& Const MF_SEPARATOR = &H800& Const MF_STRING = &H0& Private Type POINTAPI X As Long Y As Long End Type Dim mSubMenu& Private Sub Form_Load() mSubMenu = CreatePopupMenu() AppendMenu mSubMenu, MF_STRING, 100, "菜单 1" AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0& AppendMenu mSubMenu, MF_STRING, 101, "菜单 2" AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0& AppendMenu mSubMenu, MF_STRING, 102, "退 出" OldProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf WndProc) End SubPrivate Sub Form_Unload(Cancel As Integer) DestroyMenu mSubMenu SetWindowLong Me.Hwnd, GWL_WNDPROC, OldProc End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim Pt As POINTAPI GetCursorPos Pt If Button = 2 Then TrackPopupMenu mSubMenu, TPM_LEFTALIGN, Pt.X, Pt.Y, 0, Me.Hwnd, ByVal 0& End Sub '*********************************Module1.bas 的代码 Option Explicit Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const BN_CLICKED = 0 Public Const WM_COMMAND = &H111 Public Const GWL_WNDPROC = (-4) Public OldProc& Public Function WndProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_COMMAND Then If (wParam And &HFFFF0000) = BN_CLICKED Then Select Case wParam And &HFFFF Case 100 MsgBox "您选择了菜单1" Case 101 MsgBox "您选择了菜单2" Case 102 Unload Form1 End Select End If Else WndProc = CallWindowProc(OldProc, Hwnd, Msg, wParam, lParam) End If End Function
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'**************************************** 自制菜单用到的API
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 DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function CreatePopupMenu Lib "user32" () 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, ByVal lprc As Any) As Long
'*****************************************************
Const MF_CHECKED = &H8&
Const MF_APPEND = &H100&
Const TPM_LEFTALIGN = &H0&
Const MF_DISABLED = &H2&
Const MF_GRAYED = &H1&
Const MF_SEPARATOR = &H800&
Const MF_STRING = &H0&
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim mSubMenu&
Private Sub Form_Load()
mSubMenu = CreatePopupMenu()
AppendMenu mSubMenu, MF_STRING, 100, "菜单 1"
AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0&
AppendMenu mSubMenu, MF_STRING, 101, "菜单 2"
AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0&
AppendMenu mSubMenu, MF_STRING, 102, "退 出"
OldProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf WndProc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
DestroyMenu mSubMenu
SetWindowLong Me.Hwnd, GWL_WNDPROC, OldProc
End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
If Button = 2 Then TrackPopupMenu mSubMenu, TPM_LEFTALIGN, Pt.X, Pt.Y, 0, Me.Hwnd, ByVal 0&
End Sub
'*********************************Module1.bas 的代码
Option Explicit
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const BN_CLICKED = 0
Public Const WM_COMMAND = &H111
Public Const GWL_WNDPROC = (-4)
Public OldProc&
Public Function WndProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_COMMAND Then
If (wParam And &HFFFF0000) = BN_CLICKED Then
Select Case wParam And &HFFFF
Case 100
MsgBox "您选择了菜单1"
Case 101
MsgBox "您选择了菜单2"
Case 102
Unload Form1
End Select
End If
Else
WndProc = CallWindowProc(OldProc, Hwnd, Msg, wParam, lParam)
End If
End Function