2012-08-25 06:59
⁄ 工业·编程
⁄ 共 1918字 ⁄ 字号
小 中 大
- 编程框架对消息与命令进行了必要的调整,使程序处理消息更容易,更易维护与封装。
- 1:消息
- 类CWinApp的成员方法Run函数中有一个消息循环,它会从消息队列中提取由各种
- 事件产生的消息。编程框架对消息循环的实现方式是提取消息,解析消息和分发消息。
- 2:消息处理函数
- 在MFC中,一个有作用的消息处理函数会处理每一个单独的消息。消息处理函数是
- 类的一个成员函数。消息处理函数可以实现你想针对消息的任何响应。添加消息
- 处理函数的一般方法是在属性窗口中添加函数,然后在编辑器中添加相应的代码。
- 3:消息分类
- 消息主要分为三大类:
- A:Windows消息
- 这类消息主要包含WM_COMMAND之外的所有以WM为前缀的消息。这类消息主要由
- 窗口和视图处理。通常这类消息会通过其参数来决定如何处理消息。
- B:控件通知
- 这类消息包含了由控件或其它子窗口到其父窗口的WM_COMMAND通知消息。
- 比如当用户改变了一个编辑控件里的内容的时候,编辑控件会向其父窗口
- 发送一个包含EN_CHANGE信息的WM_COMMAND通知消息。
- 编辑框架会向路由其它Windows消息一会路由控件通知消息。但有一个例外:
- 即通过点击按钮而产生的BN_CLICKED通知消息,这个消息会被当作命令消息
- 处理。
- C:命令消息
- 这类消息包含了由UI对象如菜单,工具栏等产生的WM_COMMAND通知消息。
- 编程框架会以不同于其它消息的方式处理这类消息,这类消息也可以被多种
- 对象处理。
- 前二种消息主要由窗口进行处理,即从CWnd派生出来的类对象。这些类包括
- CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView, CDialog及用户自己的由这
- 些类派生出来的类。这些类都封装了一个HWND,即唯一标识窗口的句柄。
- 第三种消息,即命令消息可被很多种对象处理,如文档,文档模板,应用程序本身
- 及窗口和视图。
- 4:消息映射
- 每一个编辑框架内的能够接收消息或者命令的类都有其自身的消息映射。编辑框架
- 通过消息映射将消息,命令与其处理函数联系起来。每一个从CCmdTarget派生的类
- 都有一个消息映射。
- 5:UI对象及命令ID
- 菜单项,工具栏按钮及快捷键就是能够产生命令的UI对象。每一个UI对象都有一个
- ID,能过给UI对象和命令指定相同的ID可以将二者联系起来。命令会被当作特殊
- 的消息对待。
- 下面五步演示了编程框架如何管理命令:
- step1: Clear All menu Item ->选中的UI对象
- step2: ID_EDIT_CLEAR_ALL ->产生的命令
- step3: Document Object ->命令目标映射ON_COMMAND
- step4: OnEditClearAll ->命令处理函数
- step5: Clear all document data ->作出响应
- 当UI对象产生了一个命令比如ID_EDIT_CLEAR_ALL,你应用程序中会有一个对象
- 处理这条命令,通过命令目标映射即消息映射找到了相应的处理函数OnEditClearAll。
- 下面的五步演示了MFC如何更新UI对象:
- step1: Menu Popup ->UI对象的状态
- step2: ID_EDIT_CLEAR_ALL ->产生的命令
- step3: Document Object ->命令目标映射ON_UPDATE_COMMAND_UI
- step4: OnEditClearAll ->命令处理函数
- step5: Enable/Disable menu item ->作出响应
- 在菜单被按下之前,MFC会路由一个更新命令,文档对象会调用更新函数。
- 6:命令目标
- 系统会将非命令消息直接发送给窗口,然后窗口过程会被调用。但对于命令消息
- 而言,编程框架会在多个候选对象之间路由命令消息,它们中的一个的处理函数
- 会被调用。对于普通消息和命令消息而言,处理函数会作出同样的响应,但处理
- 函数被调用的机制却不同。