200 likes | 359 Views
Visual C++ 程序设计. 武汉职业技术学院计算机科学系. 万 彪 2004.12. 第六章 消息处理. 本 章 内 容. 1 、 Windows 程序中的消息. 2 、消息映射. 3 、使用 Class Wizard 管理消息和命令. 4 、程序实例. 6.1 Windows 程序中的消息. 6.1.1 Windows 程序中的消息分类 6.1.2 Windows 中常用消息 6.1.3 消息处理函数. 6.1.1 Windows 程序中的消息分类. 1 、窗口消息. 窗口消息 一般与 创建窗口、绘制窗口、移动窗口和销毁窗口
E N D
Visual C++程序设计 武汉职业技术学院计算机科学系 万 彪 2004.12
第六章 消息处理 本 章 内 容 1、Windows程序中的消息 2、消息映射 3、使用Class Wizard管理消息和命令 4、程序实例
6.1 Windows程序中的消息 6.1.1 Windows程序中的消息分类 6.1.2 Windows中常用消息 6.1.3 消息处理函数
6.1.1 Windows程序中的消息分类 1、窗口消息 窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口 的动作有关。这类消息的一般形式为:WM_XXX,其中 XXX内容与窗口消息的内容相关。 窗口消息只能被窗口或视图对象处理。在MFC应用程序中, 视图类和窗口类及其派生类能够处理窗口消息。窗口消息 往往带有参数,其参数wParam和lParam在不同的消息中具 有不同的含义。
6.1.1 Windows程序中的消息分类 2、命令消息 命令消息是指由用户交互对象发送的WM_COMMAND通 知消息。用户交互对象是指菜单、工具条的按钮、快捷键等。 MFC中凡是从基类CCmdTarget派生的类都能处理命令消 息,窗口类、视图派生类、文档类CDocument和应用程序 类CWinApp及它们的派生类都能处理命令消息。 WM_COMMAND消息中,其参数wParam的低16位为命令 的ID号,高16位为0;lParam值为0。
6.1.1 Windows程序中的消息分类 3、控件通知消息 控件是一个小的子窗口,一般它是其他窗口的一个组成部分 ,它能够接收用户的操作并向父窗口发送消息。常见的控 件有按钮、列表框、文字编辑框等。 控件通知消息即指控件或其他子窗口向其父窗口发送命令 消息。常用的控件通知消息用前缀不同来区分,如BM_, CB_,DM_等。 控件通知消息中,其参数wParam的低16位为命令的ID号, 高16位为消息通知码;lParam值为控件窗口句柄。
低字节包含当前光标的X坐标值 高字节包含当前光标的Y坐标值 6.1.2 Windows中常用消息 1. WM_LBUTTONDOWN:产生单击鼠标左键的消息 1Param wParam包含一整数值以标识鼠标键的按下状态 MK_LBUTTON 按下鼠标左键 MK_MBUTTON 按下鼠标中键 MK_RBUTTON 按下鼠标右键 • 此外,相似的消息还有: • WM_LBUTTONUP:放开鼠标左键时产生; • WM_RBUTTONDOWN:单击鼠标右键时产生; • WM_RBUTTONUP:放开鼠标右键时产生; • WM_LBUTTONDBLCLK:双击鼠标左键时产生; • WM_RBUTTONDBLCLK:双击鼠标右键时产生。
6.1.2 Windows中常用消息 2. WM_KEYDOWN:按下一个非系统键时产生的消息 系统键是指实现系统操作的组合键,例如Alt与某个功能键的 组合以实现系统菜单操作等。 wParam:按下键的虚拟键码(如:F1的虚拟键码在Windows.h 中定义为VK_F1),用以标识按下或释放的键 1Param:记录了按键的重复次数、扫描码、转移代码、先前 键的状态等信息。 相似的消息还有WM_KEYUP, 在放开非系统键时产生 3. WM_ CHAR:按下一个非系统键时产生的消息 wParam 为按键的ASCII码 1Param 与WM_KEYDOWN的相同
6.1.2 Windows中常用消息 4. WM_CREATE:由CreateWindow函数发出的消息 wParam:未用 1Param:包含一个指向CREATESTRUCT数据结构的指针 5. WM_CLOSE:关闭窗口时产生的消息 wParam和1Param均未用。 6. WM_DESTROY:由DestroyWiodow函数发出的消息 wParam和1Param均未用。
6.1.2 Windows中常用消息 7. WM_QUIT:由PostQuitMessage函数发出的消息 退出应用程序时发出的消息 wParam:含退出代码,标识程序退出运行时的有关信息 1Param:未用 均产生 WM_PAINT 消息 用户区移动或显示 用户窗口改变大小 程序通过滚动条滚动窗口 下拉式菜单关闭并需要恢复被覆盖的部分 Windows清除对话框等对象,并需要恢复被覆盖的部分
6.1.3 消息处理函数 MFC中,每一个消息都对对应一个专门的函数来处理,该 函数是相应类的成员函数,称为消息处理函数。 CWnd及其派生类都提供了许多默认的消息处理函数,但 控件通知消息和命令消息基本上没有默认处理函数,因此 编制消息处理函数是程序员的一个重要的工作。 一般情况下,程序员在编制消息处理函数时,应从应用程 序本身的功能和消息的特定出发,与其它消息处理函数相 配合,共同完成一项完整的功能。
第六章 消息处理 本 章 内 容 1、Windows程序中的消息 2、消息映射 3、使用Class Wizard管理消息和命令 4、程序实例
6.2 消息映射 6.2.1 消息映射和消息映射表 6.2.2 消息映射项和消息处理方法 6.1.3 SendMessage和PostMessage
6.2.1 消息映射和消息映射表 MFC中消息映射是把消息映射到成员函数中。消息映射使应 用程序在消息处理方面有了很大的改善。传统的API函数写成 的Win32应用程序中,消息是用巨大的“Switch”语句来处理的。 “Switch”中的每个“Case”语句处理一条不同的消息。而大多数 应用程序至少处理数十条消息,这样的处理方法就很繁重。 在设计C++对Win32API的封装时,微软认为需要改进消息的 处理方法,这样产生了消息映射。消息映射用与消息相关的 成员函数,将消息处理移入面向对象编程的世界内,当消息 被发送到应用程序时,由消息映射决定调用哪一个成员函数 来处理此消息。这些成员函数常被称为消息处理函数。
6.2.1 消息映射和消息映射表 MFC中应用程序中,用CWinApp类中的Run()函数从消息队 列中获取消息并送给适当的窗口进行处理。 消息映射指MFC类中将消息与消息处理函数联系起来,形成 一一对应的机制。消息映射表是反映这种对应关系的静态对 照表。任何一个从类CCmdTarget派生的类均可处理消息,都 有自己的消息映射。 声 明 消息映射 实 现
6.2.1 消息映射和消息映射表 1、声明消息映射 class CMyClass:public CObject { ... ... DECLARE_MESSAGE_MAP() } //在类的声明中添加消息映射宏调用,一般在头文件中 2、实现消息映射 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() //在对应的cpp文件中加上消息映射表
6.2.2 消息映射项和消息处理方法 在类的消息映射表中加入相应的 消息映射入口项; 在类定义中加入消息处理函数的 函数原型,即函数声明; 完成一个消息的处理 在类的实现中加入消息处理函数 的函数体。 消息映射入口项的基本语法:ON_MessageName(ID,ClassMethod) 消息处理函数函数原型:afx_msg void ClassMetheod();
6.2.3 SendMessage和PostMessage 在Windows程序设计中,有时需要直接向窗口发送消息。 两种传输消息的方法:发送消息或寄送消息。 1、发送消息 发送消息时就是直接调用窗口函数,其通信是即时的,直到窗口 函数运行完成并返回一个结果后,应用程序才继续执行。 LRESULT Res=pWnd->SendMessage(Msg,wParam,lParam); LRESULT Res=::SendMessage(hWnd,Msg,wParam,lParam);
6.2.3 SendMessage和PostMessage 2、寄送消息 寄送消息是指把消息发送到拥有那个窗口的应用程序消息 队列中。当程序有空闲时将搜索消息队列,在消息队列中 处理消息,即从队列中删除它们,并将它们发送到指定窗 口。寄送消息时,通信可能延迟,直到目标应用程序获得 处理消息的时间。 鼠标和键盘消息通常是寄送的,而其它消息通常是发送的。 LRESULT Res=::PostMessage(hWnd,Msg,wParam,lParam);
第六章 消息处理 本 章 内 容 1、Windows程序中的消息 2、消息映射 3、使用Class Wizard管理消息和命令 4、程序实例