您好! 
vb.net是用的那一种方法?

解决方案 »

  1.   

    它对菜单的处理是不一样的
    和vc一样!具体怎么样你可以去看一下帮助
    但是在vb里面load(index)是最稳定的,当也如你说的局限性,
    若要实现,多级菜单,你只能去用api函数!
      

  2.   

    api函数我也看过,但似乎不太明白,望赐教两招(特别是顶级菜单与菜单项的关系)
      

  3.   

    To eaglezhao
    你的方法在菜单项固定且以后不会变化的情况下是可行的,但如果菜单项要随系统功能的增减而变化时,就比较麻烦,需要重新编译源程序并要重新安装。
      

  4.   

    可以用CALLBYNAME获得菜单对象,然后设置Private Sub Command1_Click()
        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
      

  5.   

    看看我的:(包括添加、删除菜单,添加、删除菜单项,插入菜单)全部由 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
      

  6.   

    非常感谢 stewen(五分心意,不成敬意)你的方法是用来动态显示窗体上已经存在的菜单,我想知道的是如何在窗体上-- 动态-----生  成(创 建)-----多级菜单,即窗体上原来没有任何菜单!
      

  7.   

    用SELECT CASE进行选项,可根据权限不同,选择菜单。
      

  8.   

    那你还要解决事件的问题!
    CreateMenu VB声明 
    Declare Function CreateMenu Lib "user32" Alias "CreateMenu" () As Long 
    说明 
    创建新菜单 
    返回值 
    Long,如成功则返回新的顶级菜单的句柄;零意味着错误 
    注解 
    最开始创建时,菜单是空的。可用菜单api函数插入菜单条目。一旦菜单不再需要,记住用DestroyMenu将其删除
     
      

  9.   

    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 
    注解 
    如指定的菜单条目依附了一个弹出式菜单,那么整个弹出式菜单都会受到影响
     
      

  10.   

    参考这两个贴之中 老妖的发言
    http://www.csdn.net/expert/topic/397/397906.shtm
    http://www.csdn.net/expert/topic/415/415146.shtm
      

  11.   

    目前VB由于没有MENU组件,我觉的不行。
    你下载一个SmartMenuXP组件,我觉得就可以实现了
    http://www.vbsmart.com/
      

  12.   

    我也一直考虑这个问题,在VB5.0的情况下,由于不支持动态加载控件,所以当时为了实现这种彩旦的自由度高的维护,当时只能用TREEVIEW和LISTVIEW来代替彩旦,VB6.0下,我认为只要有彩旦组件就可以实现了。