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

📄 06.3.1 基本菜单操作.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
6.3 基本菜单操作. 
6.3.1 标记菜单 
运行刚才创建的 Menu程序后,可以看到程序的【查看】子菜单下的两个菜单项前面都带有一个对号( .j) (如图 6.11所示),我们称这种类型的菜单为标记菜单。 
图 6.11查看菜单下的菜单项

下面,我们想要实现这样的功能:在【文件】子菜单中的【新建】菜单项上添加一个标记。因为程序的主菜单属于框架窗口,所以需要在框架类窗口创建完成之后再去访问菜单对象。可以在框架类( CMainFrame类)的 OnCreate函数的最后(但一定要在 retum语旬之前)添加实现这个功能的代码。
为了获得【文件】子菜单下的【新建】菜单项,首先要获得程序的菜单栏,也就是要在框架窗口中获得指向菜单栏的指针,这可以通过 CWnd的成员函数: GetMenu来实现,该函数具有如下形式的声明: 
CMenu* GetMenu( ) const; 
从其声明可以知道,该函数返回一个指向 CMenu类对象的指针。 CMenu类是一个 MFC类,是 Windows菜单句柄 HMENU的一个封装,提供了一些与菜单操作有关的成员函数,例如菜单的创建、更新和销毁等,还可以获取一个菜单的子菜单,这是通过 GetSubMenu这个成员函数实现的,这个函数的声明形式如下 : 
CMenu* GetSubMenu( int nPos ) const; 
可以看到,这个函数有一个参数 (nPos),该参数指定了子莱单的索引号。另外,这个函数也返回一个指向 CMenu对象的指针,但是,这个函数返回值所指向的对象与上面 CWnd类的 GetMenu函数返回值所指向的对象是不一样的,后者返回的是指向程序菜单栏对象的指针,而 CMenu类的 GetSubMenu成员函数返回的是由参数 nPos指定的子菜单的指针。
国际: GetMe叫数是 CW叫的成员函数,而 G山Menu函数是 CMenu

的成员函数。
找到了子菜单,相当于找到了楼层,下面就是要找房间了。另外,为了设置一个标记菜单,需要使用 CMenu类的 CheckMenultem这个函数,这个函数的功能就是为菜单项添加一个标记,或者移除菜单项的标记。该函数的声明形式如下所示: 
UINT CheckMenultern( UINT nIDCheck工 tern, UINT nCheck ); 
该函数的第一个参数 nIDCheckItem指定需要处理的菜单项,它的取值由第二个参数决定。第二个参数 nCheck指定怎样设置菜单项,以及如何定位该菜单项的位置,它的取值可以是 MF CHECKED或 MF_UNCHECKED与 MF BYPOSITION或 MF_BYCOMMAND的组合,这些标志的含义分别如下所述: 
. MF CHECKED 

. MF UNCHECKED 


设置菜单项的复选标记。 
移走菜单项的复选标记。

·如1F 
BYPOSITION 表明应该根据菜单项的位置来访问菜单项,即第一个参数指定的是菜单项的索引号。

·孔1F 
BYC。如1MAND表明应该根据菜单项的命令来访问菜单项,即第一个参数指定的是菜单项的命令ID。另外,在Menu程序中,【文件】子菜单及其【新建】菜单项的索引号均为0。有了以


上这些知识,我们就可以实现为【文件】子菜单中的【新建】菜单项添加标记这一功能了,例 6-1所示代码中加灰显示的那行代码就是具体的实现代码,读者只需在CMainFrame类的 OnCreate函数的retum语句之前添加这条语句即可。
例6-1 

int CMainFrame : : OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
GetMenu()->GetSubMenu(O)->CheckMenuItem(0, MF_BYPOSITION I MF_CHECKED); 

return 0 ; 
Build并运行Menu程序,打开【文件】子菜单,可以看到其下的【新建】菜单项左边已经添加了一个复选标记,如图 6.12所示。这时,如果希望取消这个标记,可以使用 MF_UNCHEC阻D标志来调用CheckMenultem函数。
图 6.12标记菜单功能的实现

当然,也可以通过菜单项标识来访问菜单项。首先,打开菜单编辑器,利用菜单项属性对话框,得到【新建】菜单项的标识:ID-FEE-NEW。然后,修改上述例6-1中加灰显示的那行代码,使用菜单项标识来实现设置【新建】菜单项标记的功能,修改后的代码如例6-2所示。 
iJlJ 6-2 
int CMainFrame : :OnCreate(LPCREATESTRUCT lpCreateStruct) 
( GetMenu () ->GetSubMenu (0) ->checkMenuItem(ID_FILE_NEW, MF_BYCOMMAOD | MF_CHECKED) ; return 0 ; 
读者可以再次运行Menu程序,可以发现程序实现了同样的效果,即为【文件】子菜单下的【新建】菜单项添加一个标记符号。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -