第2章 Windows窗口命令
第2章 Windows 窗口命令
Windows应用程序都是基于消息驱动的,应用程序通过 消息与用户进行交互。消息分为标准 Windows消息、控件通 知消息和命令消息三大类,程序员需要为用户所关心的消息 建立消息映射并编写具有特定功能的消息处理函数
Windows应用程序都是基于消息驱动的,应用程序通过 消息与用户进行交互。消息分为标准Windows消息、控件通 知消息和命令消息三大类,程序员需要为用户所关心的消息 建立消息映射并编写具有特定功能的消息处理函数
2I消息与命令 Windows应用程序都是消息驱动的,消息处理是 Windows 应用程序的核心。消息是操作系统通知应用程序某个事件 已经发生的一种方式,例如当用户敲击键盘、点击菜单、 移动鼠标或改变窗口大小时,都会向适当的窗口发送消息 同样,MFC应用程序也要处理 Windows消息,但是由于MFC 类库中已经封装了消息和对消息的响应事件,这就使在用 Visual o++开发 Windows应用程序时,对消息的处理更加简 单和易于维护。 应用程序在初始化完成后,将调用 CWinapp的成员函数 Rin来处理消息循环,消息循环不断检索由各种事件产生的 消息,并将消息分发给适当的窗口。窗口接收到消息后, 将调用专门的处理函数来处理各种消息。消息处理函数通 常是某个类的成员函数,编写消息处理函数是编写MC应用 程序的主要任务
2.1 消息与命令 Windows应用程序都是消息驱动的,消息处理是Windows 应用程序的核心。消息是操作系统通知应用程序某个事件 已经发生的一种方式,例如当用户敲击键盘、点击菜单、 移动鼠标或改变窗口大小时,都会向适当的窗口发送消息 。同样,MFC应用程序也要处理Windows消息,但是由于MFC 类库中已经封装了消息和对消息的响应事件,这就使在用 Visual C++开发Windows应用程序时,对消息的处理更加简 单和易于维护。 应用程序在初始化完成后,将调用CWinApp的成员函数 Run来处理消息循环,消息循环不断检索由各种事件产生的 消息,并将消息分发给适当的窗口。窗口接收到消息后, 将调用专门的处理函数来处理各种消息。消息处理函数通 常是某个类的成员函数,编写消息处理函数是编写MFC应用 程序的主要任务
211响应消息的实例 212消息的种类 标准 Windows消息 标准 Windows消息主要分为三类。 (1)键盘消息 (2)鼠标消息 (3)窗口消息 2.控件消息 3.命令消息
2.1.1 响应消息的实例 2.1.2 消息的种类 1.标准Windows消息 标准Windows消息主要分为三类。 (1)键盘消息 (2)鼠标消息 (3)窗口消息 2.控件消息 3.命令消息
选择用户界面对象 (1)用户界面对象 如 Clear a菜单项 图24说明了用户界面对象的 产生命令消息 处理过程。 ID EDIT CLEAR ALL (2)命令ID 命令—目标消息映射 (3)命令目标 ON COMMAND (4)命令和控件消息的处理函 调用消息处理函数 数 OnEditClearAll () 图24用户界面对象处理过程
(1)用户界面对象 图2.4说明了用户界面对象的 处理过程。 (2)命令ID (3)命令目标 (4)命令和控件消息的处理函 数 选择用户界面对象, 如Clear All菜单项 产生命令消息 ID_EDIT_CLEAR_ALL 命令—目标消息映射 ON_COMMAND 调用消息处理函数 OnEditClearAll() 图2.4 用户界面对象处理过程
213消息的发送和接收 1.标准 Windows消息和处理函数 2.命令消息的发送 MFC把命令消息发送给命令目标链(有可能处理该消 息的一系列对象),其中至少有一个对象含有处理该命 令消息的消息处理函数。命令目标链中的对象接收到消 息后,将检查自己的消息映射,查看是否能处理相应的 消息。不同对象检查消息映射的时机是不同的,也就是 说,消息是按一定优先顺序在命令目标链中传递的。通 常,每个命令目标类先把命令消息发送给某些其它对象 ,给其它对象先行处理该命令消息的机会。 表23列出了常用目标类的命令发送顺序
2.1.3 消息的发送和接收 1.标准Windows消息和处理函数 2.命令消息的发送 MFC把命令消息发送给命令目标链(有可能处理该消 息的一系列对象),其中至少有一个对象含有处理该命 令消息的消息处理函数。命令目标链中的对象接收到消 息后,将检查自己的消息映射,查看是否能处理相应的 消息。不同对象检查消息映射的时机是不同的,也就是 说,消息是按一定优先顺序在命令目标链中传递的。通 常,每个命令目标类先把命令消息发送给某些其它对象 ,给其它对象先行处理该命令消息的机会。 表2.3列出了常用目标类的命令发送顺序
表23 标准命令的发送顺序 接收到命令的命令目标类 查询命令的顺序 MDI主边框窗口 1)活动的MD子窗口 2)主边框窗口 3)应用程序( CInar类对象) MDI子框架窗口 1)活动视图 2)子框架窗口 SD边框窗口 1)活动视图 2)框架窗口 3)应用程序( CWinApp类对象) 视图 1)视图 2)与视图相连的文档 文档 1)文档 2)与文档相连的文档模板 对话框 1)本对话框 2)拥有本对话框的窗口 3)应用程序( CWinapp3类对象
表2.3 标准命令的发送顺序 接收到命令的命令目标类 查询命令的顺序 MDI主边框窗口 1) 活动的MDI子窗口 2) 主边框窗口 3) 应用程序(CWinApp类对象) MDI子框架窗口 1) 活动视图 2) 子框架窗口 SDI边框窗口 1) 活动视图 2) 框架窗口 3) 应用程序(CWinApp类对象) 视图 1) 视图 2) 与视图相连的文档 文档 1) 文档 2) 与文档相连的文档模板 对话框 1) 本对话框 2) 拥有本对话框的窗口 3) 应用程序(CWinApp类对象)
214消息映射的结构 消息映射都由一组宏组成,可以参照【例2.1】的源代 码,在 MOuse Position view.cp文件中,我们可以看到以 下代码: BEGIN MESSAGE MAP(CMouSe Position View, C View) IAFX MSG MAP(CMouse Position View) ON WM MOUSEMOVEO IJAFX MSG MAP END MESSAGE MAPO
2.1.4 消息映射的结构 消息映射都由一组宏组成,可以参照【例2.1】的源代 码,在CMousePositionView.cpp文件中,我们可以看到以 下代码: BEGIN_MESSAGE_MAP(CMousePositionView, CView) //{{AFX_MSG_MAP(CMousePositionView) ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP()
1.消息映射的继承关系 2.消息映射的结构 表24列出了常用的映射宏及其语法格式。注意 ,映射宏之后不能用分号 3.手工添加消息映射
1.消息映射的继承关系 2.消息映射的结构 表2.4列出了常用的映射宏及其语法格式。注意 ,映射宏之后不能用分号。 3.手工添加消息映射
表24 常用映射宏及其语法 消息类型 宏格式 参数 标准 Windows消息 ON WM XXX 无参数 命令消息 ON COMMAND 命令Ⅲ,处理函数名 命令更新通知消息 ON UPDATE COMMAND UI 命令D,处理函数名 控件通知消息 ON XXX 命令ID,处理函数名 用户自定义消息 ON MESSAGE 自定义消息ID,处理函数 名 已注册 Windows消息 ON REGISTERED MESSAGE 消息⑩,处理函数名 命令ID范围 ON COMMAND RANGE 起始命令ID,结束ID,处 理函数名 将更新的命令D范围 ON UPDATE COMMAND UⅠ RANGE起始命令ID,结束ID,处 理函数名 控件D范围 ON CONTROL RANGE 控件通知码,起始控件ID 结束I,处理函数
表2.4 常用映射宏及其语法 消息类型 宏格式 参 数 标准Windows消息 ON_WM_XXX 无参数 命令消息 ON_COMMAND 命令ID,处理函数名 命令更新通知消息 ON_UPDATE_COMMAND_UI 命令ID,处理函数名 控件通知消息 ON_XXX 命令ID,处理函数名 用户自定义消息 ON_MESSAGE 自定义消息ID,处理函数 名 已注册Windows消息 ON_REGISTERED_MESSAGE 消息ID,处理函数名 命令ID范围 ON_COMMAND_RANGE 起始命令ID,结束ID,处 理函数名 将更新的命令ID范围 ON_UPDATE_COMMAND_UI_RANGE 起始命令ID,结束ID,处 理函数名 控件ID范围 ON_CONTROL_RANGE 控件通知码,起始控件ID, 结束ID,处理函数