如下,这是我刚写的:
VB->加一个EXE工程->加一个Form-->加一个菜单项(name:menFile,Index:0)
把下面的代码写入:
Option Explicit
Dim hSecondMenu As Long
Private Sub a_Click(Index As Integer)End SubPrivate Sub Form_Load()
    AddtoDynPop
End SubPrivate Sub CreateOwnMenu(ByVal strNodeXML As String)
    Dim i As Integer
    
    Dim oDom As New MSXML2.DOMDocument
    oDom.loadXML (strNodeXML)
    
    Dim hFirstMenu As Long
    Dim lThirdMenu As Long
    
    Dim strTitle As String
    
    Dim hMenu As Long
    hMenu = GetMenu(Me.hwnd)    If (oDom.documentElement.hasChildNodes = False) Then   '无子菜单时,显示菜单
        Select Case oDom.documentElement.Attributes.getNamedItem("Level").nodeValue
            Case "1":
                AddNewMenu hwnd, oDom.documentElement.Attributes.getNamedItem("Title").nodeValue, True
            Case "2"
                InsertNewSubMenu Me.hwnd, oDom.documentElement.Attributes.getNamedItem("Parent").nodeValue, _
                oDom.documentElement.Attributes.getNamedItem("No").nodeValue, oDom.documentElement.Attributes.getNamedItem("Title").nodeValue
            Case "3"
                strTitle = oDom.documentElement.Attributes.getNamedItem("Title").nodeValue
                AppendMenu hSecondMenu, MF_STRING, ByVal 0&, strTitle '增加第三级菜单
        End Select
    Else '有子菜单
        Select Case oDom.documentElement.Attributes.getNamedItem("Level").nodeValue
            Case "1":
                AddNewMenu hwnd, oDom.documentElement.Attributes.getNamedItem("Title").nodeValue, True
            Case "2"
                hFirstMenu = GetSubMenu(hMenu, oDom.documentElement.Attributes.getNamedItem("Parent").nodeValue)
                hSecondMenu = CreatePopupMenu() '创建有第三级菜单的菜单条
                
                For i = 0 To oDom.documentElement.childNodes.length - 1
                    CreateOwnMenu (oDom.documentElement.childNodes.Item(i).xml)
                Next
                strTitle = oDom.documentElement.Attributes.getNamedItem("Title").nodeValue
                AppendMenu hFirstMenu, MF_POPUP, hSecondMenu, strTitle
                Exit Sub
            Case "3"
        End Select
        For i = 0 To oDom.documentElement.childNodes.length - 1
            CreateOwnMenu (oDom.documentElement.childNodes.Item(i).xml)
        Next
    End If
End Sub
Private Sub AddtoDynPop()
    
    Dim oDom As New MSXML2.DOMDocument
    Dim i As Integer
    
    oDom.Load (App.Path + "\" + "Menu.xml")
    If (oDom.parseError.errorCode <> 0) Then
        MsgBox ("菜单文件格式错误,错误原因:" + oDom.parseError.reason)
        Exit Sub
    End If
    Dim oNodeList As IXMLDOMNodeList
    Dim oNode As IXMLDOMNode
    Set oNodeList = oDom.documentElement.selectNodes("//MenuBar")
    For i = 0 To oNodeList.length - 1
        Set oNode = oNodeList.Item(i)
        CreateOwnMenu (oNode.xml)
    Next
End Sub
 
Private Sub menFile_Click(Index As Integer)
    MsgBox "Hello"
End Sub'privatePrivate Sub menFile_EditPassword_Click(Index As Integer)End SubPrivate Sub menFile_Switch_Click(Index As Integer)End Sub
续:

解决方案 »

  1.   


    Modules 文件:
    Option Explicit
    '///////////////////////////////////////////
    '//     Rados砤w Frankowski 14.04.1999    //
    '//        [email protected]        //
    '//    vb4all.canpol.pl/api/default.htm   //
    '///////////////////////////////////////////'Obs硊ga menu: dodawanie nowego, zamiana, kasowanie, bitmapy, t硂Public Declare Function GetMenu Lib "user32" _
      (ByVal hwnd As Long) As Long
    Public Declare Function SetMenu Lib "user32" _
      (ByVal hwnd As Long, ByVal hMenu As Long) As Long
    Public Declare Function GetSubMenu Lib "user32" _
      (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Public 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
    Public Declare Function GetMenuItemID Lib "user32" _
      (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Public Declare Function RemoveMenu Lib "user32" _
      (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Public 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
    Public 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
    Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
    Public Declare Function CreateMenu Lib "user32" () As Long
    Public Declare Function CreatePopupMenu Lib "user32" () As Long
    Public Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As LongPublic Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
      (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, _
      ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long'SetMenuItemBitmaps
    Public Const MF_BYCOMMAND = &H0&
    Public Const MF_BYPOSITION = &H400&Public Const MF_BITMAP = &H4&
    Public Const MF_STRING = &H0&
    Public Const MF_ENABLED = &H0&
    Public Const MF_POPUP = &H10&
    Public Const MF_SEPARATOR = &H800&'LoadImage
    Public Const LR_LOADMAP3DCOLORS = &H1000
    Public Const LR_LOADFROMFILE = &H10
    Public Const LR_LOADTRANSPARENT = &H20
    Public Const IMAGE_BITMAP = 0Private Function LoadBmp(sFile As String) As Long
      'wczytuje podany plik i zwraca uchwyt do bitmapy
      Dim hBmp As Long
      hBmp = LoadImage(0, sFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE Or _
        LR_LOADMAP3DCOLORS Or LR_LOADTRANSPARENT)
      LoadBmp = hBmp
    End FunctionPublic Function SetMenuBmp(hForm As Long, bmpFile As String, _
      Optional idMenu As Long = 0, Optional idSubMenu = 0) As Boolean
      'hFomr - uchwyt do formy
      'bmpFile - nazwa pliku gdzie jest bitmapa
      'idMenu - o kt髍e menu g丑wne chodzi
      'idSubMenu - o kt髍e podmenu chodzi
      Dim hMenu As Long
      Dim hSubMenu As Long
      Dim hID As Long
      Dim hBmp As Long
      Dim hRet As Long
      
      hBmp = LoadBmp(bmpFile)
      hMenu = GetMenu(hForm)
      hSubMenu = GetSubMenu(hMenu, idMenu)
      'hID = GetMenuItemID(hSubMenu, idSubMenu)
      'hRet = SetMenuItemBitmaps(hMenu, hID, MF_BYCOMMAND, hBmp, hBmp)
      hRet = SetMenuItemBitmaps(hSubMenu, idSubMenu, MF_BYPOSITION, hBmp, hBmp)
      SetMenuBmp = hRet
    End FunctionPublic Function DeleteMenu(hForm As Long, Optional idMenu As Long = 0, _
      Optional idSubMenu = 0) As Boolean
      
      Dim hMenu As Long
      Dim hSubMenu As Long
      Dim hID As Long
      Dim hRet As Long
      
      hMenu = GetMenu(hForm)
      hSubMenu = GetSubMenu(hMenu, idMenu)
    '  hID = GetMenuItemID(hSubMenu, idSubMenu)
    '  hRet = RemoveMenu(hMenu, hID, MF_BYCOMMAND)
      hRet = RemoveMenu(hSubMenu, idSubMenu, MF_BYPOSITION)
      DeleteMenu = hRet
    End FunctionPublic Function AddNewMenu(hForm As Long, sMenuName As String, Optional PopUp As Boolean = False) As Boolean
      Dim hMenu As Long
      Dim hRet As Long
      Dim hPopUpMenu As Long
      hMenu = GetMenu(hForm)
      If PopUp Then 'je渓i chcemy 縠by menu mia硂 podmenu
        hPopUpMenu = CreatePopupMenu
        hRet = AppendMenu(hMenu, MF_STRING Or MF_POPUP, hPopUpMenu, sMenuName)
      Else
        hRet = AppendMenu(hMenu, MF_STRING, 0, sMenuName)
      End If
      DrawMenuBar hForm 'od渨ie縠nie menu
      AddNewMenu = hRet
    End FunctionPublic Function InsertNewSubMenu(hForm As Long, idMenu As Long, lPos As Long, _
      sMenuName As String, Optional PopUp As Boolean = False) As Long
      Dim hMenu As Long
      Dim hRet As Long
      Dim hSubMenu As Long
      Dim hPopUpMenu As Long
      hMenu = GetMenu(hForm)
      hSubMenu = GetSubMenu(hMenu, idMenu)
      If sMenuName = "-" Then
        hRet = InsertMenu(hSubMenu, lPos, MF_STRING Or MF_BYPOSITION Or MF_SEPARATOR, 0, sMenuName)
      Else
        If PopUp Then
          hPopUpMenu = CreatePopupMenu
          hRet = InsertMenu(hSubMenu, lPos, MF_STRING Or MF_BYPOSITION Or MF_POPUP, hPopUpMenu, sMenuName)
        Else
          hRet = InsertMenu(hSubMenu, lPos, MF_STRING Or MF_BYPOSITION, 0, sMenuName)
        End If
      End If
      DrawMenuBar hForm 'od渨ie縠nie menu
      InsertNewSubMenu = hRet
    End FunctionPublic Function InsertNewMenu(hForm As Long, idMenu As Long, sMenuName As String) As Long
      Dim hMenu As Long
      Dim hRet As Long
      
      hMenu = GetMenu(hForm)
      hRet = InsertMenu(hMenu, idMenu, MF_BYPOSITION Or MF_STRING, 0, sMenuName)
      DrawMenuBar hForm 'od渨ie縠nie menu
      InsertNewMenu = hRet
    End FunctionPublic Function DelMenu(hForm As Long) As Boolean
      Dim hMenu As Long
      Dim hRet As Long
      hMenu = GetMenu(hForm)
      hRet = DestroyMenu(hMenu)
      DrawMenuBar hForm 'od渨ie縠nie menu
      DelMenu = hRet
    End FunctionPublic Function CreateNewMenu() As Boolean
      Dim hRet As Long
      hRet = CreateMenu
      CreateNewMenu = hRet
    End Function
    续:
      

  2.   

    <?xml version="1.0" encoding="gb2312"?>
    <Menu>
       <MenuBar No="1" Title="系统维护" Level="1">
    <FirstMenu Parent="1" No="0" Title="操作员维护" Level="2"></FirstMenu>
    <FirstMenu Parent="1" No="1" Title="客户维护" Level="2"></FirstMenu>
    <FirstMenu Parent="1" No="2" Title="仓库维护" Level="2"></FirstMenu>
    <FirstMenu Parent="1" No="3" Title="货品资料维护" Level="2"></FirstMenu>
    <FirstMenu Parent="1" No="4" Title="新增销售订单" Level="2"></FirstMenu>
       </MenuBar>
       <MenuBar No="2" Title="基本资料管理" Level="1"></MenuBar>
       <MenuBar No="3" Title="销售管理" Level="1">
    <FirstMenu Parent="3" No="0" Title="新增销售订单" Level="2"></FirstMenu>     
    <FirstMenu Parent="3" No="1" Title="修改/作废销售订单" Level="2"></FirstMenu>     
    <FirstMenu Parent="3" No="2" Title="新增发货单" Level="2"></FirstMenu>     
    <FirstMenu Parent="3" No="3" Title="作废发货单" Level="2"></FirstMenu>     
    <FirstMenu Parent="3" No="4" Title="报表" Level="2">
        <SecondMenu Parent="3" Title="销售日报表" Level="3"/>
        <SecondMenu Parent="3" Title="销售月报表" Level="3"/>
        <SecondMenu Parent="3" Title="销售年报表" Level="3"/>
        <SecondMenu Parent="3" Title="发货报表" Level="3"/>
        <SecondMenu Parent="3" Title="销售订单报表" Level="3"/>
    </FirstMenu>
       </MenuBar>
       <MenuBar No="4" Title="库存管理" Level="1">
    <FirstMenu Parent="4" No="1" Title="新增入库单" Level="2"/>
    <FirstMenu Parent="4" No="2" Title="作废入库单" Level="2"/>
    <FirstMenu Parent="4" No="3" Title="-----------------" Level="2"/>
    <FirstMenu Parent="4" No="4" Title="新增出库单" Level="2"/>
    <FirstMenu Parent="4" No="5" Title="作废出库单" Level="2"/>
    <FirstMenu Parent="4" No="6" Title="报表" Level="2">
               <SecondMenu Parent="4" Title="库存报表" Level="3"/>
    </FirstMenu>
       </MenuBar>   <MenuBar No="5" Title="采购管理" Level="1"></MenuBar>
    </Menu>
      

  3.   

    非常感谢你们,可XML文件从那里可找到
      

  4.   

    API生成的菜单如何POPUPMENU,如何出发事件呢