




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章:Windows应用程序引擎消息映射,教学要点本章内容包括消息的介绍(产生、发送、路由、接收),消息映射和消息、消息响应函数的关系,常见窗口消息(键盘消息、鼠标消息和定时器消息)的使用,消息监视工具Spy+使用。要求了解消息映射机制在MFC中的应用程序中的作用、利用API发送同步和异步消息、自定义消息的建立方法,熟悉消息监视工具Spy+的使用,掌握消息映射三个宏的含义、键盘消息、鼠标消息和定时器消息有关概念与用法,熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏,并且自己思考MFC应用程序的执行。,内容简介,Windows操作系统下的应用程序都是基于事件驱动而工作的。消息映射是
2、一种把消息映射到相应的消息响应函数上的机制。Windows的各种消息沿着MFC应用程序架构规定的路线,找到它的归宿消息映射函数。当找不到的话,最终交给窗口对象的DefWindowProc成员函数去进行默认的处理。,教学目标,要求了解消息映射机制在MFC中的应用程序中的作用,利用API发送同步和异步消息、自定义消息的建立方法.熟悉消息监视工具Spy+的使用掌握消息映射三个宏的含义、键盘消息、鼠标消息和定时器消息有关概念与用法熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏,并且自己思考MFC应用程序的执行过程中,为什么看不到API编程中的WinMain()函数。,第9章目录,9.1认识
3、消息9.2MFC中消息的发送与接收9.3常用的窗口消息习题,9.1认识消息,消息机制是Win32程序设计的灵魂,Win应用程序利用格式化的Windows消息与其它Windows应用程序及Windows系统进行通讯。可以使用GetMessage()函数来获取消息,然后利用DispatchMessage()函数发送消息到窗口处理函数,最后由窗口函数来进行消息的处理。MFC将面向对象的C+编程思想与消息驱动机制结合在一起.,9.1.1消息的产生9.1.2消息的种类9.1.3一个应用程序的消息映射分析9.1.4消息映射函数*9.1.5用类向导管理消息映射,9.1认识消息(下),9.1.1消息的产生,W
4、indows对每一个输入事件都产生一个消息,Windows应用程序也可以调用Windows函数,指示Windows给应用程序发送消息,Windows系统环境也可以给Windows应用程序发送消息,两个Windows应用程序之间也可通过WM_COPYDATA消息来共享数据。,9.1.2消息的种类,1.窗口消息(Windowsmessage)窗口消息的产生一般与创建窗口、绘制窗口、移动窗口和销毁窗口及在窗口中操作等操作有关2.命令消息命令消息一般与处理用户的请求相关,是由某一用户接口事件所出发的消息。3.控件通知消息(Controlnotification)某些重要事件发生时,由控件或者其他类型的
5、子窗口发送到父窗口的消息。4.自定义消息有时候用户需要定义一些程序内部使用的消息,以区别于系统定义的消息,这些用户自己定义的消息称为自定义消息。,9.1.3一个应用程序的消息映射分析,Windows靠消息的流动而转动,在利用Win32API开发图形界面的应用程序时,在核心的窗口函数(进行消息处理的函数)中使用了一个大的switch/case结构进行流程的控制,对消息进行分门别类地控制。随着对响应消息的增加,switch/case结构会出现多层嵌套,程序理解会出现很大的困难,为了解决这个问题,在MFC中引入了消息映射的概念。,例:一个简单的演示消息映射,1生成程序框架(1)启动VC6.0,选择“
6、File”菜单的“New”命令,在弹出的“New”对话框中选择“Project”选项卡。(2)在“Project”选项卡的列表中选择“MFCAppWizard(exe)”项,在“ProjectName”编辑框中输入要创建的工程名称MsgMap,在“Location”编辑框中设置工程的存放位置,单击“OK”按钮。(3)在弹出的“MFCAppWizard-Step1”对话框中选择“singledocument”,然后单击“Finish”按钮。(4)在弹出的“NewProjectinformation”对话框中单击“OK”按钮,完成应用程序框架的创建。,2消息映射消息映射是一种把Windows系统的
7、各种消息(共四类消息)映射到MFC类库的成员函数上的机制。MFC的应用程序中,消息映射可以被MFC的CCmdTarget类或从其派生而来的任何一个类来使用。在上述生成的MsgMap单文档应用程序中,共有应用程序类、框架类、文档类、视图类和对话框类。这五个类都是从CCmdTarget类派生而来,所以Windows操作系统可以向所有这些类发送消息。3应用程序框架中的消息映射编译并运行上述程序,在程序的主界面中,单击工具栏中的“?”按钮,则弹出“关于MsgMap”对话框,我们以该功能的实现为例,来说明Windows中的命令消息的映射.,3应用程序框架中的消息映射,(1)“?”工具栏按钮的资源ID,(
8、2)“?”工具栏按钮的消息映射利用应用程序向导生成的标准MFC应用程序中,从CCmdTarget派生的类将消息与消息响应函数通过一些预定义的宏联系起来,实现了一一对应,这种机制就是消息映射,MFC中使用的是功能强大的消息映射宏来实现的。它们是DECLARE_MESSAGE_MAP(初始化消息映射表)、BEGIN_MESSAGE_MAP(开始用户消息映射)、END_MESSAGE_MAP(结束用户消息映射)以及一些ON_宏。,消息映射的声明,classCMsgMapApp:publicCWinApppublic:CMsgMapApp();/应用程序类的构造函数/Overrides以下为可超载的虚
9、拟函数/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CMsgMapApp)public:virtualBOOLInitInstance();/AFX_VIRTUAL,消息映射的声明,/Implementation/AFX_MSG(CMsgMapApp)afx_msgvoidOnAppAbout();/工具栏按钮“?”的消息映射函数/NOTE-theClassWizardwilladdandremovememberfunctionshere./DONOTEDITwhatyouseeintheseblocksofgenerate
10、dcode!/AFX_MSGmappingmacroshere./DONOTEDITwhatyouseeintheseblocksofgeneratedcode!,消息映射的定义,DECLARE_MESSAGE_MAP()/消息映射宏的声明;BEGIN_MESSAGE_MAP(CMsgMapApp,CWinApp)/AFX_MSG_MAP(CMsgMapApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/工具栏?按钮ID_APP_ABOUT对单击的消息映射为OnAppAbout/NOTE-theClassWizardwilladdandremove/AFX_MSG_
11、MAP/StandardfilebaseddocumentcommandsON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/StandardprintsetupcommandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_MAP(),4消息映射中的几种宏定义,消息映射中的映射都是一些定义好的宏,如ON_WM_MOUSEACTIVATE,ON_COMMAND,ON_UPDATE_COMMAN
12、D_UI,ON_BN_CLICKED,ON_MESSAGE,ON_REGISTER_MESAAGE等等,这些宏根据消息类别的不同而不同,有的有参数,有的无参数。表9.1是常见的宏,表9.1常见消息的映射宏,9.1.4消息映射函数,当Windows接收到一个消息时,Windows通过查找消息映射表就能找到一个专门的处理函数来对其进行响应,该函数就是消息映射函数(又叫消息响应函数),它是相应类的成员函数。,消息映射函数,消息映射函数的实现代码为:voidCMsgMapApp:OnAppAbout()/命令消息的消息映射函数的实现CAboutDlgaboutDlg;/声明一个“关于”对话框对象abo
13、utDlgaboutDlg.DoModal();/调用对话框的成员函数DoModal显示对话框,9.1.5用类向导管理消息映射,1.管理消息ClassWizard可以用于管理消息和用户交互对象2.管理成员变量3.管理ActivcX控件的事件与自动化由于本书没有讲这方面的内容,故不作详细解释。,9.2MFC中消息的发送与接收,9.2.1消息的发送与接收9.2.2命令消息的路由9.2.3利用函数发送消息9.2.4消息的接收与处理,9.2.1消息的发送与接收,大部分消息的发送是由用户与应用程序之间的交互进行的。MFC中的CWinApp类的Run()成员函数负责把消息从应用程序的消息队列中取出,发送到
14、应用程序的窗口函数WinProc()中,由该函数根据消息的类别,传送到相应的对象中。每一个能够接收消息的对象(从CCmdTarget派生)都有一个消息映射表,它用来连接消息与对应的消息响应函数。,9.2.2命令消息的路由,在MFC程序中,大多数要处理的消息都针对一种类型的对象窗口,这符合WindowsAPI的模式,而且,这些消息的命名都是有实际意义,如消息WM_CREATE、WM_MOVE和WM_SIZE就告诉我们一个窗口被创建、移动和改变其大小了。任何由CCmdTarget派生的类对象都能接收命令消息(点击菜单后发出的WM_COMMAND消息),这些类对象组成一个有序链表,链表中的每一个对象
15、都可以同时接收到命令消息,但命令消息是按照一定的路径传送的,链表中的各个对象处理命令消息的优先级的顺序并不相同。表9.2列出了当MFC发送命令消息给非文档/视窗结构的应用、单文档应用以及多文档应用程序时,查找消息映射表的次序。表9.2不同应用类型中命令消息的处理路径,表9.2不同应用类型中命令消息的处理路径,9.2.3利用函数发送消息,使用PostMessage()投递消息在线程消息队列中的队尾放置消息并立返回不等待线程处理这条消息。使用SendMessage()立即发送消息直接向一窗口函数发送消息,它调用一个窗口函数等待窗口函数对消息的处理和返回结果。使用SendDlgItemMessage
16、()向对话框中控件发送消息要指定控件的标识和含有该控件的对话框窗口句柄。,9.2.4消息的接收与处理,一般情况下,使用GetMessage()函数从消息队列读取这些消息,由DispatchMessage()将它们传送给相应的窗口函数进行处理.另外,Windows还可以直接将某些消息发送给某些应用程序的窗口函数,而不将它们放入应用程序的队列中,可以使用SendMessage()函数达到此目的。MFC应用程序中,消息的接收和处理靠消息映射机制来完成,当接收到一个消息时,Windows从消息映射表中找出该消息所对应的消息映射函数,然后调用该映射函数完成相应的功能。,9.3常用的窗口消息,9.3.1键
17、盘消息9.3.2鼠标消息9.3.3WM_TIMER消息9.3.4自定义消息*9.3.5消息监测工具Spy+的使用,9.3.1键盘消息,1扫描码与虚拟码按下一个键或者释放一个键,键盘设备就产生一个扫描码(ScanCode),这些扫描码是键盘的物理码,每一个扫描码可以唯一地确定一个按键。为了实现与设备无关的键盘操作,Windows系统中定义了一个虚拟键盘,Windows的键盘驱动程序Keybord.drv实现将各种不同的物理键盘映射到同一个虚拟键盘,程序员处理的是这唯一的虚拟键.表9.3常用的虚拟键代码,表9.3常用的虚拟键代码,2击键消息,对于键盘上的所有键,每次按下或释放时,都会产生击键消息。
18、击键消息主要有四种,分别为WM_KEYDOWN(键按下)、WM_SYSKEYDOWN(系统键按下)、WM_KEYUP(键弹起)、WM_SYSKEYUP(系统键弹起),3字符消息,当按了键盘上的任一个键时,Windows都会向窗口函数发送击键消息,对于那些产生可显示字符的操作,Windows还会向窗口函数发送字符消息WM_CHAR。因此字符消息不是由硬件产生的,而是由可产生显示字符的击键消息转换而来的,表9.击键与消息的关系,表9.击键与消息的关系,9.3.2鼠标消息,鼠标简介鼠标消息鼠标消息响应函数,1.鼠标简介,Windows系统支持单键(光笔就是模拟单键的鼠标)、双键和三键的鼠标,利用AP
19、I函数GetSystemMetric()可以检测鼠标是否存在以及鼠标上键的个数。,2.鼠标消息,当用户移动、按下或释放鼠标箭时,都会产生鼠标消息,根据鼠标所处的位置不同(窗口的客户区或非客户区),Windows下的鼠标消息也分为两大类:客户区域的鼠标消息、非客户区域的鼠标消息。,3.鼠标消息响应函数,afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);参数nFlags代表当按下一个鼠标键盘时,各种虚拟键盘上的键或鼠标上的键是否真的被按下,该参数的值有:MK_CONTROL(若按下Ctrl键,则置位),MK_SHIFT(若按下Shift键,则置位),
20、MK_LBUTTON(若按下鼠标左键,则置位),MK_MBUTTON(若按下鼠标中键,则置位),MK_RBUTTON(若按下鼠标右键,则置位)。参数point代表客户区坐标中鼠标光标的坐标位置。,9.3.3WM_TIMER消息,Windows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息WM_TIMER。它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发送该消息。与该消息联系密切的一个函数是SetTimer(),它设置一个系统时钟,当设置的时间到时,系统产生WM_TIMER消息。通过对SetTimer()函数的参数进行设置,告诉用户哪一个时钟的时间到了
21、,因此可以将一些周期性的工作放入WM_TIMER的消息处理函数,WM_TIMER消息,定时器的使用一般遵循下列步骤:1.使用SetTimer()函数设置定时器2.超载OnTimer()函数,完成用户希望的操作3.撤消定时器KillTimer(),9.3.4自定义消息,Windows应用程序利用格式化的Windows消息来与其它Windows应用程序及Windows操作系统进行通讯,这些消息被发往应用程序的窗口函数进行处理。,建立自定义消息的操作步骤为:,定义自己的窗口消息(定义消息标识符)在适当的位置声明消息处理函数将消息处理函数与消息对应起来(映射消息)编写代码实现该消息处理函数利用消息函数
22、向指定的窗口发送消息【例9-5】本程序实现利用自定义消息实现启动Windows系统中“附件”中的“画图”程序,*9.3.5Windows消息监测工具Spy+的使用,Windows系统通过传递消息到各个窗口来通知其用户的行为,因此弄清楚应用程序可以接收的消息类型对掌握Windows的编程十分重要。然而Windows系统中有一千个左右的消息,有时候要搞清楚应该处理哪些消息是很困难的。VisualStudio中包含的spy+工具就提供了这种能力,它能显示发送到各个窗口的每一条消息,同时能探测出各个应用程序中的窗口、进程、线程。,*9.3.5Windows消息监测工具Spy+的使用,Spy+显示的层次结构反映了系统对象的层次结构:进程拥有线程、线程拥有窗口。注意有的线程可以没有窗口,有窗口的线程在接收消息时,其优先级别就会提高。这一机制使得Windows的图形用户界面能够快速响应用户的输入。在开发Windows应用程序的过程中,常常会碰到程序不能正常结束的错误,虽然用户程序窗口已经不存在了,但其进程仍在系统中运行,Spy+的线程窗口能准确地告诉我们当前有多少线程在系统中运行。,*9.3.5Windo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省浑源县第五中学校2025年化学高一下期末达标检测模拟试题含解析
- 公务往返签证管理办法
- 北京收容管理办法修订
- 创新重点税源管理办法
- 公益诉讼损害管理办法
- 回收芯片高频管理办法
- 团队目标考核管理办法
- 医疗废物出境管理办法
- 作业工具管理办法台账
- 林业园林建设管理办法
- 2024年露营帐篷项目可行性研究报告
- 《公务员录用体检操作手册(试行)》
- 2024粤东西粤北地区教师全员轮训培训心得总结
- 2024-2025学年华东师大版数学七年级上册计算题专项训练
- 福建省机关工作人员年度考核登记表
- JBT 7808-2010 无损检测仪器 工业X射线探伤机主参数系列
- DB44-T 2474-2024 自然教育标识设置指引
- 研学基地合作协议
- 驾驶员行为规范管理制度
- (高清版)JTG D81-2017 公路交通安全设施设计规范
- 《锅炉水介质检验导则标准-征求意见稿》
评论
0/150
提交评论