有这样一个菜单如下:
文件 分类
     一类
     二类
         大类
         中类
         小类
     三类
         1类
         2类
     四类其中大中小类在二类菜单级下,1类2类在三类菜单级下,一二三四在分类菜单下
现在需要根据点击率来动态给菜单排序,即在配置文件中记录每个菜单的点击次数,在下次打开时分类主菜单下的子菜单按照点击率由高至低显示,这样每次初始化时都要重新加载菜单,而二类三类位置变化时,它的子菜单也要跟着,请问该怎么写,最好给代码,高手帮忙菜单中的名称都已经固定,不能修改,好像不能用菜单数组方式了

解决方案 »

  1.   

    网上找了一个动态加载菜单的代码,用API的
    Option Explicit
      Const WM_COMMAND = &H111
      Const MF_BYPOSITION = &H400&
      Const MF_STRING = &H0&
      Const MF_POPUP = &H10&
          
      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 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
      Private Declare Function CreatePopupMenu Lib "user32" () As Long
      Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
          
      Dim hPopMenu     As Long, hFileMenu       As Long, hPopMenu2       As Long
          
      Private Sub Form_Load()
              hFileMenu = GetSubMenu(GetMenu(hwnd), 0)
              hPopMenu = CreatePopupMenu()
              InsertMenu hPopMenu, -1, MF_BYPOSITION + MF_STRING, 500, "File"
              InsertMenu hFileMenu, -1, MF_BYPOSITION + MF_STRING + MF_POPUP, hPopMenu, "Hello"
                
              InsertMenu hPopMenu, -1, MF_BYPOSITION + MF_STRING, 500, "File2"
              InsertMenu hPopMenu, -1, MF_BYPOSITION + MF_STRING, 500, "File3"
                
              hPopMenu2 = CreatePopupMenu()
              InsertMenu hPopMenu2, -1, MF_BYPOSITION + MF_STRING, 500, "File4"
              InsertMenu hPopMenu, -1, MF_BYPOSITION + MF_STRING + MF_POPUP, hPopMenu2, "Hello2"
        
                
      End Sub
        
      Private Sub Form_Unload(Cancel As Integer)
              DestroyMenu hPopMenu
              DestroyMenu hPopMenu2
      End Sub帮解释下,代码加进去没什么反应
      

  2.   

    添加菜单的代码加到Form的Form_Paint事件中,而不是Load事件中。因为修改了窗口菜单,需要重绘才能显示,正好Form_Paint事件可以满足。如果非要写在Load事件中,需要加入一句话:Call DrawMenuBar(Me.hwnd)
    声明:Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long