热情软件屋

 

VB5中动态建立带子菜单的菜单


编号:QA000580
建立日期: 1999年3月3日 最后修改日期:1999年3月3日
所属类别:

Cool V:
    VB5中动态建立菜单是件容易的事,index(0),1,2,3...就行了,可是如果这个菜单还有子菜单怎么办?也就是如何建立动态子菜单?

回答:

    利用Windows API可以很容易建立这样的菜单,但是建立好菜单之后要想知道什么时候用户选择了菜单就有点困难了。这里我们使用mbocx32b.zipMessage Blaster控件(类似的控件还有MsgHook等)来获得菜单选中的WM_COMMAND消息。VB 5.0以上的版本可以不使用控件而直接使用Subclass技术获得该消息,但这种方法稳定性差,这里就不介绍了。
    首先建立一个窗体,加上菜单和Message Blaster控件。然后输入以下代码:
    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 Integer, hFileMenu As Integer
    
    Private Sub Form_Load()
     Msgblst321.hWndTarget = hwnd
     Msgblst321.MsgList(0) = WM_COMMAND
     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"
    End Sub
    运行这个例子,你的第一个菜单中将增加一个“Hello”项,而它带有“File”的子菜单。
    Private Sub Form_Unload(Cancel As Integer)
     DestroyMenu hPopMenu
    End Sub
    
    Private Sub Msgblst321_Message(ByVal MsgVal As Long, ByVal wParam As Long, ByVal lParam As Long, lplRetVal As Long)
     If wParam = 500 Then
     MsgBox "You choose a popup menu!"
     End If
    End Sub

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio