我早说过了,用菜单数组就最好解决了
根本用不上什么API函数
你先定义一个菜单项比如是FileList,然后再把它的索引设为0,这样FileList就成为了一个菜单数组,当须要添加菜单项的时候用
Load FileList(1) Load FileList(2).....
动态添加菜单项.如果你非要用API添加菜单的话,可以采用以下方法
'in a form
Public Const WM_GETSYSMENU = &H313
Public Const MF_CHECKED = &H8&
Public Const MF_APPEND = &H100&Public Const TPM_LEFTALIGN = &H0&
Public Const TPM_RIGHTBUTTON = &H2&
Public Const MF_SEPARATOR = &H800&
Public Const MF_STRING = &H0&
Public Const MF_BYPOSITION = &H400&Public Const GWL_WNDPROC = (-4)
Public Const WM_SYSCOMMAND = &H112
Public Const IDM_ABOUT = &H2001
Public Const IDM_TOPMOST = &H2002Private Sub Form_Load()
HwndMenu = GetSystemMenu(Me.hwnd, 0) '获得系统菜单句柄
DeleteMenu HwndMenu, 2, MF_BYPOSITION '删除系统菜单中"大小"
Call AppendMenu(HwndMenu, MF_SEPARATOR, 0&, 0&) '系统菜单中添加横线
Call AppendMenu(HwndMenu, MF_STRING, IDM_ABOUT, "关于该软件(&A)...") '系统菜单中添加"关于.'
Call AppendMenu(HwndMenu, MF_STRING, IDM_TOPMOST, "总在最前(&T)...") '系统菜单中添加"总在最前.'
procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SysMenuProc) '获得原消息处理句柄,并将消息处理转交自定义函数
End Sub
'in a module
'自定义窗体消息处理程序,用来筛选出在系统菜单上添加的菜单项事件
Public Function SysMenuProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static TopMostStatus As Boolean
If iMsg = WM_SYSCOMMAND Then
Select Case wParam
Case IDM_ABOUT
Call ShowAbout
Case IDM_TOPMOST
If TopMostStatus = False Then
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
ModifyMenu HwndMenu, 7, MF_BYPOSITION Or MF_STRING Or MF_CHECKED, IDM_TOPMOST, "总在最前(&T)"
Else
SetWindowPos hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
ModifyMenu HwndMenu, 7, MF_BYPOSITION Or MF_STRING, IDM_TOPMOST, "总在最前(&T)"
End If
TopMostStatus = Not TopMostStatus
Exit Function
End Select
End If
SysMenuProc = CallWindowProc(procOld, hwnd, iMsg, wParam, lParam)
End Function
根本用不上什么API函数
你先定义一个菜单项比如是FileList,然后再把它的索引设为0,这样FileList就成为了一个菜单数组,当须要添加菜单项的时候用
Load FileList(1) Load FileList(2).....
动态添加菜单项.如果你非要用API添加菜单的话,可以采用以下方法
'in a form
Public Const WM_GETSYSMENU = &H313
Public Const MF_CHECKED = &H8&
Public Const MF_APPEND = &H100&Public Const TPM_LEFTALIGN = &H0&
Public Const TPM_RIGHTBUTTON = &H2&
Public Const MF_SEPARATOR = &H800&
Public Const MF_STRING = &H0&
Public Const MF_BYPOSITION = &H400&Public Const GWL_WNDPROC = (-4)
Public Const WM_SYSCOMMAND = &H112
Public Const IDM_ABOUT = &H2001
Public Const IDM_TOPMOST = &H2002Private Sub Form_Load()
HwndMenu = GetSystemMenu(Me.hwnd, 0) '获得系统菜单句柄
DeleteMenu HwndMenu, 2, MF_BYPOSITION '删除系统菜单中"大小"
Call AppendMenu(HwndMenu, MF_SEPARATOR, 0&, 0&) '系统菜单中添加横线
Call AppendMenu(HwndMenu, MF_STRING, IDM_ABOUT, "关于该软件(&A)...") '系统菜单中添加"关于.'
Call AppendMenu(HwndMenu, MF_STRING, IDM_TOPMOST, "总在最前(&T)...") '系统菜单中添加"总在最前.'
procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SysMenuProc) '获得原消息处理句柄,并将消息处理转交自定义函数
End Sub
'in a module
'自定义窗体消息处理程序,用来筛选出在系统菜单上添加的菜单项事件
Public Function SysMenuProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static TopMostStatus As Boolean
If iMsg = WM_SYSCOMMAND Then
Select Case wParam
Case IDM_ABOUT
Call ShowAbout
Case IDM_TOPMOST
If TopMostStatus = False Then
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
ModifyMenu HwndMenu, 7, MF_BYPOSITION Or MF_STRING Or MF_CHECKED, IDM_TOPMOST, "总在最前(&T)"
Else
SetWindowPos hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
ModifyMenu HwndMenu, 7, MF_BYPOSITION Or MF_STRING, IDM_TOPMOST, "总在最前(&T)"
End If
TopMostStatus = Not TopMostStatus
Exit Function
End Select
End If
SysMenuProc = CallWindowProc(procOld, hwnd, iMsg, wParam, lParam)
End Function
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货