按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
·44 ·
…………………………………………………………Page 54……………………………………………………………
第 3 章 菜单与加速键
图 3…1 消息映射选项卡
ClassWizard 对话框的“Message Maps ”(消息映射)选项卡中的各项功能介绍如下:
o Project (工程)下拉列表框:用于选择需要编辑的工程名称。
o Class name (类名)下拉列表框:用于选择需要编辑消息映射的类的名称。选择好类
后,在该下拉列表框 和“Project ”下拉列表框的下一行将显示所选类的头文件和源文
件路径。
o Object IDs (对象ID )列表框:以列表形式显示可以产生消息的对象的 ID,包括菜单
项、按钮等的 ID 。该列表框的第一项总是显示所选择的类。
o Messages (消息)列表框:列举在“Object IDs ”列表框中选定的对象所能产生的各种
消息。
o Member functions (成员函数)列表框:以列表形式显示选定的类中的成员函数。该列
表框中只列出与消息处理函数以及 MFC 中与消息处理有关的虚函数。前者标记为
“W ”,并在函数名后显示对应的消息映射宏;后者标记为“V ”。
o Add Class (添加类)按钮:单击该按钮,添加新的类到工程中。该按钮在“MFC
ClassWizard ”对话框中的所有选项卡中都存在。
o Add Function (添加函数)按钮:单击该按钮添加选定消息的新的消息处理函数,包
括在消息映射定义中添加对应的宏指令,在选定的类中添加该消息处理函数的声明和
完成基本功能的代码实现。如果选定的消息已经有消息处理函数,则该按钮无效。对
于对象产生的消息,单击该按钮将弹出如图 3…2 所示的对话框,要求用户输入消息处
理函数的名称,在“Member function name ”(成员函数名称)输入框中输入函数名,
确定后 ClassWizard 就会自动添加该消息处理函数。对于由该选定的类产生的消息,
MFC 已经定义好了消息处理函数名称,单击“Add Function ”按钮将直接添加该消息
处理函数,不会提示用户输入自定义的函数名。注意,只有单击“MFC ClassWizard ”
的“OK ”按钮或者“Edit Code ”按钮退出“MFC ClassWizard ”对话框后,ClassWizard
才会真正修改源文件。
·45 ·
…………………………………………………………Page 55……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 3…2 添加消息处理函数的对话框
o Delete Function (删除函数)按钮:单击该按钮删除选定消息的消息处理函数,包括函
数的声明和定义该消息映射的宏语句。如果选定的消息没有消息处理函数,则该按钮
无效。注意,当该函数已经存在于源文件中时,单击该按钮会提示如图 3…3 所示的对
话框,告诉用户 ClassWizard 只能删除该函数的声明和定义该消息映射的宏语句,而
无法删除该函数的实现代码,用户需要手动删除。
图 3…3 提示用户手动删除消息处理函数的对话框
o Edit Code (编辑代码)按钮:单击该按钮退出“MFC ClassWizard ”对话框,同时 IDE
的代码编辑窗口直接转到选定消息的处理函数进行编辑。该按钮也使得在“MFC
ClassWizard ”中所做的更改生效。如果选定的消息没有消息处理函数,则该按钮无效。
o OK (确定)按钮:单击该按钮使得在“MFC ClassWizard ”中的编辑生效,并退出“MFC
ClassWizard ”对话框。
o Cancel (取消)按钮:单击该按钮取消所有“MFC ClassWizard ”对话框中的设置,并
退出“MFC ClassWizard ”对话框。
3。1。3 消息处理过程
在 Windows 程序设计中,消息的处理是通过消息循环进行接收与分发的。MFC 运用消
息映射机制封装了这一处理过程。下面介绍 MFC 中消息的处理过程。
1.标准 Windows 消息和控件通知消息
标准 Windows 消息和控件通知消息的处理过程比较简单。这类消息必须由 CWnd 或其派
生类的对象处理,消息传递到封装对应的窗口或子窗口的类的对象中。也就是说,当关闭程
序的时候,会产生一个 WM_CLOSE 消息并通知主框架类,主框架类调用相应的处理函数进
行程序关闭前的清理操作,如保存文件和数据等。
2 .命令消息
命令消息与其他两个类型的消息不同,它可以由应用程序其他类的对象(例如应用类对
象、文档对象和文档模板对象)处理。这就涉及一个消息传递路径的问题,具体来说就是允
·46 ·
…………………………………………………………Page 56……………………………………………………………
第 3 章 菜单与加速键
许一个还是多个对象处理该消息、允许哪些对象处理等。MFC 中采取了简单的方法,只允许
其中一个对象处理该消息,当沿着消息传递路径找到第一个包含该消息的处理函数的对象时,
则处理该消息,然后中断传递过程,不再搜索后续的对象。
由于命令消息可以被多种类的对象处理,因此命令消息的传递路径比较复杂,但总体思
想是由子窗口到父窗口,由窗口到文档。下面举一个简单的例子。
假设是一个多文档 MDI 应用程序,用户触发了“编辑”菜单下的“粘贴”菜单项的命令
消息,此时消息依照以下顺序传递。
(1)MDI 主框架窗口首先收到此命令消息。
(2 )主框架将处理命令的机会先让给其当前活动的 MDI 子框架窗口。
(3 )子框架窗口又将处理该命令的机会让给其活动的视图。
(4 )视图先搜索自己的消息映射,寻找对应的处理函数,如果没找到,则将消息传递给
与其关联的文档,找到则调用并中止传递过程。
(5 )文档搜索自己的消息映射,寻找对应的处理函数。一般情况下文档中包含“粘贴”
消息的处理函数,调用该处理函数完成粘贴功能。如果没有找到,文档将消息传递给文档模
板。
(6 )文档模板进行相同的过程,如果没找到,将消息传递回子框架窗口。
(7 )子框架窗口搜索对应的处理函数,如果没找到,则将消息传回 MDI 主框架窗口。
(8 )如果主框架窗口中也没找到,则消息最后停留在应用对象,不再进行进一步的传递。
从上面的叙述可以看出,命令消息的传递过程很复杂。然而一般情况下不需要了解这么
详细的消息传递路径,只需根据完成功能的要求,在相应的类中添加实现代码,就不会产生
冲突,比如例子中提到的粘贴功能,一般就是由文档完成的,因此只需在文档类中添加这个
命令消息的处理函数,而不必在别的类中添加与之冲突的处理函数。
3。2 菜单和加速键的创建
在程序中使用菜单和加速键,首先需要创建相应的资源。菜单和加速键资源告诉Windows
系统自动为程序绘制菜单,并将与菜单和加速键相关的用户操作作为命令消息发送给程序的
窗体。资源的存在大大简化了程序的处理,是 Windows 系统程序设计的一个重要部分。
下面分别介绍菜单和加速键资源的创建过程。
3。2。1 菜单的创建
实例 3…1 :创建菜单实例。源代码在光盘中“03实例 3…1test1 ”目录下。
1.创建工程
用 AppWizard 创建一个 MDI 工程,工程名为 test1 。
创建工程后,可以发现自动生成的应用程序框架中已包含了默认的菜单,根据用户在创
建时的不同选项,默认菜单中的菜单项有所不同。对于 SDI 应用程序,只生成一个菜单,其
·47 ·
…………………………………………………………Page 57……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
资源 ID 为 IDR_MAINFRAME (资源ID 用于标识资源,程序装入资源需要指定该 ID 来确定
需要装入哪个资源),这是整个应用程序共用的菜单。对于 MDI 应用程序,要生成两个菜单,
其资源 ID 分别为 IDR_MAINFRAME 和 IDR_工程名 TYPE,当应用程序尚未打开文档时显
示第一个菜单,打开文档后显示第二个菜单。
2 .添假菜单资源
添加菜单资源 。演示如何为资源 ID 为 IDR_MAINFRAME 的菜单资源添加一个包含“月
光宝盒”和“仙履奇缘”两个子菜单项的“大话西游”菜单项。其步骤如下:
(1)在集成开发环境(IDE )中单击左侧工作区窗口中的“ResourceView ”选项卡,在
树状列表中单击展开“Menu ”节点,找到需要编辑的菜单资源的 ID ,双击就可以打开该菜
单资源的编辑界面,如图 3…4 所示。
图 3…4 菜单资源编辑界面
(2 )双击 “帮助”菜单项右侧的虚线框,弹出新建顶层菜单项的属性编辑对话框,如
图 3…5 所示。注意,这个虚线框可以用鼠标拖动到顶层菜单的任何位置。在“Caption ”文本
框中输入菜单项的标题“大话西游(&D )”。标题中“&D ”的作用是在程序运行时用户可以
按 Alt+D 组合键直接打开该菜单项,在显示时,“&D ”会自动转换为添加了下划线的“D ”,
如图 3…6 所示。“Pop…up ”复选框默认被选中,表明这是一个弹出菜单项,允许有子菜单。
图 3…5 添加“大话西游”菜单项
·48 ·
…………………………………………………………Page 58……………………………………………………………