怎样通过API为MDI主窗口或其子窗口添加主菜单?
参照这个代码可以较容易为SDI窗口使用AP唁菜单:http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=49583&lngWId=1
我想问的是通过API为MDI主窗口或其子窗口添加主菜单?
问题点数:99、回复次数:8Top
1 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-10 09:39:31 得分 55
Option Explicit
Private Const MF_POPUP = &H10&
Private Const MF_STRING = &H0&
Private Const MF_SEPARATOR = &H800&
Private Const MF_BYPOSITION = &H400&
Private Declare Function CreateMenu Lib "user32" () As Long
Private Declare Function CreatePopupMenu Lib "user32" () 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 ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long
Private Declare Function DrawMenuBar 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 GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Dim hMenu As Long
Dim hFileSubMenu As Long
Dim hHelpSubMenu As Long
Private Sub cmdCreate_Click()
hMenu = GetMenu(MDIForm1.hwnd)
hFileSubMenu = CreatePopupMenu()
hHelpSubMenu = CreatePopupMenu()
InsertMenu hMenu, 0, MF_BYPOSITION, 0, "&File"
InsertMenu hMenu, 1, MF_BYPOSITION, 1, "&Edit"
InsertMenu hMenu, 2, MF_BYPOSITION, 2, "&View"
InsertMenu hMenu, 3, MF_BYPOSITION, 3, "&Help"
ModifyMenu hMenu, 0, MF_POPUP, hFileSubMenu, "&File"
hFileSubMenu = GetSubMenu(hMenu, 0)
InsertMenu hFileSubMenu, 0, MF_BYPOSITION, 1001, "&New"
InsertMenu hFileSubMenu, 1, MF_BYPOSITION Or MF_SEPARATOR, 1002, ""
InsertMenu hFileSubMenu, 2, MF_BYPOSITION, 1003, "&Exit"
ModifyMenu hMenu, 3, MF_POPUP, hHelpSubMenu, "&Help"
hHelpSubMenu = GetSubMenu(hMenu, 3)
InsertMenu hHelpSubMenu, 0, MF_BYPOSITION, 4001, "&About..."
InsertMenu hHelpSubMenu, 1, MF_BYPOSITION Or MF_SEPARATOR, 4002, ""
InsertMenu hHelpSubMenu, 2, MF_BYPOSITION, 4003, "&Help"
SetMenu MDIForm1.hwnd, hMenu
DrawMenuBar MDIForm1.hwnd
MDIForm1.Show
End Sub
'----------------------------------------------------
'使用子类化 , 拦截WM_COMMAND消息, 并通过ID来判断是哪个菜单被点(ID在你用API添加时可以自己确定)
Top
2 楼Modest(塞北雪貂)·(偶最欣赏楼主的分)回复于 2006-03-10 09:42:16 得分 7
http://www.ddvip.net/program/C++/index6/29.htmTop
3 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-10 10:45:57 得分 7
我建议你研究一下WM_MDISETMENU这条消息Top
4 楼vbangle(VsNetMenu 菜单工具条控件 http://vbangle.5ivb.net/)回复于 2006-03-10 18:02:10 得分 0
对MDI添加主菜单用上面代码可以,我也实现了,
难点在为其子窗口建立主菜单搞不定Top
5 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-13 14:33:55 得分 15
MSDN:
在 MDI 应用程序中,每一个子窗体的菜单都显示在 MDI 窗体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单(如果有的话)就代替菜单栏上的 MDI 窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示 MDI 窗体的菜单
Top
6 楼vbangle(VsNetMenu 菜单工具条控件 http://vbangle.5ivb.net/)回复于 2006-03-17 18:15:06 得分 0
上面的理解,我的问题是使用API建立MDI子窗口的主菜单Top
7 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-17 20:50:52 得分 15
好象不行,即使建立了子窗口的主菜单,在显示子窗体的时候,它上面也不显示菜单,而是显示到MDI主窗体上去Top
8 楼vbangle(VsNetMenu 菜单工具条控件 http://vbangle.5ivb.net/)回复于 2006-03-18 06:54:05 得分 0
我不讨论MDI子窗口的主菜单是不是显示到MDI主窗口上,我只要这个主菜单是其子窗口的,验证方式,MDI没有打开子窗口时有一个主菜单,打开子窗口时又有一个主菜单,这2个是不同时的,而这种主菜单是通过API实现的,现在征求的难点是打开子窗口时使用API建立的主菜单代码写法,MDI没有打开子窗口时主菜单上面的代码已经可以Top




