📄 06.4.1 添加菜单项目.txt
字号:
6.4.1 添加菜单项目
重新创建一个单文档类型的 MFC AppWizard ( exe)工程,工程取名为: Menu2 0上
面在进行添加菜单项目(笔者注:这里的菜单项目包括子菜单和菜单项两种,以下同)的
操作时,都是通过在资源编辑器中添加完成的。现在要通过代码来动态地添加菜单项目。
这可以利用 CMenu类提供的一个成员函数: AppendMenu来完成。这个函数的作用是把一
个新菜单项目添加到一个指定菜单项目的末尾。 AppendMenu函数具有以下形式的声明:
BOOL AppendMenu(UINT nFlags, U工NT_PTR n工DNew工 tern = O, LPCTSTR lpszNew工 tern = NULL );
.
这个函数的各个参数的含义如下所示:
. nFlags
指定新添加的菜单项目的状态信息,有多种这样的状态标志,如表 6.2所示。
. nIDNewltem
取值取决于第一个参数。如果第一个参数的值是 MF_POPUP,那么 nIDNewltem就是
一个顶层菜单的句柄:否则就是要添加的新菜单项的命令 ID。如果第一个参数的值是 MF_SEPARATOR,那么 nIDNewltem的值将被忽略。
. lpszNewltem
取值同样取决于第一个参数。如果第一个参数的值是 MF STRING,则 lpszNewItem就是指向要添加的这个新菜单项目的文本的指针。如果第一个参数的值是 MF_OWNERDRAW,则 lpszNewItem就是指向该菜单项目的一个附加数据的指针。如果第一个参数的值是 MF_SEPARATOR,则 lpszNewItem的值将被忽略。
表 6.2菜单标志
菜单标志 说明
如lF CHECKED 在菜单项前面放置一个对号 (.J)标记
如11' UNCHECKED 移除菜单项前面的对号标记
h在F ENABLED 使菜单项可用
h在F_DISABLED 禁用菜单项
MF_CRAYED 禁用菜单项并加灰显不
MF OWNERDRAW 表明菜单项目是一个 owner.draw风格的菜单项
MF一POPUP 表明是一个弹出菜单项
如11' SEPARATOR 表明是一个分隔栏项
MF STRll吨G 使用一个字符串标识该菜单项目
MF如伍NUBREAK 更改菜单项目的显示方式。例如如果是为一个弹出菜单添加这样的菜单项,那么将为这个菜 单添加新的一列以显示新添的这个菜单项 .但在列之间并没有显示分隔线
如11' MENUBARBREAK 同上。但在菜单项列之间显不分隔线
为了添加菜单,首先需要创建一个菜单对象,这可以利用 CMenu类提供的另一个成
员函数: CreatePopupMenu来实现。这个函数的作用是创建一个弹出菜单,然后将其与一, 个CMenu对象相关联起来。同样,本例中,我们也在程序的CMainFrarne类的 OnCreate函数中实现动态添加菜单这一功能,具体代码如例6-25所示。
例6-25
int CMainFrame : :OnCreate(LPCREATESTRUCT lpCreateStruct)
CMenu menu;
menu.CreateMenu() ;
GetMenu()->AppendMenu(MF_POPUP , (U工NT)menu.m_hMenu, "Test");
return 0;
例 6-25所示新添的代码段首先定义了一个CMenu对象:menu,然后调用窗口的 GetMenu函数得到程序框架窗口菜单栏的指针,并利用该指针调用AppendMenu函数,以添加一个新的弹出菜单。这个新的弹出菜单显示文本为: Test。因为CMenu对象的m hMenu 成员变量是菜单句柄,其类型为HMENU,但这里函数要求的是UINT类型,所以必须进行强制转换。另外,现在添加的是一个弹出菜单,相当于是程序框架窗口菜单的一个子菜单,所以,在获得程序框架窗口的指针后,也不用再去调用GetSubMenu函数得到某个子
菜单了。|·二~标题叫t4IDy~妥想'但这段代码有一个问题,就是前面己经遇到文侧E)~壶,ω,拟凶 τ"'" 的: menu对象是局部变量。我们可以试着运行。
ID~1iI 1品~~l 一下这个Menu2程序,当程序启动后,发现程序「一窗口上的菜单栏上确实多了一个 Test子菜单 (Menu2程序运行界面如图6.38所示)。 图6.38动态添加Test子菜单后的程序界面但当我们用鼠标单击此子菜单时,立即就会弹出一个提示程序,出现异常的窗口。原因就是因为我们在程序中把menu对象定义成局部变量了,至于解决这个问题的办法,前面已经介绍了,有两种:一种是把menu对象修改为框架类的成员变量,另一种是在完成菜单的添加之后立即调用菜单对象的Detach函数,将菜单句柄与菜单对象之间的关联断开。也就是在上述例6-25所示代码中在加灰显示的代码之后再添加下面这行代码:
menu.Detach() ;
.
再次运行Menu2程序,并单击Test子菜单,程序不会出现异常了。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -