Option ExplicitPrivate Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Private Declare 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 Private Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPrivate Const SC_CLOSE As Long = &HF060&Private Const GWL_WNDPROC As Long = (-4&)Private Const MF_BYCOMMAND As Long = &H0& Private Const MF_BYPOSITION As Long = &H400& Private Const MF_SEPARATOR As Long = &H800& Private Const MF_CHECKED As Long = &H8& Private Const MF_GRAYED As Long = &H1& Private Const MF_BITMAP = &H4&Private Sub Form_Load() Dim hMenu As Long, hID As Long hMenu = GetSystemMenu(Me.hWnd, 0) 'add a item in first pos InsertMenu hMenu, &H0, MF_BYPOSITION, IDM.a, "演示菜单一"
'add a checked item before close item InsertMenu hMenu, SC_CLOSE, MF_BYCOMMAND + MF_CHECKED, IDM.b, "选择后关闭(&B)" ''add separator after close item InsertMenu hMenu, SC_CLOSE, MF_BYCOMMAND + MF_SEPARATOR, 0&, vbNullString ''add item (after the last item) InsertMenu hMenu, &HFFFFFFFF, 0&, IDM.c, "我要关闭(&N)" ''add a disabled item InsertMenu hMenu, &HFFFFFFFF, MF_GRAYED, IDM.d, "选项(&O)" 'add a separator
procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) procOld = SetWindowLong(hWnd, GWL_WNDPROC, procOld) End Sub '''模块 '****************************************************** '我为人人 '人人为我 '枕善居汉化收藏整理 'http://www.mndsoft.com/blog/ 'e-mail:[email protected] '2005.03.02 '****************************************************** Option ExplicitPublic Enum IDM a = 128 b c d e End Enum Public procOld As Long Private Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) Private Const WM_SYSCOMMAND = &H112Public Function WindowProc(ByVal hWnd As Long, _ ByVal iMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Select Case iMsg Case WM_SYSCOMMAND Select Case wParam Case IDM.a MsgBox "您单击了'演示菜单一',事件:Cliked" Case IDM.b MsgBox "'您单击了'选择后关闭' 事件:Cliked" Case IDM.c MsgBox "好了,再见,欢迎下次光临枕善居", vbInformation, "再见" Unload Form1 Exit Function Case IDM.e MsgBox "您单击了'演示菜单二' 事件:Cliked" End Select End Select WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam) End Function
删除系统菜单时为何"移动"一项删不了? HF012代表什么?Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long Private Const MF_BYCOMMAND As Long = &H0& Private Const SC_MOVE As Long = &HF012 Private Sub Command1_Click() Dim hMenu As Long, hID As Long DeleteMenu hMenu, SC_MOVE, MF_BYCOMMAND DrawMenuBar hMenu procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub
知道了,Private Const SC_MOVE As Long = &HF012 中的"&HF012"改成"&HF010"就OK了.
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare 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
Private Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPrivate Const SC_CLOSE As Long = &HF060&Private Const GWL_WNDPROC As Long = (-4&)Private Const MF_BYCOMMAND As Long = &H0&
Private Const MF_BYPOSITION As Long = &H400&
Private Const MF_SEPARATOR As Long = &H800&
Private Const MF_CHECKED As Long = &H8&
Private Const MF_GRAYED As Long = &H1&
Private Const MF_BITMAP = &H4&Private Sub Form_Load()
Dim hMenu As Long, hID As Long
hMenu = GetSystemMenu(Me.hWnd, 0)
'add a item in first pos
InsertMenu hMenu, &H0, MF_BYPOSITION, IDM.a, "演示菜单一"
'add a checked item before close item
InsertMenu hMenu, SC_CLOSE, MF_BYCOMMAND + MF_CHECKED, IDM.b, "选择后关闭(&B)"
''add separator after close item
InsertMenu hMenu, SC_CLOSE, MF_BYCOMMAND + MF_SEPARATOR, 0&, vbNullString
''add item (after the last item)
InsertMenu hMenu, &HFFFFFFFF, 0&, IDM.c, "我要关闭(&N)"
''add a disabled item
InsertMenu hMenu, &HFFFFFFFF, MF_GRAYED, IDM.d, "选项(&O)"
'add a separator
InsertMenu hMenu, &HFFFFFFFF, MF_BYCOMMAND + MF_SEPARATOR, 0&, vbNullString
InsertMenu hMenu, &HFFFFFFFF, MF_BYPOSITION, IDM.e, "演示菜单二(&L)"
'刷新菜单
DrawMenuBar hMenu
'画图标
hID& = GetMenuItemID(hMenu&, 13)
'SetMenuItemBitmaps hMenu&, hID&, MF_BITMAP, Picture1.Picture, Picture1.Picture
'画图标
hID& = GetMenuItemID(hMenu&, 0)
'SetMenuItemBitmaps hMenu&, hID&, MF_BITMAP, Picture2.Picture, Picture2.Picture
'删除关闭项
DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND
'subclass
procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
procOld = SetWindowLong(hWnd, GWL_WNDPROC, procOld)
End Sub
'''模块
'******************************************************
'我为人人
'人人为我
'枕善居汉化收藏整理
'http://www.mndsoft.com/blog/
'e-mail:[email protected]
'2005.03.02
'******************************************************
Option ExplicitPublic Enum IDM
a = 128
b
c
d
e
End Enum
Public procOld As Long
Private Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
Private Const WM_SYSCOMMAND = &H112Public Function WindowProc(ByVal hWnd As Long, _
ByVal iMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long Select Case iMsg
Case WM_SYSCOMMAND
Select Case wParam
Case IDM.a
MsgBox "您单击了'演示菜单一',事件:Cliked"
Case IDM.b
MsgBox "'您单击了'选择后关闭' 事件:Cliked"
Case IDM.c
MsgBox "好了,再见,欢迎下次光临枕善居", vbInformation, "再见"
Unload Form1
Exit Function
Case IDM.e
MsgBox "您单击了'演示菜单二' 事件:Cliked"
End Select
End Select WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
End Function
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Const MF_BYCOMMAND As Long = &H0&
Private Const SC_MOVE As Long = &HF012
Private Sub Command1_Click()
Dim hMenu As Long, hID As Long
DeleteMenu hMenu, SC_MOVE, MF_BYCOMMAND
DrawMenuBar hMenu
procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub