Visual C++高级编程 第五讲.ppt
文本预览下载声明
Visual C++高级编程 第五讲 管理程序中的消息 消息管理 前面我们已经简单地介绍了Windows中消息循环事件驱动的机制以及 MFC 的消息映射。在这一讲中,我们将深入探讨: 消息派发 消息传递 消息映射 MFC的层次关系 消息处理类 在程序中很多类都可以设计消息处理函数,但是并非所有的MFC类都可以处理消息的。 所有能接收消息的类,都应该派生自CCmdTarget类。 派生自CWnd的所有类,都可以拦下任何Windows消息,与窗口无关的MFC类(如CDocument和CWinApp)只能收到WM_COMMAND命令消息。 消息获取 消息在程序的窗口类注册中就定义好了处理该程序所有消息的窗口函数,因此程序一旦接收到消息首先就是发送给窗口处理函数。 那么首先获取消息的应该是一个共用的窗口处理函数——WndProc,它依据消息结构中消息的目的地(HWND hWnd)来决定发往何处。 窗口函数 要了解消息派发到何处,必须了解程序窗口注册时窗口类中指定的消息处理函数。MFC与SDK不同,窗口的注册在窗口诞生前一刻完成,也就是说“WinMain一开始调用InitApplication完成窗口类的注册”已成了过去。 深入探讨(1) 深入探讨(2) 深入探讨(3) Windows的消息传递 深入探讨(1) 深入探讨(2) 深入探讨(3) 深入探讨(4) 深入探讨(5) 键盘消息 任何游戏都必须设计出与用户交互的功能,消息管理模块的设计是整个游戏的核心模块。键盘消息是一种标准的Windows消息。 键盘是计算机中标准设备之一,虽然目前大多数游戏程序以鼠标或摇杆来作为主要输入设备,但是键盘操纵在游戏中仍然具有较重要的位置。 常用的键盘输入消息 添加响应函数 改写响应函数 鼠标消息 设置窗口外鼠标消息的捕获 可能发生的错误:程序窗口内按下鼠标左键后移动到窗口外释放鼠标,显然本来应该程序处理的鼠标释放消息无法获取。 解决这问题的可以通过SetCapture函数来实现。这函数使程序获取其窗口外的鼠标消息。 当然调用该函数的前提是程序需要接收后续的鼠标消息,通过ReleaseCapture函数可以释放窗口外鼠标消息的捕获。 改变鼠标指针 在游戏中,通过会根据程序的场景以及运行状况来设置各种不同的鼠标指针。 要设置各种不同的鼠标指针可以利用贴位图的方法来实现。具体的实现方法是: 设置鼠标移动消息响应函数捕获鼠标位置; 利用鼠标前两次移动中鼠标所在位置的不同贴不同的人物和鼠标指针图案 * * 几个重要的MFC类的层次关系 疑问1: Windows程序如何获取消息? 疑问2: 消息如何派发到特定的消息处理函数中 即如何传递消息? Create函数中并没有窗口类的注册,但是看到了CreateEx函数 这个窗口创建函数是CFramWnd类的成员函数 CFrame 没有 改写 CreateEx() 这个函数在游戏编程中具有重要的作用,以后我们在详细说明 还是没看到窗口的注册,但是出现了PreCreateWindow CFrame改写了 PreCreateWindow 终于看到了窗口函数,但是在MFC中并不是把消息派给它, 而是利用hook(钩子)技术改换成了AfxWndProc。 命令消息接收物的类型 处理次序 Frame 窗口 View Document 1、View 2、Frame窗口本身 3、CWinApp对象 1、View 本身 2、Document 1、Document 本身 2、Document Template 标准的Windows消息按照直线而上的规则来进行消息传递, 即子类获取到不属于或自己无法处理的消息向父类传递。 实现消息映射的三个宏 采用链表的结构来实现 填 充 填 充 构 造 一个链表节点 又到了CWnd::WindowProc 这个窗口句柄是谁的? 三种不同类型 消息的不同传 递途径 标准消息:由pBaseMap直线向上 第二、三类消息按照指定路径传递 Frame 窗口 1、View 2、Frame窗口本身 3、CWinApp对象 消息 说明 WM_KEYDOWN 按下键盘所发生的消息 WM_KEYUP 松开键盘所发生的消息 WM_CHAR 按下键盘所发生的消息,并转换为对应的字符 WM_KEYDOWN与WM_KEYUP并不分辨输入字符的大小写 WM_CHAR则会根据使用者按下按键的虚键转换成字符。常用虚键P139 响应函数: OnKeyDown(UINT nChar,
显示全部