第5章:Windows应用程序引擎——消息映射.ppt
《第5章:Windows应用程序引擎——消息映射.ppt》由会员分享,可在线阅读,更多相关《第5章:Windows应用程序引擎——消息映射.ppt(65页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第第5章:章:Windows应用程序引擎应用程序引擎消息映射消息映射 教学要点教学要点 本本章章内内容容包包括括消消息息的的介介绍绍(产产生生、发发送送、路路由由、接接收收),消消息息映映射射和和消消息息、消消息息响响应应函函数数的的关关系系,常常见见窗窗口口消消息息(键键盘盘消消息息、鼠鼠标消息和定时器消息)的使用,标消息和定时器消息)的使用,消息监视工具消息监视工具Spy+使用使用。要要求求了了解解消消息息映映射射机机制制在在MFC中中的的应应用用程程序序中中的的作作用用、利利用用API发发送送同同步步和和异异步步消消息息、自自定定义义消消息息的的建建立立方方法法,熟熟悉悉消消息息监监视视
2、工工具具Spy+的的使使用用,掌掌握握消消息息映映射射三三个个宏宏的的含含义义、键键盘盘消消息息、鼠鼠标标消消息息和和定定时时器器消消息息有有关关概概念念与与用用法法,熟熟练练掌掌握握在在应应用用程程序序向向导导生生成成的的程程序序中中定定位位到到对对应应三三个个消消息息映映射射宏宏,并并且且自自己己思思考考MFC应应用用程程序的执行。序的执行。VisualC+ProgramDesign内容简介内容简介v Windows操作系统下的应用程序都是基于事件驱动而工作的。消息映射是一种把消息映射到相应的消息响应函数上的机制。v Windows的各种消息沿着MFC应用程序架构规定的路线,找到它的归宿消
3、息映射函数。当找不到的话,最终交给窗口对象的DefWindowProc成员函数去进行默认的处理。VisualC+ProgramDesign教学目标教学目标 1.要求了解消息映射机制在MFC中的应用程序中的作用 利用API发送同步和异步消息、自定义消息的建立方法.2.熟悉消息监视工具Spy+的使用3.掌握消息映射三个宏的含义、键盘消息、鼠标消息和定时器消息有关概念与用法4.熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏,并且自己思考MFC应用程序的执行过程中,为什么看不到API编程中的WinMain()函数。VisualC+ProgramDesign第第5 5章章 目录目录 v 5.
4、1 认识消息 v 5.2 MFC中消息的发送与接收 v 5.3 常用的窗口消息v 习题VisualC+ProgramDesign5.5.1 1 认识消息认识消息 消息机制是消息机制是Win32Win32程序设计的灵魂程序设计的灵魂,Win应用程序利用格式化的Windows消息与其它Windows应用程序及Windows系统进行通讯。可以使用GetMessage()函数来获取消息,然后利用DispatchMessage()函数发送消息,最后由窗口函数来进行消息的处理。MFC将面向对象的C+编程思想与消息驱动机制结合在一起.VisualC+ProgramDesign5.1.1消息的产生 5.1.2
5、消息的种类 5.1.3一个应用程序的消息映射分析 5.1.4消息映射函数 *5.1.5用类向导管理消息映射 5.5.1 1 认识消息认识消息(下)(下)VisualC+ProgramDesign5.5.1.1 1.1 消息的产生消息的产生 Windows对每一个输入事件都产生一个消 息,Windows应 用 程 序 也 可 以 调 用Windows函数,指示Windows给应用程序发送 消 息,Windows系 统 环 境 也 可 以 给Windows应用程序发送消息,两个Windows应用程序之间也可通过WM_COPYDATA消息来共享数据。VisualC+ProgramDesign5.5.
6、1.2 1.2 消息的种类消息的种类 1.窗口消息窗口消息(Windows message)窗口消息的产生一般与创建窗口、绘制窗口、移动窗口和销毁窗口及在窗口中操作等操作有关 2.命令消息命令消息 命令消息一般与处理用户的请求相关,是由某一用户接口事件所出发的消息。3 3.控件通知消息控件通知消息(Control notification)Control notification)某些重要事件发生时,由控件或者其他类型的子窗口发送到父窗口的消息。4.4.自定义消息自定义消息 有时候用户需要定义一些程序内部使用的消息,以区别于系统定义的消息,这些用户自己定义的消息称为自定义消息。VisualC+
7、ProgramDesign5.5.1.3 1.3 一个应用程序的消息映射分析一个应用程序的消息映射分析 Windows靠消息的流动而转动,在利用Win32 API开发图形界面的应用程序时,在核心的窗口函数(进行消息处理的函数)中使用了一个大的switch/case结构进行流程的控制,对消息进行分门别类地控制。随着对响应消息的增加,switch/case结构会出现多层嵌套,程序理解会出现很大的困难,为了解决这个问题,在MFC中引入了消息映射的概念。VisualC+ProgramDesign例例:一个简单的演示消息映射一个简单的演示消息映射1生成程序框架(1)启动VC6.0,选择“File”菜单的
8、“New”命令,在弹出的“New”对话框中选择“Project”选项卡。(2)在“Project”选项卡的列表中选择“MFC AppWizard(exe)”项,在“Project Name”编辑框中输入要创建的工程名称MsgMap,在“Location”编辑框中设置工程的存放位置,单击“OK”按钮。(3)在弹出的“MFC AppWizard-Step1”对话框中选择“single document”,然后单击“Finish”按钮。(4)在弹出的“New Project information”对话框中单击“OK”按钮,完成应用程序框架的创建。VisualC+ProgramDesign2消息映射
9、 消息映射是一种把Windows系统的各种消息(共四类消息)映射到MFC类库的成员函数上的机制。MFC的应用程序中,消息映射可以被MFC的CCmdTarget类或从其派生而来的任何一个类来使用。在上述生成的MsgMap单文档应用程序中,共有应用程序类、框架类、文档类、视图类和对话框类。这五个类都是从CCmdTarget类派生而来,所以Windows操作系统可以向所有这些类发送消息。VisualC+ProgramDesign3 3应用程序框架中的消息映射应用程序框架中的消息映射3应用程序框架中的消息映射 编译并运行上述程序,在程序的主界面中,单击工具栏中的“?”按钮,则弹出“关于MsgMap”对
10、话框,我们以该功能的实现为例,来说明Windows中的命令消息的映射.VisualC+ProgramDesign(1)“?”工具栏按钮的资源IDVisualC+ProgramDesign (2)“?”工具栏按钮的消息映射 利用应用程序向导生成的标准MFC应用程序中,从CCmdTarget派生的类将消息与消息响应函数通过一些预定义的宏联系起来,实现了一一对应,这种机制就是消息映射,MFC中使用的是功能强大的消息映射宏来实现的。它们是DECLARE_MESSAGE_MAP(初始化消息映射表)、BEGIN_MESSAGE_MAP(开始用户消息映射)、END_MESSAGE_MAP(结束用户消息映射)
11、以及一些ON_宏。VisualC+ProgramDesign 消息映射的声明消息映射的声明 class CMsgMapApp:public CWinApppublic:CMsgMapApp();/应用程序类的构造函数/Overrides 以下为可超载的虚拟函数/ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMsgMapApp)public:virtual BOOL InitInstance();/AFX_VIRTUALVisualC+ProgramDesign 消息映射的声明消息映射的声明/Implementatio
12、n/AFX_MSG(CMsgMapApp)afx_msg void OnAppAbout();/工具栏按钮“?”的消息映射函数/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see in these blocks of generated code!/AFX_MSGmapping macros here./DO NOT EDIT what you see in these blocks of generated code!VisualC+ProgramDesign 消息映
13、射的定义消息映射的定义 DECLARE_MESSAGE_MAP()/消息映射宏的声明;BEGIN_MESSAGE_MAP(CMsgMapApp,CWinApp)/AFX_MSG_MAP(CMsgMapApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/工具栏?按钮ID_APP_ABOUT对单击的消息映射为OnAppAbout/NOTE-the ClassWizard will add and remove/AFX_MSG_MAP/Standard file based document commandsON_COMMAND(ID_FILE_NEW,CWinApp:O
14、nFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_MAP()VisualC+ProgramDesign4 4消息映射中的几种宏定义消息映射中的几种宏定义 消息映射中的映射都是一些定义好的宏,如ON_WM_MOUSEACTIVATE,ON_COMMAND,ON_UPDATE_COMMAND_COMMAND_UI,ON_BN_CLICKED,ON_MES
15、SAGE,ON_REGISTER_MESSAGE等等,这些宏根据消息类别的不同而不同,有的有参数,有的无参数。表5.1是常见的宏。VisualC+ProgramDesign表表5.1 常见消息的映射宏常见消息的映射宏 消息类型宏的形式参数定义的窗口消息ON_WM_xxxx无命令消息ON_COMMAND命令ID,消息映射函数名命令更新消息ON_UPDATE_COMMAND同上控件通知消息ON_xxxx控件ID,消息映射函数名用户自定义消息ON_MESSAGE自定义消息ID,消息映射函数名注册窗口消息ON_REGISTERED_MESSAGE注册消息ID,消息映射函数名多个连续ID号的命令消息ON
16、_COMMAND_RANGE连续命令的起始ID号和终止ID号多个连续ID号的命令更新消息ON_UPDATE_COMMAND_RANGE同上多个连续ID号的控件消息ON_CONTROL_RANGE控件通知码,连续控件的起始ID号和终止ID号VisualC+ProgramDesign5.5.1.4 1.4 消息映射函数消息映射函数 当Windows接收到一个消息时,Windows通过查找消息映射表就能找到一个专门的处理函数来对其进行响应,该函数就是消息映射函数(又叫消息响应函数),它已经是相应类的成员函数。VisualC+ProgramDesign消息映射函数消息映射函数 消息映射函数的实现代码为
17、:void CMsgMapApp:OnAppAbout()/命令消息的消息映射函数的实现CAboutDlg aboutDlg;/声明一个“关于”对话框对象aboutDlgaboutDlg.DoModal();/调用对话框的成员函数DoModal显示对话框VisualC+ProgramDesign5.5.1.5 1.5 用类向导管理消息映射用类向导管理消息映射 1.管理消息 ClassWizard可以用于管理消息和用户交互对象 2.管理成员变量 3.管理ActivcX控件的事件与自动化 由于本书没有讲这方面的内容,故不作详细解释。VisualC+ProgramDesignVisualC+Prog
18、ramDesign5.5.2 2 MFCMFC中消息的发送与接收中消息的发送与接收 5.2.1 消息的发送与接收5.2.2 命令消息的路由 5.2.3 利用函数发送消息 5.2.4 消息的接收与处理 VisualC+ProgramDesign5.5.2.12.1消息的发送与接收消息的发送与接收 大部分消息的发送是由用户与应用程序之间的交互进行的。MFC中的CWinApp类的Run()成员函数负责把消息从应用程序的消息队列中取出,发送到应用程序的窗口函数WinProc()中,由该函数根据消息的类别,传送到相应的对象中。每一个能够接收消息的对象(从CCmdTarget派生)都有一个消息映射表,它用
19、来连接消息与对应的消息响应函数。VisualC+ProgramDesign5.5.2.2 2.2 命令消息的路由命令消息的路由 在MFC程序中,大多数要处理的消息都针对一种类型的对象窗口,这符合Windows API的模式,而且,这些消息的命名都是有实际意义,如消息WM_CREATE、WM_MOVE和WM_SIZE就告诉我们一个窗口被创建、移动和改变其大小了。任何由CCmdTarget派生的类对象都能接收命令消息(点击菜单后发出的WM_COMMAND消息),这些类对象组成一个有序链表,链表中的每一个对象都可以同时接收到命令消息,但命令消息是按照一定的路径传送的,链表中的各个对象处理命令消息的优
20、先级的顺序并不相同。表5.2列出了当MFC发送命令消息给非文档/视窗结构的应用、单文档应用以及多文档应用程序时,查找消息映射表的次序。表5.2 不同应用类型中命令消息的处理路径 VisualC+ProgramDesign表表5.2 不同应用类型中命令不同应用类型中命令消息的处理路径消息的处理路径应用类型基类描述非文档/视窗结构CFrameWnd框架窗口首先得到消息CWinApp应用程序第二个得到消息单文档界面CView激活的视窗首先得到消息CDocument激活的视窗的文档第二个得到消息CSingleDocTemplate激活的视窗的文档模板第三个得到消息CFrameWnd框架窗口第四个得到消
21、息CWndApp应用程序最后得到消息多文档界面CView激活视窗首先得到消息CDocument激活视窗的文档第二个得到消息CMultiDocTemplate激活视窗的文档模板第三个得到消息CMDIChildFrame子框架窗口第四个得到消息CMDIFrameWnd父框架窗口第五个得到消息CWndApp应用程序最后得到消息VisualC+ProgramDesignv但只要有一个接收了消息(拿走了),则后续的就无法得到消息了,处理的只有一个。VisualC+ProgramDesign5.5.2.32.3利用函数发送消息利用函数发送消息 v使用PostMessage()投递消息在线程消息队列中的队尾
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 应用程序 引擎 消息 映射
限制150内