已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 2 18 成都信息工程学院计算机学院 1 MessageMapping 消息映射 2020 2 18 成都信息工程学院计算机学院 2 消息 Windows程序靠消息的流动而维护生命 也就是在窗口函数中借着一个大大的switch case比对动作 判别消息再调用对应的处理程序 2020 2 18 成都信息工程学院计算机学院 3 消息 当我们的类别库成立 如果其中与消息有关的类别 姑且叫作 消息标的类别 好了 在MFC之中就是CCmdTarget 都是一条鞭式地继承 我们应该为每一个 消息标的类别 准备一个消息映射表 并且将基础类别与衍生类别之消息映射表串接起来 然后 当窗口函数做消息的比对时 我们就可以想办法导引它沿着这条路走过去 2020 2 18 成都信息工程学院计算机学院 4 消息 2020 2 18 成都信息工程学院计算机学院 5 消息 但是 MFC之中用来处理消息的C 类别 并不呈单鞭发展 作为applicationframework的重要架构之一的document view 也具有处理消息的能力 因此 消息藉以攀爬的路线应该有横流的机会 2020 2 18 成都信息工程学院计算机学院 6 消息 2020 2 18 成都信息工程学院计算机学院 7 消息映射 消息如何流动 我们暂时先不管 是直线前进 或是中途换跑道 我们都暂时不管 先把这个攀爬路线网建立起来再说 这整个攀爬路线网就是所谓的消息映射表 MessageMap 说它是一张地图 当然也没有错 将消息与表格中的元素比对 然后调用对应的处理例程 这种动作我们也称之为消息映射 MessageMapping 2020 2 18 成都信息工程学院计算机学院 8 宏 为了尽量降低对正常 一般 类别声明和定义的影响 我们希望 最好能够像RTTI和DynamicCreation一样 用一两个宏就完成这巨大蜘蛛网的构造 最好能够像DECLARE DYNAMIC和IMPLEMENT DYNAMIC宏那么方便 2020 2 18 成都信息工程学院计算机学院 9 AFX MSGMAP 首先定义一个数据结构 structAFX MSGMAP AFX MSGMAP pBaseMessageMap AFX MSGMAP ENTRY lpEntries 2020 2 18 成都信息工程学院计算机学院 10 AFX MSGMAP ENTRY 其中的AFX MSGMAP ENTRY又是另一个数据结构 structAFX MSGMAP ENTRY MFC4 0format UINTnMessage windowsmessageUINTnCode controlcodeorWM NOTIFYcodeUINTnID controlID or0forwindowsmessages UINTnLastID usedforentriesspecifyingarangeofcontrolid sUINTnSig signaturetype action orpointertomessage AFX PMSGpfn routinetocall orspecialvalue 2020 2 18 成都信息工程学院计算机学院 11 AFX PMSG 其中的AFX PMSG定义为函数指针 typedefvoid CCmdTarget AFX PMSG void 2020 2 18 成都信息工程学院计算机学院 12 structAFX MSGMAP AFX MSGMAP pBaseMessageMap AFX MSGMAP ENTRY lpEntries structAFX MSGMAP ENTRY UINTnMessage UINTnCode UINTnID UINTnLastID UINTnSig AFX PMSGpfn typedefvoid CCmdTarget AFX PMSG void 2020 2 18 成都信息工程学院计算机学院 13 DECLARE MESSAGE MAP 我们定义一个宏 defineDECLARE MESSAGE MAP staticAFX MSGMAP ENTRY messageEntries staticAFX MSGMAPmessageMap virtualAFX MSGMAP GetMessageMap const 2020 2 18 成都信息工程学院计算机学院 14 DECLARE MESSAGE MAP 于是 DECLARE MESSAGE MAP就相当于声明了这样一个数据结构 2020 2 18 成都信息工程学院计算机学院 15 DECLARE MESSAGE MAP 这个数据结构的内容填塞工作由三个宏完成 defineBEGIN MESSAGE MAP theClass baseClass AFX MSGMAP theClass GetMessageMap const return 2020 2 18 成都信息工程学院计算机学院 16 AfxSig end 其中的AfxSig end定义为 enumAfxSig AfxSig end 0 marksendofmessagemap AfxSig vv AfxSig xx用来描述消息处理例程memberFxn的类型 参数与回返值 本例纯为仿真与简化 所以不在这上面作文章 2020 2 18 成都信息工程学院计算机学院 17 以CView为例 源代码 inheaderfileclassCView publicCWnd public DECLARE MESSAGE MAP inimplementationfile defineCViewid122 BEGIN MESSAGE MAP CView CWnd ON COMMAND CViewid 0 END MESSAGE MAP 2020 2 18 成都信息工程学院计算机学院 18 以CView为例 展开后 inheaderfileclassCView publicCWnd public staticAFX MSGMAP ENTRY messageEntries staticAFX MSGMAPmessageMap virtualAFX MSGMAP GetMessageMap const inimplementationfileAFX MSGMAP CView GetMessageMap const return 2020 2 18 成都信息工程学院计算机学院 19 以图表示则为 2020 2 18 成都信息工程学院计算机学院 20 我们还可以定义各种类似ON COMMAND这样的宏 把各式各样的消息与特定的处理例程关联起来 MFC里头就有名为ON WM PAINT ON WM CREATE ON WM SIZE 等等的宏 2020 2 18 成都信息工程学院计算机学院 21 Frame7 我们在Frame7范例程序中为CCmdTarget的每一衍生类别都产生类似的消息映射表 在需要产生消息映射的class的声明部分都加上 DECLARE MESSAGE MAP 2020 2 18 成都信息工程学院计算机学院 22 Frame7 2020 2 18 成都信息工程学院计算机学院 23 Frame7 并且把各消息映射表的关联性架设起来 给予初值 每一个映射表都只有ON COMMAND一个项目 在class的实现部分写上 BEGIN MESSAGE MAP class baseclass ON COMMAND classid 0 END MESSAGE MAP 2020 2 18 成都信息工程学院计算机学院 24 Frame7 inimplementationfilesBEGIN MESSAGE MAP CWnd CCmdTarget ON COMMAND CWndid 0 END MESSAGE MAP BEGIN MESSAGE MAP CFrameWnd CWnd ON COMMAND CFrameWndid 0 END MESSAGE MAP BEGIN MESSAGE MAP CMyView CView ON COMMAND CMyViewid 0 END MESSAGE MAP 2020 2 18 成都信息工程学院计算机学院 25 Frame7 同时也设定消息的终极镖靶CCmdTarget的映射表内容 AFX MSGMAPCCmdTarget messageMap NULL 于是 整个消息流动网就隐然成形了 2020 2 18 成都信息工程学院计算机学院 26 Frame7程序的MessageMap 2020 2 18 成都信息工程学院计算机学院 27 Frame7 为了验证整个消息映射表 我们必须在映射表中做点记号 等全部构造完成之后 再一一追踪把记号显示出来 我们将为每一个类别的消息映射表加上这个项目 ON COMMAND Classid 0 这样就可以把Classid嵌到映射表中当作记号 正式用途 于MFC中 当然不是这样 这只不过是权宜之计 2020 2 18 成都信息工程学院计算机学院 28 Frame7 在main函数中 我们先产生四个对象 分别是CMyWinApp CMyFrameWnd CMyDoc CMyView对象 CMyWinApptheApp theApp是CMyWinApp对象voidmain CWinApp pApp AfxGetApp pApp InitApplication pApp InitInstance 产生CMyFrameWnd对象pApp Run CMyDoc pMyDoc newCMyDoc 产生CMyDoc对象CMyView pMyView newCMyView 产生CMyView对象CFrameWnd pMyFrame CFrameWnd pApp m pMainWnd 2020 2 18 成都信息工程学院计算机学院 29 Frame7 然后分别取其消息映射表 一路追踪上去 把每一个消息映射表中的类别记号打印出来 voidmain AFX MSGMAP pMessageMap pMyView GetMessageMap coutGetMessageMap coutGetMessageMap coutGetMessageMap cout endl CMyWinAppMessageMap endl MsgMapPrinting pMessageMap 2020 2 18 成都信息工程学院计算机学院 30 Frame7 下面这个函数追踪并打印消息映射表中的classid记号 voidMsgMapPrinting AFX MSGMAP pMessageMap for pMessageMap NULL pMessageMap pMessageMap pBaseMessageMap AFX MSGMAP ENTRY lpEntry pMessageMap lpEntries printlpEntries lpEntry 2020 2 18 成都信息工程学院计算机学院 31 Frame7 voidprintlpEntries AFX MSGMAP ENTRY lpEntry struct intclassid char classname classinfo CCmdTargetid CCmdTarget CWinThreadid CWinThread CWinAppid CWinApp CMyWinAppid CMyWinApp CWndid CWnd CFrameWndid CFra
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年健康风险预警与管理方案
- 十五五规划纲要:碳市场建设的深化与交易机制完善
- 环城路外延伸线申请报告
- 新能源汽车产业中的光储充一体化技术应用
- 2025湖北彭家寨旅游开发限公司人力资源招聘48人易考易错模拟试题(共500题)试卷后附参考答案
- 京考税务考试题库及答案
- 山东税务遴选题库及答案
- 2025年小升初数学试题模拟试卷
- 产品经理培训计划
- Oracle实施顾问技能提升培训计划
- GA 1814.3-2023铁路系统反恐怖防范要求第3部分:运营线路
- 实验五担子菌亚门真菌基本形态及所致病害的观察
- 人教版体育与健康九年级全一册8武术《健身短棍》教案设计
- 连续性肾脏替代疗法
- 2022年煤炭企业管理现代化创新成果获奖项目
- 1.工程建设前期法定建设程序检查表GD1701
- GB/T 3033.1-2005船舶与海上技术管路系统内含物的识别颜色第1部分:主颜色和介质
- GA 1800.2-2021电力系统治安反恐防范要求第2部分:火力发电企业
- 《公路设计》第九章-挡土墙设计(39P)课件
- 《建设项目全过程造价咨询规程》2017年1月18日
- 中药材的采收与产地加工课件
评论
0/150
提交评论