这个我也想到了,但我不知道用MENUITEMINFO结构中的哪个属性 Public Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long '会不会是这个呢,如果是的话又是怎么判断呢?不知道是不是Public Const MF_UNCHECKED = &H0& Public Const MF_CHECKED = &H8&这两个? wID As Long hSubMenu As Long hbmpChecked As Long '我刚开始用的是这个,但好像不对啊 hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type能不能给个具体的代码啊?
Public Const MF_UNCHECKED = &H0& Public Const MF_CHECKED = &H8&就是上面这两个。 看fState,具体的可以查MSDN,我现在用的别人的机器,给代码不太方便。 :(如果能等到十一我回家上网,我肯定给你代码。 :)
自己终于完成了,虽然是个笨办法,但总比没有好啊。 以下是我程序中的一段代码,相信一看就能懂的(其它的如:添加菜单项到系统菜单、API的声明等略)。 Public 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_ALWAYSONTOP '“总在最前”菜单 Dim lhSysMenu As Long '存放系统菜单的句柄 Static blnAlwaysOnTop As Boolean '保存“总在最前”的状态的变量 lhSysMenu = GetSystemMenu(frmMusic.hwnd, 0&) '获取系统菜单句柄 blnAlwaysOnTop = Not blnAlwaysOnTop '改变“总在最前”变量的状态 Call AlwaysOnTop(frmMusic.hwnd, blnAlwaysOnTop) '设置或取消窗口总在最前 If blnAlwaysOnTop = True Then '设置“总在最前”菜单的复选标记 Call ModifyMenu(lhSysMenu, 1, MF_CHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)") Else '取消“总在最前”菜单的复选标记 Call ModifyMenu(lhSysMenu, 1, MF_UNCHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)") End If Exit Function Case IDM_REFRESH '“刷新”菜单 Call frmMusic.RefreshData '刷新数据内容 Exit Function End Select End Select WindowProc = CallWindowProc(ProcOld, hwnd, iMsg, wParam, lParam) End Function
不是的啦,菜单项是在程序启动时就加进去的,但在需要改变checked时就重画这个菜单项而已, 后来又找到一种更好的方法: Public Declare Function CheckMenuItem Lib "user32.dll" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
Public Declare Function CheckMenuItem Lib "user32.dll" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long这个函数我倒是还真没想起来,呵呵。 :)
MsgBox menuname(1).Checked
Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long '会不会是这个呢,如果是的话又是怎么判断呢?不知道是不是Public Const MF_UNCHECKED = &H0& Public Const MF_CHECKED = &H8&这两个?
wID As Long
hSubMenu As Long
hbmpChecked As Long '我刚开始用的是这个,但好像不对啊
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type能不能给个具体的代码啊?
Public Const MF_CHECKED = &H8&就是上面这两个。
看fState,具体的可以查MSDN,我现在用的别人的机器,给代码不太方便。 :(如果能等到十一我回家上网,我肯定给你代码。 :)
以下是我程序中的一段代码,相信一看就能懂的(其它的如:添加菜单项到系统菜单、API的声明等略)。
Public 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_ALWAYSONTOP '“总在最前”菜单
Dim lhSysMenu As Long '存放系统菜单的句柄
Static blnAlwaysOnTop As Boolean '保存“总在最前”的状态的变量
lhSysMenu = GetSystemMenu(frmMusic.hwnd, 0&) '获取系统菜单句柄
blnAlwaysOnTop = Not blnAlwaysOnTop '改变“总在最前”变量的状态
Call AlwaysOnTop(frmMusic.hwnd, blnAlwaysOnTop) '设置或取消窗口总在最前
If blnAlwaysOnTop = True Then
'设置“总在最前”菜单的复选标记
Call ModifyMenu(lhSysMenu, 1, MF_CHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)")
Else
'取消“总在最前”菜单的复选标记
Call ModifyMenu(lhSysMenu, 1, MF_UNCHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)")
End If
Exit Function
Case IDM_REFRESH '“刷新”菜单
Call frmMusic.RefreshData '刷新数据内容
Exit Function
End Select
End Select
WindowProc = CallWindowProc(ProcOld, hwnd, iMsg, wParam, lParam)
End Function
后来又找到一种更好的方法:
Public Declare Function CheckMenuItem Lib "user32.dll" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long