




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 Windows应用程序引擎 消息映射 教学要点本章内容包括消息的介绍 产生 发送 路由 接收 消息映射和消息 消息响应函数的关系 常见窗口消息 键盘消息 鼠标消息和定时器消息 的使用 消息监视工具Spy 使用 要求了解消息映射机制在MFC中的应用程序中的作用 利用API发送同步和异步消息 自定义消息的建立方法 熟悉消息监视工具Spy 的使用 掌握消息映射三个宏的含义 键盘消息 鼠标消息和定时器消息有关概念与用法 熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏 并且自己思考MFC应用程序的执行 内容简介 Windows操作系统下的应用程序都是基于事件驱动而工作的 消息映射是一种把消息映射到相应的消息响应函数上的机制 Windows的各种消息沿着MFC应用程序架构规定的路线 找到它的归宿 消息映射函数 当找不到的话 最终交给窗口对象的DefWindowProc成员函数去进行默认的处理 教学目标 要求了解消息映射机制在MFC中的应用程序中的作用利用API发送同步和异步消息 自定义消息的建立方法 熟悉消息监视工具Spy 的使用掌握消息映射三个宏的含义 键盘消息 鼠标消息和定时器消息有关概念与用法熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏 并且自己思考MFC应用程序的执行过程中 为什么看不到API编程中的WinMain 函数 第5章目录 5 1认识消息5 2MFC中消息的发送与接收5 3常用的窗口消息习题 5 1认识消息 消息机制是Win32程序设计的灵魂 Win应用程序利用格式化的Windows消息与其它Windows应用程序及Windows系统进行通讯 可以使用GetMessage 函数来获取消息 然后利用DispatchMessage 函数发送消息 最后由窗口函数来进行消息的处理 MFC将面向对象的C 编程思想与消息驱动机制结合在一起 5 1 1消息的产生5 1 2消息的种类5 1 3一个应用程序的消息映射分析5 1 4消息映射函数 5 1 5用类向导管理消息映射 5 1认识消息 下 5 1 1消息的产生 Windows对每一个输入事件都产生一个消息 Windows应用程序也可以调用Windows函数 指示Windows给应用程序发送消息 Windows系统环境也可以给Windows应用程序发送消息 两个Windows应用程序之间也可通过WM COPYDATA消息来共享数据 5 1 2消息的种类 1 窗口消息 Windowsmessage 窗口消息的产生一般与创建窗口 绘制窗口 移动窗口和销毁窗口及在窗口中操作等操作有关2 命令消息命令消息一般与处理用户的请求相关 是由某一用户接口事件所出发的消息 3 控件通知消息 Controlnotification 某些重要事件发生时 由控件或者其他类型的子窗口发送到父窗口的消息 4 自定义消息有时候用户需要定义一些程序内部使用的消息 以区别于系统定义的消息 这些用户自己定义的消息称为自定义消息 5 1 3一个应用程序的消息映射分析 Windows靠消息的流动而转动 在利用Win32API开发图形界面的应用程序时 在核心的窗口函数 进行消息处理的函数 中使用了一个大的switch case结构进行流程的控制 对消息进行分门别类地控制 随着对响应消息的增加 switch case结构会出现多层嵌套 程序理解会出现很大的困难 为了解决这个问题 在MFC中引入了消息映射的概念 例 一个简单的演示消息映射 1 生成程序框架 1 启动VC6 0 选择 File 菜单的 New 命令 在弹出的 New 对话框中选择 Project 选项卡 2 在 Project 选项卡的列表中选择 MFCAppWizard exe 项 在 ProjectName 编辑框中输入要创建的工程名称MsgMap 在 Location 编辑框中设置工程的存放位置 单击 OK 按钮 3 在弹出的 MFCAppWizard Step1 对话框中选择 singledocument 然后单击 Finish 按钮 4 在弹出的 NewProjectinformation 对话框中单击 OK 按钮 完成应用程序框架的创建 2 消息映射消息映射是一种把Windows系统的各种消息 共四类消息 映射到MFC类库的成员函数上的机制 MFC的应用程序中 消息映射可以被MFC的CCmdTarget类或从其派生而来的任何一个类来使用 在上述生成的MsgMap单文档应用程序中 共有应用程序类 框架类 文档类 视图类和对话框类 这五个类都是从CCmdTarget类派生而来 所以Windows操作系统可以向所有这些类发送消息 3 应用程序框架中的消息映射 3 应用程序框架中的消息映射编译并运行上述程序 在程序的主界面中 单击工具栏中的 按钮 则弹出 关于MsgMap 对话框 我们以该功能的实现为例 来说明Windows中的命令消息的映射 1 工具栏按钮的资源ID 2 工具栏按钮的消息映射利用应用程序向导生成的标准MFC应用程序中 从CCmdTarget派生的类将消息与消息响应函数通过一些预定义的宏联系起来 实现了一一对应 这种机制就是消息映射 MFC中使用的是功能强大的消息映射宏来实现的 它们是DECLARE MESSAGE MAP 初始化消息映射表 BEGIN MESSAGE MAP 开始用户消息映射 END MESSAGE MAP 结束用户消息映射 以及一些ON 宏 消息映射的声明 classCMsgMapApp publicCWinApp public CMsgMapApp 应用程序类的构造函数 Overrides以下为可超载的虚拟函数 ClassWizardgeneratedvirtualfunctionoverrides AFX VIRTUAL CMsgMapApp public virtualBOOLInitInstance AFX VIRTUAL 消息映射的声明 Implementation AFX MSG CMsgMapApp afx msgvoidOnAppAbout 工具栏按钮 的消息映射函数 NOTE theClassWizardwilladdandremovememberfunctionshere DONOTEDITwhatyouseeintheseblocksofgeneratedcode 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 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 COMMAND COMMAND UI ON BN CLICKED ON MESSAGE ON REGISTER MESSAGE等等 这些宏根据消息类别的不同而不同 有的有参数 有的无参数 表5 1是常见的宏 表5 1常见消息的映射宏 5 1 4消息映射函数 当Windows接收到一个消息时 Windows通过查找消息映射表就能找到一个专门的处理函数来对其进行响应 该函数就是消息映射函数 又叫消息响应函数 它已经是相应类的成员函数 消息映射函数 消息映射函数的实现代码为 voidCMsgMapApp OnAppAbout 命令消息的消息映射函数的实现 CAboutDlgaboutDlg 声明一个 关于 对话框对象aboutDlgaboutDlg DoModal 调用对话框的成员函数DoModal显示对话框 5 1 5用类向导管理消息映射 1 管理消息ClassWizard可以用于管理消息和用户交互对象2 管理成员变量3 管理ActivcX控件的事件与自动化由于本书没有讲这方面的内容 故不作详细解释 5 2MFC中消息的发送与接收 5 2 1消息的发送与接收5 2 2命令消息的路由5 2 3利用函数发送消息5 2 4消息的接收与处理 5 2 1消息的发送与接收 大部分消息的发送是由用户与应用程序之间的交互进行的 MFC中的CWinApp类的Run 成员函数负责把消息从应用程序的消息队列中取出 发送到应用程序的窗口函数WinProc 中 由该函数根据消息的类别 传送到相应的对象中 每一个能够接收消息的对象 从CCmdTarget派生 都有一个消息映射表 它用来连接消息与对应的消息响应函数 5 2 2命令消息的路由 在MFC程序中 大多数要处理的消息都针对一种类型的对象 窗口 这符合WindowsAPI的模式 而且 这些消息的命名都是有实际意义 如消息WM CREATE WM MOVE和WM SIZE就告诉我们一个窗口被创建 移动和改变其大小了 任何由CCmdTarget派生的类对象都能接收命令消息 点击菜单后发出的WM COMMAND消息 这些类对象组成一个有序链表 链表中的每一个对象都可以同时接收到命令消息 但命令消息是按照一定的路径传送的 链表中的各个对象处理命令消息的优先级的顺序并不相同 表5 2列出了当MFC发送命令消息给非文档 视窗结构的应用 单文档应用以及多文档应用程序时 查找消息映射表的次序 表5 2不同应用类型中命令消息的处理路径 表5 2不同应用类型中命令消息的处理路径 但只要有一个接收了消息 拿走了 则后续的就无法得到消息了 处理的只有一个 5 2 3利用函数发送消息 使用PostMessage 投递消息在线程消息队列中的队尾放置消息并立刻返回不等待线程处理这条消息 使用SendMessage 立即发送消息直接向一窗口函数发送消息 它调用一个窗口函数等待窗口函数对消息的处理和返回结果 使用SendDlgItemMessage 向对话框中控件发送消息要指定控件的标识和含有该控件的对话框窗口句柄 5 2 4消息的接收与处理 一般情况下 使用GetMessage 函数来读取这些消息由DispatchMessage 将它们传送给相应的窗口函数进行处理 另外 Windows还可以直接将某些消息发送给某些应用程序的窗口函数 而不将它们放入应用程序的队列中 可以使用SendMessage 函数达到此目的 MFC应用程序中 消息的接收和处理靠消息映射机制来完成 当接收到一个消息时 Windows从消息映射表中找出该消息所对应的消息映射函数 然后调用该映射函数完成相应的功能 5 3常用的窗口消息 5 3 1键盘消息5 3 2鼠标消息5 3 3WM TIMER消息5 3 4自定义消息 5 3 5Windows消息监测工具Spy 的使用 5 3 1键盘消息 1 扫描码与虚拟码按下一个键或者释放一个键 键盘设备就产生一个扫描码 ScanCode 这些扫描码是键盘的物理码 每一个扫描码可以唯一地确定一个按键 为了实现与设备无关的键盘操作 Windows系统中定义了一个虚拟键盘 Windows的键盘驱动程序 Keybord drv 实现将各种不同的物理键盘映射到同一个虚拟键盘 程序员处理的是这唯一的虚拟键 表5 3常用的虚拟键代码 表5 3常用的虚拟键代码 2 击键消息 对于键盘上的所有键 每次按下或释放时 都会产生击键消息 击键消息主要有四种 分别为WM KEYDOWN 键按下 WM SYSKEYDOWN 系统键按下 WM KEYUP 键弹起 WM SYSKEYUP 系统键弹起 3 字符消息 当按了键盘上的任一个键时 Windows都会向窗口函数发送击键消息 对于那些产生可显示字符的操作 Windows还会向窗口函数发送字符消息WM CHAR 因此字符消息不是由硬件产生的 而是由可产生显示字符的击键消息转换而来的 表5 击键与消息的关系 表5 击键与消息的关系 BEGIN MESSAGE MAP CBlocksView CView AFX MSG MAP CBlocksView ON WM TIMER ON WM CREATE ON WM KEYDOWN ON COMMAND IDC PAUSE OnPause ON COMMAND ID FILE NEW OnFileNew ON COMMAND ID GAMEMENU OnGameOption AFX MSG MAPON MESSAGE MS NEWBLOCK OnNewBlock ON MESSAGE MS NEXTBLOCK OnNextBlock ON MESSAGE MS DRAW OnReDraw END MESSAGE MAP 5 3 2鼠标消息 鼠标简介鼠标消息鼠标消息响应函数 1 鼠标简介 Windows系统支持单键 光笔就是模拟单键的鼠标 双键和三键的鼠标 利用API函数GetSystemMetric 可以检测鼠标是否存在以及鼠标上键的个数 2 鼠标消息 当用户移动 按下或释放鼠标键时 都会产生鼠标消息 根据鼠标所处的位置不同 窗口的客户区或非客户区 Windows下的鼠标消息也分为两大类 客户区域的鼠标消息 非客户区域的鼠标消息 3 鼠标消息响应函数 afx msgvoidOnLButtonDown UINTnFlags CPointpoint 参数nFlags代表当按下一个鼠标键盘时 各种虚拟键盘上的键或鼠标上的键是否真的被按下 该参数的值有 MK CONTROL 若按下Ctrl键 则置位 MK SHIFT 若按下Shift键 则置位 MK LBUTTON 若按下鼠标左键 则置位 MK MBUTTON 若按下鼠标中键 则置位 MK RBUTTON 若按下鼠标右键 则置位 参数point代表客户区坐标中鼠标光标的坐标位置 5 3 3WM TIMER消息 Windows定时器是一种周期性的消息产生装置 它会每隔一段指定时间发送一次定时消息WM TIMER 它是一个很重要的系统消息 当系统所设置的时间到达以后 系统就会自动发送该消息 与该消息联系密切的一个函数是SetTimer 它设置一个系统时钟 当设置的时间到时 系统产生WM TIMER消息 通过对SetTimer 函数的参数进行设置 告诉用户哪一个时钟的时间到了 因此 可以将一些周期性的工作放入WM TIMER的消息处理函数 WM TIMER消息 定时器的使用一般遵循下列步骤 1 使用SetTimer 函数设置定时器2 超载OnTimer 函数 完成用户希望的操作3 撤消定时器KillTimer intCBlocksView OnCreate LPCREATESTRUCTlpCreateStruct if CView OnCreate lpCreateStruct 1 return 1 TODO AddyourspecializedcreationcodehereSetTimer 1 gamespeed NULL 设置下落时间PostMessage MS NEXTBLOCK return0 voidCBlocksView OnPause CClientDCdc this if GameState TRUE GameState FALSE dc TextOut 130 150 游戏暂停 KillTimer 1 else Invalidate GameState TRUE SetTimer 1 gamespeed NULL voidCBlocksView OnTimer UINTnIDEvent for i 0 iorg 0 1 2 top org 0 1 2 if top 1 KillTimer 1 MessageBox 游戏结束 退出 MB OK OnNextBlock return SendMessage MS DRAW return 5 3 4自定义消息 Windows应用程序利用格式化的Windows消息来与其它Windows应用程序及Windows系统进行通讯 这些消息被发往应用程序的窗口函数进行处理 建立自定义消息的操作步骤为 定义自己的窗口消息 定义消息标识符 在适当的位置声明消息处理函数将消息处理函数与消息对应起来 映射消息 编写代码实现该消息处理函数利用消息函数向指定的窗口发送消息 例5 5 本程序实现利用自定义消息实现启动Windows系统中 附件 中的 画图 程序 5 3 5Windows消息监测工具Spy 的使用 Windows系统通过传递消息到各个窗口来通知其用户的行为 因此 弄清楚应用程序可以接收的消息类型对掌握Windows的编程十分重要 然而Windows系统中有一千个左右的消息 有时候要搞清楚应该处理哪些消息是很困难的 VisualStudio中包含的Spy 工具就提供了这种能力 它能显示发送到各个窗口的每一条消息 同时能探测出各个应用程序中的窗口 进程 线程 5 3 5Windows消息监测工具Spy 的使用 Spy 显示的层次结构反映了系统对象的层次结构 进程拥有线程 线程拥有窗口 注意有的线程可以没有窗口 有窗口的线程在接收消息时 其优先级别就会提高 这一机制使得Windows的图形用户界面能够快速响应用户的输入 在开发Windows应用程序的过程中 常常
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年叉车司机理论初级试题及答案
- 2025年中考社会真题试卷及答案
- 会计继续教育考试试题及答案
- 2025年医院消毒员(高级)培训题库及答案
- 2025年起重机械电气安装维修考试内部模拟题库含答案
- 2025年中国芦荟果酒数据监测报告
- 2025年电焊工安全教育考核试卷(含答案)
- 2025年G2电站锅炉司炉工考试试题及答案
- 油料作物基保健品创新创业项目商业计划书
- 小白菜跨境电商品牌旗舰店创新创业项目商业计划书
- 常见业务场景网络安全建设VISIO图合集(27个类型)v2023
- 新能源发电技术 电子课件 2.5 可控核聚变及其未来利用方式
- 移动互联网时代的信息安全与防护学习通超星期末考试答案章节答案2024年
- 体育与健康-《立定跳远》教学设计
- 人工智能训练师理论知识考核要素细目表一级
- 加油加气站 反恐防范重点目标档案 范例2024
- 店面漏水赔偿申请书
- GB/T 9799-2024金属及其他无机覆盖层钢铁上经过处理的锌电镀层
- ASME-第九卷焊接和钎焊评定标准-资料
- 国家机关事业单位工作人员受到行政刑事处罚工资处理意见
- 《幕墙工程UHPC单元体幕墙施工专项方案》
评论
0/150
提交评论