Dim objMenu As Menu Dim sa() As String Dim pa() As String Dim i As Long
sa = Split(MenuNames, ";") pa = Split(Permissions, ";") For i = 0 To UBound(sa) Set objMenu = CallByName(Me, sa(i), VbGet) objMenu.Enabled = CBool(pa(i)) Next
End Sub
看看我的:(包括添加、删除菜单,添加、删除菜单项,插入菜单)全部由 API 实现 要是满意的话,请加分 Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) 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 GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) 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 LongPrivate Type POINTAPI X As Long Y As Long End Type Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Sub a_Click() Debug.Print a.Caption End SubPrivate Sub b_Click() Debug.Print b.Caption End SubPrivate Sub c_Click() Debug.Print c.Caption End SubPrivate Sub Command1_Click() Dim hMenu As Long Dim hMenu1 As Long Dim hMenu2 As Long Dim hCount As Long Dim sMenu As String * 255hMenu = GetMenu(Me.hwnd) hMenu1 = GetSubMenu(hMenu, 0) hMenu2 = GetSubMenu(hMenu, 1)hCount = GetMenuItemCount(hMenu2)Dim i As LongFor i = 0 To hCount - 1 GetMenuString hMenu2, i, sMenu, 255, &H400 sMenu = Left(sMenu, InStr(sMenu, Chr(0))) AppendMenu hMenu1, 0, GetMenuItemID(hMenu2, i), sMenu Next For i = 0 To hCount - 1 RemoveMenu hMenu2, 0, &H400 Next Dim p As POINTAPIGetCursorPos pTrackPopupMenu hMenu1, 2, p.X, p.Y, 0, Me.hwnd, ByVal 0& End SubPrivate Sub f_Click() Debug.Print f.Caption End SubPrivate Sub G_Click() Debug.Print G.Caption End Sub
那你还要解决事件的问题! CreateMenu VB声明 Declare Function CreateMenu Lib "user32" Alias "CreateMenu" () As Long 说明 创建新菜单 返回值 Long,如成功则返回新的顶级菜单的句柄;零意味着错误 注解 最开始创建时,菜单是空的。可用菜单api函数插入菜单条目。一旦菜单不再需要,记住用DestroyMenu将其删除
AppendMenu VB声明 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 说明 在指定的菜单里添加一个菜单项 返回值 Long,非零表示成功,零表示失败。会设置GetLastError 参数表 参数 类型及说明 hMenu Long,菜单句柄 wFlags Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数 wIDNewItem Long,指定菜单条目的新命令ID。如果在wFlags参数中指定了MF_POPUP字段,那么这应该是指向一个弹出式菜单的句柄 lpNewItem String(相应的vb声明见注解),如果在wFlags参数中指定了MF_STRING标志,这就代表在菜单中设置的字串。如设置了MF_BITMAP标志,这就代表一个Long型变量,其中包含了一个位图句柄。如设置了MF_OWNERDRAW,这个值就会包括在DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,在条目需要重画的时候由windows发送出去 注解 Declare Function AppendMenu& Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String)
GetMenu VB声明 Declare Function GetMenu Lib "user32" Alias "GetMenu" (ByVal hwnd As Long) As Long 说明 取得窗口中一个菜单的句柄 返回值 Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零 参数表 参数 类型及说明 hwnd Long,窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄 EnableMenuItem VB声明 Declare Function EnableMenuItem Lib "user32" Alias "EnableMenuItem" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long 说明 允许或禁止指定的菜单条目(在vb里使用:由这个函数做出的改动可以正常发挥作用,但不会由vb菜单的enabled属性反映出来) 返回值 Long, 参数表 参数 类型及说明 hMenu Long,菜单句柄 wIDEnableItem Long,欲允许或禁止的一个菜单条目的标识符。如果在wEnable参数中设置了MF_BYCOMMAND标志,这个参数就代表欲改变菜单条目的命令ID。如设置的是MF_BYPOSITION,则这个参数代表菜单条目在菜单中的位置(第一个条目肯定是零) wEnable Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数。对于这个函数,只能指定下述常数:MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,MF_DISABLED以及MF_GRAYED 注解 如指定的菜单条目依附了一个弹出式菜单,那么整个弹出式菜单都会受到影响
和vc一样!具体怎么样你可以去看一下帮助
但是在vb里面load(index)是最稳定的,当也如你说的局限性,
若要实现,多级菜单,你只能去用api函数!
你的方法在菜单项固定且以后不会变化的情况下是可行的,但如果菜单项要随系统功能的增减而变化时,就比较麻烦,需要重新编译源程序并要重新安装。
Const MenuNames = "mnu1;mnu2"
Const Permissions = "True;False"
Dim objMenu As Menu
Dim sa() As String
Dim pa() As String
Dim i As Long
sa = Split(MenuNames, ";")
pa = Split(Permissions, ";")
For i = 0 To UBound(sa)
Set objMenu = CallByName(Me, sa(i), VbGet)
objMenu.Enabled = CBool(pa(i))
Next
End Sub
要是满意的话,请加分
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) 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 GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) 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 LongPrivate Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Sub a_Click()
Debug.Print a.Caption
End SubPrivate Sub b_Click()
Debug.Print b.Caption
End SubPrivate Sub c_Click()
Debug.Print c.Caption
End SubPrivate Sub Command1_Click()
Dim hMenu As Long
Dim hMenu1 As Long
Dim hMenu2 As Long
Dim hCount As Long
Dim sMenu As String * 255hMenu = GetMenu(Me.hwnd)
hMenu1 = GetSubMenu(hMenu, 0)
hMenu2 = GetSubMenu(hMenu, 1)hCount = GetMenuItemCount(hMenu2)Dim i As LongFor i = 0 To hCount - 1
GetMenuString hMenu2, i, sMenu, 255, &H400
sMenu = Left(sMenu, InStr(sMenu, Chr(0)))
AppendMenu hMenu1, 0, GetMenuItemID(hMenu2, i), sMenu
Next
For i = 0 To hCount - 1
RemoveMenu hMenu2, 0, &H400
Next
Dim p As POINTAPIGetCursorPos pTrackPopupMenu hMenu1, 2, p.X, p.Y, 0, Me.hwnd, ByVal 0&
End SubPrivate Sub f_Click()
Debug.Print f.Caption
End SubPrivate Sub G_Click()
Debug.Print G.Caption
End Sub
CreateMenu VB声明
Declare Function CreateMenu Lib "user32" Alias "CreateMenu" () As Long
说明
创建新菜单
返回值
Long,如成功则返回新的顶级菜单的句柄;零意味着错误
注解
最开始创建时,菜单是空的。可用菜单api函数插入菜单条目。一旦菜单不再需要,记住用DestroyMenu将其删除
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
说明
在指定的菜单里添加一个菜单项
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hMenu Long,菜单句柄
wFlags Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数
wIDNewItem Long,指定菜单条目的新命令ID。如果在wFlags参数中指定了MF_POPUP字段,那么这应该是指向一个弹出式菜单的句柄
lpNewItem String(相应的vb声明见注解),如果在wFlags参数中指定了MF_STRING标志,这就代表在菜单中设置的字串。如设置了MF_BITMAP标志,这就代表一个Long型变量,其中包含了一个位图句柄。如设置了MF_OWNERDRAW,这个值就会包括在DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,在条目需要重画的时候由windows发送出去
注解
Declare Function AppendMenu& Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String)
GetMenu VB声明
Declare Function GetMenu Lib "user32" Alias "GetMenu" (ByVal hwnd As Long) As Long
说明
取得窗口中一个菜单的句柄
返回值
Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零
参数表
参数 类型及说明
hwnd Long,窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄 EnableMenuItem VB声明
Declare Function EnableMenuItem Lib "user32" Alias "EnableMenuItem" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
说明
允许或禁止指定的菜单条目(在vb里使用:由这个函数做出的改动可以正常发挥作用,但不会由vb菜单的enabled属性反映出来)
返回值
Long,
参数表
参数 类型及说明
hMenu Long,菜单句柄
wIDEnableItem Long,欲允许或禁止的一个菜单条目的标识符。如果在wEnable参数中设置了MF_BYCOMMAND标志,这个参数就代表欲改变菜单条目的命令ID。如设置的是MF_BYPOSITION,则这个参数代表菜单条目在菜单中的位置(第一个条目肯定是零)
wEnable Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数。对于这个函数,只能指定下述常数:MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,MF_DISABLED以及MF_GRAYED
注解
如指定的菜单条目依附了一个弹出式菜单,那么整个弹出式菜单都会受到影响
http://www.csdn.net/expert/topic/397/397906.shtm
http://www.csdn.net/expert/topic/415/415146.shtm
你下载一个SmartMenuXP组件,我觉得就可以实现了
http://www.vbsmart.com/