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
此问题由李海回答。
| |
|
|
| |
|
|