VC语言6.0程序设计从入门到精通-第15部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
的属性对话框如图 3…12 所示。
图 3…12 “仙履奇缘”加速键资源编辑界面
(4 )完成加速键的添加后,为了完善用户界面,需要在菜单项标题中添加加速键的说明。
在 IDE 左侧的“ResourceView ”选项卡中,展开“Menu ”节点,双击 IDR_MAINFRAME 进
入 IDR_MAINFRAME 菜单资源编辑界面。然后在 IDE 右侧客户区中单击“大话西游”菜单
项,弹出子菜单,在“月光宝盒”菜单项上双击鼠标左键,弹出属性编辑对话框,将“Caption ”
文本框中的标题修改为“月光宝盒(&Y)tCtrl+Y ”,如图 3…13 所示。其中“t ”表示“Ctrl+Y ”
的显示与前面“月光宝盒(&Y) ”之间隔一个制表位(Tab )。
图 3…13 添加“月光宝盒”的加速键说明
(5 )参照前一步,在“仙履奇缘”菜单标题中加上 Ctrl+L 的加速键说明。
3。3 添加菜单所需处理函数
前一节介绍了创建和添加菜单资源的方法,但添加菜单资源只是创建菜单的第一步。用
户编译执行前一节的例子就会发现,运行时关闭所有文档,程序显示的 IDR_MAINFRAME
菜单中“大话西游”下的两个菜单项都是禁用的。这是因为缺少相应的用户处理函数,主框
·51 ·
…………………………………………………………Page 61……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
架类自动禁用了这两个菜单项。因此还需要为菜单消息添加消息处理函数。同时为了完善菜
单的各种功能,还需要在运行中动态地创建和修改菜单,并添加代码。本节将详细讲解这些
内容。
3。3。1 添加普通菜单的处理函数
1.添加菜单命令处理函数
由 AppWizard 创建的应用程序会在程序运行时自动将菜单资源装入内存 。用户只需要添
加相应消息处理函数即可完成菜单的基本功能。下面以 3。2 节中创建的菜单为例,分步骤讲
解如何为应用程序添加菜单命令消息处理函数。
(1)在 IDE 主菜单栏中依次选择“View|ClassWizard ”菜单命令或者在 IDE 界面中直接
使用快捷键 Ctrl+W 打开“ClassWizard ”对话框,单击“Message Maps ”选项卡。
(2 )添加“月光宝盒”菜单项的消息处理函数。在“Class name ”下拉列表框中选择需
要编辑的类—主框架类 CMainFrame,在“Object IDs ”列表框中选择需要添加处理函数的
命令消息 ID—ID_MOVIE1 “月光宝盒”,双击“Messages ”列表框中的 MAND 或者
在其上单击鼠标左键,然后单击“Add Function ”按钮,为 ID_MOVIE1 添加命令消息处理函
数。在弹出的如图 3…2 所示的对话框中直接单击“OK ”按钮(对话框中函数名为默认的
OnMovie1 ),返回 ClassWizard 对话框。可以看见在“Member functions ”列表中已经添加了
一个名为 OnMovie1 的新函数。
(3 )按照步骤(2 )中的方法,为 ID 为 ID_MOVIE2 “仙履奇缘”的菜单项添加消息处
理函数 OnMovie2() 。添加后的 ClassWizard 对话框内容如图 3…14 所示。
图 3…14 添加了两个命令消息处理函数后的 ClassWizard 对话框
(4 )在“Member functions ”列表框中选择函数 OnMovie1,单击“Edit Code ”按钮, 关
闭 ClassWizard 对话框,自动打开 MainFrm。cpp 文件,并将光标定位在 OnMovie1()函数体中,
·52 ·
…………………………………………………………Page 62……………………………………………………………
第 3 章 菜单与加速键
在这里添加相应代码。这里为 OnMovie1()函数添加如下代码:
void CMainFrame::OnMovie1()
{
// TODO: Add your mand handler code here
MessageBox(〃悟空你也太调皮了,我跟你说过叫你不要乱扔东西,你怎么又…〃;
〃月光宝盒〃);
}
(5 )在 MainFrm。cpp 文件中找到 CMainFrame::OnMovie2()函数,添加如下代码:
void CMainFrame::OnMovie2()
{
// TODO: Add your mand handler code here
MessageBox(〃 曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜…〃;
〃仙履奇缘〃);
}
(6 )保存文件,编译并运行程序,关闭所有文档,依次选择“大话西游|仙履奇缘”可以
得到如图 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 (C