您好,欢迎访问三七文档
消息映射南嵌教育教研部MFC应用程序引擎——消息映射Windows操作系统下的应用程序都是基于事件驱动而工作的。消息映射是一种把消息映射到相应的消息响应函数上的机制。Windows的各种消息沿着MFC应用程序架构规定的路线,找到它的归宿——消息映射函数。当找不到的话,最终交给窗口对象的DefWindowProc成员函数去进行默认的处理MFC消息处理更规范:每种消息都有与其名称对应的标准函数。南嵌教育教研部1.要求了解消息映射机制在MFC中的应用程序中的作用利用API发送同步和异步消息、自定义消息的建立方法.2.熟悉消息监视工具Spy++的使用3.掌握消息映射三个宏的含义、键盘消息、鼠标消息和定时器消息有关概念与用法4.熟练掌握在应用程序向导生成的程序中定位到对应三个消息映射宏,并且自己思考MFC应用程序的执行过程中,为什么看不到API编程中的WinMain()函数。南嵌教育教研部1认识消息2MFC中消息的发送与接收3常用的窗口消息习题南嵌教育教研部1认识消息消息机制是MFC程序设计的灵魂,Winows应用程序利用格式化的Windows消息与其它Windows应用程序及Windows系统进行通讯。可以使用GetMessage()函数来获取消息,然后利用DispatchMessage()函数发送消息,最后由窗口函数来进行消息的处理。MFC将面向对象的C++编程思想与消息驱动机制结合在一起.南嵌教育教研部1认识消息(下)1.1消息的产生1.2消息的种类1.3一个应用程序的消息映射分析1.4消息映射函数*1.5用类向导管理消息映射南嵌教育教研部1.1消息的产生Windows对每一个输入事件都产生一个消息,Windows应用程序也可以调用Windows函数,指示Windows给应用程序发送消息,Windows系统环境也可以给Windows应用程序发送消息,两个Windows应用程序之间也可通过WM_COPYDATA消息来共享数据。南嵌教育教研部1.2消息的种类1.窗口消息(Windowsmessage)窗口消息的产生一般与创建窗口、绘制窗口、移动窗口和销毁窗口及在窗口中操作等操作有关WM_CREAT2.命令消息命令消息一般与处理用户的请求相关,是由某一用户接口事件所出发的消息。3.控件通知消息(Controlnotification)某些重要事件发生时,由控件或者其他类型的子窗口发送到父窗口的消息。自定义消息有时候用户需要定义一些程序内部使用的消息,以区别于系统定义的消息,这些用户自己定义的消息称为自定义消息。南嵌教育教研部1.3一个应用程序的消息映射分析Windows靠消息的流动而转动,在利用Win32API开发图形界面的应用程序时,在核心的窗口函数(WinProc消息处理的函数)中使用了一个大的switch/case结构进行流程的控制,对消息进行分门别类地控制。随着对响应消息的增加,switch/case结构会出现多层嵌套,程序理解会出现很大的困难,为了解决这个问题,在MFC中引入了消息映射的概念。南嵌教育教研部例:一个简单的演示消息映射1.生成程序框架(1)启动vs2010,选择“File”菜单的“New”命令,在弹出的“New”对话框中选择“Project”选项卡。(2)在“Project”选项卡的列表中选择“MFCAppWizard(exe)”项,在“ProjectName”编辑框中输入要创建的工程名称MsgMap,在“Location”编辑框中设置工程的存放位置,单击“OK”按钮。(3)在弹出的“MFCAppWizard-Step1”对话框中选择“singledocument”,然后单击“Finish”按钮。MFC(4)在弹出的“NewProjectinformation”对话框中单击“OK”按钮,完成应用程序框架的创建。南嵌教育教研部2.消息映射消息映射是一种把Windows系统的各种消息(共四类消息)映射到MFC类库的成员函数上的机制。MFC的应用程序中,消息映射可以被MFC的CCmdTarget类或从其派生而来的任何一个类来使用。在上述生成的MsgMap单文档应用程序中,共有应用程序类、框架类、文档类、视图类和对话框类。这五个类都是从CCmdTarget类派生而来,所以Windows操作系统可以向所有这些类发送消息。:#defineON_WM_KEYDOWN()\{WM_KEYDOWN,0,0,0,AfxSig_v(AFX_PMSG)(AFX_PMSGW)\(static_castvoid(AFX_MSG_CALLCWnd::*)(UINT,UINT,UINT)(&ThisClass::OnKeyDown))},3.应用程序框架中的消息映射编译并运行上述程序,在程序的主界面中,单击工具栏中的“?”按钮,则弹出“关于MsgMap”对话框,我们以该功能的实现为例,来说明Windows中的命令消息的映射.南嵌教育教研部3.应用程序框架中的消息映射南嵌教育教研部(1)“?”工具栏按钮的资源ID南嵌教育教研部(2)“?”工具栏按钮的消息映射利用应用程序向导生成的标准MFC应用程序中,从CCmdTarget派生的类将消息与消息响应函数通过一些预定义的宏联系起来,实现了一一对应,这种机制就是消息映射,MFC中使用的是功能强大的消息映射宏来实现的。它们是DECLARE_MESSAGE_MAP(初始化消息映射表)、BEGIN_MESSAGE_MAP(开始用户消息映射)、END_MESSAGE_MAP(结束用户消息映射)以及一些ON_宏。南嵌教育教研部①消息映射的声明:afx_msgvoidOnAppAbout();//工具栏按钮“?”的消息映射函数南嵌教育教研部②消息映射的定义南嵌教育教研部消息映射中的几种宏定义消息映射中的映射都是一些定义好的宏,如ON_WM_MOUSEACTIVATE,ON_COMMAND,ON_UPDATE_COMMAND_COMMAND_UI,ON_BN_CLICKED,ON_MESSAGE,ON_REGISTER_MESAAGE等等,这些宏根据消息类别的不同而不同,有的有参数,有的无参数。南嵌教育教研部常见消息的映射宏消息类型宏的形式参数定义的窗口消息ON_WM_xxxx无命令消息ON_COMMAND命令ID,消息映射函数名命令更新消息ON_UPDATE_COMMAND同上控件通知消息ON_xxxx控件ID,消息映射函数名用户自定义消息ON_MESSAGE自定义消息ID,消息映射函数名注册窗口消息ON_REGISTERED_MESSAGE注册消息ID,消息映射函数名多个连续ID号的命令消息ON_COMMAND_RANGE连续命令的起始ID号和终止ID号多个连续ID号的命令更新消息ON_UPDATE_COMMAND_RANGE同上多个连续ID号的控件消息ON_CONTROL_RANGE控件通知码,连续控件的起始ID号和终止ID号南嵌教育教研部1.4消息映射函数当Windows接收到一个消息时,Windows通过查找消息映射表就能找到一个专门的处理函数来对其进行响应,该函数就是消息映射函数(又叫消息响应函数),它已经是相应类的成员函数。南嵌教育教研部消息映射函数//命令消息的消息映射函数的实现voidCMsgMapApp::OnAppAbout(){CAboutDlgaboutDlg;//声明一个“关于”对话框对象aboutDlgaboutDlg.DoModal();//调用对话框的成员函数DoModal创建显示对话框}南嵌教育教研部1.5用类向导管理消息映射1.管理消息ClassWizard可以用于管理消息和用户交互对象2.管理成员变量3.管理ActivcX控件的事件与自动化南嵌教育教研部2MFC中消息的发送与接收2.1消息的发送与接收2.2命令消息的路由2.3利用函数发送消息2.4消息的接收与处理南嵌教育教研部2.1消息的发送与接收大部分消息的发送是由用户与应用程序之间的交互进行的。MFC中的CWinApp类的Run()成员函数负责把消息从应用程序的消息队列中取出,发送到应用程序的窗口函数WinProc()中,由该函数根据消息的类别,传送到相应的对象中。每一个能够接收消息的对象(从CCmdTarget派生)都有一个消息映射表,它用来连接消息与对应的消息响应函数。南嵌教育教研部2.2命令消息的路由在MFC程序中,大多数要处理的消息都针对一种类型的对象——窗口,这符合WindowsAPI的模式,而且,这些消息的命名都是有实际意义,如消息WM_CREATE、WM_MOVE和WM_SIZE就告诉我们一个窗口被创建、移动和改变其大小了。任何由CCmdTarget派生的类对象都能接收命令消息(点击菜单后发出的WM_COMMAND消息),这些类对象组成一个有序链表,链表中的每一个对象都可以同时接收到命令消息,但命令消息是按照一定的路径传送的,链表中的各个对象处理命令消息的优先级的顺序并不相同。表2列出了当MFC发送命令消息给非文档/视窗结构的应用、单文档应用以及多文档应用程序时,查找消息映射表的次序。表2不同应用类型中命令消息的处理路径南嵌教育教研部表2不同应用类型中命令消息的处理路径南嵌教育教研部2.3利用函数发送消息使用PostMessage()投递消息在线程消息队列中的队尾放置消息并立返回不等待线程处理这条消息。使用SendMessage()立即发送消息直接向一窗口函数发送消息,它调用一个窗口函数等待窗口函数对消息的处理和返回结果。使用SendDlgItemMessage()向对话框中控件发送消息要指定控件的标识和含有该控件的对话框窗口句柄。南嵌教育教研部2.4消息的接收与处理一般情况下,使用GetMessage()函数来读取这些消息由DispatchMessage()将它们传送给相应的窗口函数进行处理.另外,Windows还可以直接将某些消息发送给某些应用程序的窗口函数,而不将它们放入应用程序的队列中,可以使用SendMessage()函数达到此目的。MFC应用程序中,消息的接收和处理靠消息映射机制来完成,当接收到一个消息时,Windows从消息映射表中找出该消息所对应的消息映射函数,然后调用该映射函数完成相应的功能。南嵌教育教研部3常用的窗口消息3.1键盘消息3.2鼠标消息3.3WM_TIMER消息3.4自定义消息*3.5Windows消息监测工具Spy++的使用南嵌教育教研部3.1键盘消息1.扫描码与虚拟码按下一个键或者释放一个键,键盘设备就产生一个扫描码(ScanCode),这些扫描码是键盘的物理码,每一个扫描码可以唯一地确定一个按键。为了实现与设备无关的键盘操作,Windows系统中定义了一个虚拟键盘,Windows的键盘驱动程序(Keybord.drv)实现将各种不同的物理键盘映射到同一个虚拟键盘,程序员处理的是这唯一的虚拟键.表3常用的虚拟键代码南嵌教育教研部表3常用的虚拟键代码符号常量对应按键符号常量对应按键VK_LBUTTON鼠标左键VK_0—VK_90键--9键VK_RBUTTON鼠标右键VK_A—VK_ZA键到Z键VK_BACK退格键(BACKSPACE键)VK_NUMPAD0—9数字小键盘0--9键VK_RETURN回车键(Enter)VK_MULTIPY乘号键VK_SHIFTShift键VK_ADD加号键VK_CAPITALCapsLock键VK_SUBTRACT减号键VK_ESCAPEEsc键VK_F1—VK_F24F1键到F24键VK_SPACESpaceBar键VK_NUMLOCKNumLock键VK_PRIORPageUp键VK_TAB制表键(Tab)VK_NEXTPageDown键VK_PAUSEPause键VK_ENDEnd键VK_INSERTIns键VK_HOMEHome键VK_DELETEDel键VK_LEFTLeftArrow(←)键VK_DOWNDownArrow(↓)键南嵌教育教研部2.击键消息对于键盘
本文标题:MFC消息映射
链接地址:https://www.777doc.com/doc-4255940 .html