⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06.4.1 添加菜单项目.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 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 + -