友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第14部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
闭 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 (CCmdUI* pCmdUI)
{
if (m_bMenuItemChecked)
pCmdUI…》SetCheck(1);
else
pCmdUI…》SetCheck(0);
}
菜单项被复选选中的效果如图 3…18 所示。
图 3…18 复选选中的菜单项 Menu1 和 Menu2
o SetRadio()
SetRadio()函数用于设置菜单项的单选状态。其原型为:
virtual void SetRadio(BOOL bOn = TRUE );
bOn 等于 FALSE 时菜单项没有被选中,bOn 等于 FALSE 时菜单项被选中,在菜单项标
bOn 的默认值为 TRUE 。下面的代码根据标志 m_nMenuItemChosen 变量
题前有一个小圆点。
设置某个菜单项是否被单选选中。
void CMainFrame::OnUpdateMenuitem (CCmdUI* pCmdUI)
{
pCmdUI…》SetRadio(m_nMenuItemChosen==2);
}
菜单项被单选选中的效果如图 3…19 所示。
图 3…19 单选选中的菜单项 Menu1
注意,SetRadio()函数和 SetCheck()函数的惟一区别是标题前面画的是圆点,而不是小勾,
系统并没有如同对话框的单选框控件一样提供内部的处理程序使得在同一列菜单中只有惟一
的菜单项被选中,需要程序中自行处理。
·56 ·
…………………………………………………………Page 66……………………………………………………………
第 3 章 菜单与加速键
o SetText()
SetText 函数用于设置菜单项的标题。其原型为:
virtual void SetText(LPCTSTR lpszText);
参数 lpszText 用于设置菜单项的新标题 。下面的代码根据标志 m_nColor 设置某个菜单项
的标题:
void CMainFrame::OnUpdateMenuitem (CCmdUI* pCmdUI)
{
if (m_nColor=1)
pCmdUI…》SetText(〃Red〃);
else
pCmdUI…》SetText(〃Blue〃);
}
3。3。2 添加弹出式菜单的处理函数
弹出式菜单是指单击鼠标右键在鼠标光标旁出现的活动菜单,如图 3…20 所示。弹出式菜
单给与程序使用者一个快捷的访问菜单的方式,在 Windows 程序界面设计中十分常见 。本节
就介绍如何创建这种类型的菜单。
图 3…20 弹出式菜单
1.动态创建菜单对象
弹出式菜单由于不像普通菜单一样可以在程序运行前预先装入,因此都是动态创建的。
弹出式菜单一般都是由单击鼠标右键产生的,故需要在鼠标右键按下的消息中进行弹出式菜
单的处理。
利用 ClassWizard 为一个应用程序视图类(这里命名为 CSampleView )加入鼠标右键按
下的消息处理函数的过程如下:
(1)IDE 主菜单栏中依次选择“View|ClassWizard ”菜单命令或者在开发环境的界面中直
接使用快捷键 Ctrl+W 打开 ClassWizard 对话框。
(2 )单击 Message Maps 选项卡,在“Class name ”下拉列表框中选择“CSampleView ”,
在“Object IDs ”列表框中选择“CSampleView ”列出该视图可以接收的标准 Windows 消息和
控件通知消息,双击“Message ”列表框中的“WM_RBUTTONDOWN ”或者在其上单击左
键,然后单击“Add Function ”按钮,为 CSampleView 添加 WM_RBUTTONDOWN 鼠标右键
按下的消息处理函数,函数名默认为 OnRButtonDown 。
·57 ·
…………………………………………………………Page 67……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
(3 )可以看见在“Member functions ”列表中添加了一个名为 OnUpdateMovie2 的新函数。
单 击 “ Edit Code ” 按 钮 , 则 退 出 ClassWizard 并 打 开 MainFrm。cpp 文 件 , 创 建 一 个
WM_RBUTTONDOWN 的消息处理函数,得到类似于下面的函数:
void CSampleView::OnRButtonDown(UINT nFlags; CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnRButtonDown(nFlags; point);
}
在函数内的注释语句后添加弹出式菜单的实现代码 。首先创建一个动态菜单对象,有
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!