《VC语言6.0程序设计从入门到精通》第25章


得到如图 3…15 所示的运行结果。
图 3…15 菜单应用程序的运行结果
2 .添加动态修改菜单状态的处理函数
每一个菜单项都有很多属性,通过动态改变菜单项的属性可以及时反映菜单的状态,为 
用户提供相关的信息。但在介绍菜单资源编辑器的时候也涉及到了一些跟菜单属性有关的内 
容。在资源编辑器中只能设置菜单的初始状态,并不能在程序运行时动态地改变菜单属性, 
这就需要通过程序代码来实现这些功能。
·53 ·
…………………………………………………………Page 63……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
在前一部分中使用 ClassWizard 对话框添加消息处理函数时可以看到如图 3…14 所示的菜 
单 ID 对应的“Messages ”列表框中有两项,一项是已经用到的“MAND ”,另一项 
UPDATE_MAND_UI ”则是本部分将要介绍的菜单项的状态更新消息。该消息在 MFC 
“ 
要更新整个程序界面时产生,提示用户设置该菜单项当前的状态。
下面为前一节的示例添加“仙履奇缘”菜单项的状态更新处理,要求必须在选择过“月 
光宝盒”菜单项后才能选择“仙履奇缘 ”,否则“仙履奇缘”菜单项处于禁用状态。 
(1)为主框架类添加一个成员变量,用以标记“月光宝盒”菜单项是否被选择过。要添 
加成员变量,首先应在 IDE 左侧单击“ClassView ”选项卡,展开“Classes ”节点,在 CMainFrame 
节点上单击鼠标右键,在弹出菜单中选择“Add Member Variable ”菜单项,打开“Add Member
Variable ”对话框,如图 3…16 所示。在其中的“Variable Type ”变量类型文本框中输入“BOOL ”, 
在“Variable Name ”变量名文本框中输入“m_bHaveSeenMovie1 ”,并选中“Access ”区域中 
的“Public ”单选框。确认后即为 CMainFrame 添加了一个公共成员变量 m_bHaveSeenMovie1 。 
该变量的值将决定是否禁用“仙履奇缘”菜单项,当它的值为 TRUE 时,菜单项允许,为 FALSE 
时则被禁用。
图 3…16 为 CMainFrame 添加的成员变量
(2 )初始化新创建的成员变量,初始值为 FALSE ,即“仙履奇缘”菜单项默认是被禁用 
的 。 在 IDE 工 作 区 的 ClassView 选 项 卡 下 , 展 开 CMainFrame , 双 击 类 的 构 造 函 数 
CMainFrame(),客户区自动打开 MainFrame。cpp 文件并定位在 CMainFrame::CMainFrame()函 
数上。在该函数中添加如下代码:
CMainFrame::CMainFrame()

// TODO: add member initialization code here
m_bHaveSeenMovie1 = FALSE;

(3 )在 CMainFrame 中添加“仙履奇缘”菜单项的更新用户接口对象状态命令消息处理 
函数。
在 IDE 主菜单中依次选择“View|ClassWizard ”菜单命令或者在开发界面中直接使用快 
捷键 Ctrl+W 打开“ClassWizard ”对话框,单击“Message Maps ”选项卡,在“Class name ” 
下拉列表框中选择 CMainFrame,在“Object IDs ”列表框中选择 ID_MOVIE2 “仙履奇缘” 
项,双击“Messages ”列表框中的 UPDATE_MAND_UI 或者在其上单击鼠标左键,然 
后单击“Add Function ”按钮,为 ID_MOVIE2 添加更新用户接口对象状态命令消息处理函数。 
在 弹 出 的 如 图 3…2 所 示 的 对 话 框 中 直 接 单 击 “ OK ” 按 钮 ( 对 话 框 中 函 数 名 为 默 认 
·54 ·
…………………………………………………………Page 64……………………………………………………………
第 3 章 菜单与加速键
OnUpdateMovie2 ),返回“ClassWizard ”对话框。可以看见在“Member functions ”列表中添 
加了一个名为 OnUpdateMovie2 的新函数。单击“Edit Code ”按钮,则退出“ClassWizard ” 
对话框,并打开 MainFrm。cpp 文件,在刚添加的 CMainFrame::OnUpdateMovie2() 中添加如下 
代码:
void CMainFrame::OnUpdateMovie2(CCmdUI* pCmdUI)

// TODO: Add your mand update UI handler code here
pCmdUI…》Enable(m_bHaveSeenMovie1);

(4 )接着根据是否选择过“月光宝盒”菜单项设置“仙履奇缘”是否禁用。当选择“月 
光宝盒”菜单项后,使其消息处理函数将 m_bHaveSeenMovie1 设置为 TRUE 就可以激活“仙 
履奇缘”菜单项。在工作区 ClassView 选项卡中展开 CMainFrame,双击 OnMovie1()节点,IDE 
自动打开MainFrm。cpp 并定位 OnMovie1()函数。修改该函数代码如下:
void CMainFrame::OnMovie1()

// TODO: Add your mand handler code here
MessageBox(〃悟空你也太调皮了,我跟你说过叫你不要乱扔东西,你怎么又…〃;
〃月光宝盒〃);
m_bHaveSeenMovie1=TRUE;

(5 )编译并运行该程序,就可以实现既定功能。
在 CMainFrame::OnUpdateMovie2()函数中,参数 pCmdUI 指向当前要更新的菜单项的对 
象,这里即为“仙履奇缘”菜单项。通过 pCmdUI 的成员方法就可以改变菜单项的属性。下 
面分别介绍 CCmdUI 中改变菜单属性主要的成员方法:
o Enable()
Enable() 函数用于设置菜单项是否有效。其原型为:
virtual void Enable(BOOL bOn = TRUE);
bOn 为 TRUE 时菜单项有效,反之菜单项无效,显示为灰色,不响应鼠标单击或者其他 
有同样效果的操作。bOn 的默认值是 TRUE 。下面的代码根据标志 m_bMenuItemEnable 变量 
设置某个菜单项是否有效:
void CMainFrame::OnUpdateMenuitem (CCmdUI* pCmdUI)

pCmdUI…》Enalbem_bMenuItemEnable);

无效的子菜单如图 3…17 所示。
图 3…17 无效的菜单项 Menu
·55 ·
…………………………………………………………Page 65……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
o SetCheck()
SetCheck()函数用于设置菜单项的复选状态。其原型为:
virtual void SetCheck(int nCheck = 1 );
nCheck 等于 0 时菜单项没有被选中,nCheck 等于 1 时菜单项被选中,在菜单项标题前 
有一个小勾。nCheck 的默认值为 1。下面的代码根据标志 m_bMenuItemChecked 变量是否为 
真设置某个菜单项是否被复选选中。
void CMainFrame::OnUpdateMenuitem (CCmdUI* pCmdUI)

小说推荐
返回首页返回目录