第2章Windows窗口命令

上传人:ldj****22 文档编号:48882239 上传时间:2018-07-21 格式:PPT 页数:28 大小:681KB
返回 下载 相关 举报
第2章Windows窗口命令_第1页
第1页 / 共28页
第2章Windows窗口命令_第2页
第2页 / 共28页
第2章Windows窗口命令_第3页
第3页 / 共28页
第2章Windows窗口命令_第4页
第4页 / 共28页
第2章Windows窗口命令_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《第2章Windows窗口命令》由会员分享,可在线阅读,更多相关《第2章Windows窗口命令(28页珍藏版)》请在金锄头文库上搜索。

1、第2章 Windows 窗口命令Windows应用程序都是基于消息驱动的,应用程序通过 消息与用户进行交互。消息分为标准Windows消息、控件通 知消息和命令消息三大类,程序员需要为用户所关心的消息 建立消息映射并编写具有特定功能的消息处理函数。2.1 消息与命令Windows应用程序都是消息驱动的,消息处理是Windows 应用程序的核心。消息是操作系统通知应用程序某个事件 已经发生的一种方式,例如当用户敲击键盘、点击菜单、 移动鼠标或改变窗口大小时,都会向适当的窗口发送消息 。同样,MFC应用程序也要处理Windows消息,但是由于MFC 类库中已经封装了消息和对消息的响应事件,这就使在

2、用 Visual C+开发Windows应用程序时,对消息的处理更加简 单和易于维护。应用程序在初始化完成后,将调用CWinApp的成员函数 Run来处理消息循环,消息循环不断检索由各种事件产生的 消息,并将消息分发给适当的窗口。窗口接收到消息后, 将调用专门的处理函数来处理各种消息。消息处理函数通 常是某个类的成员函数,编写消息处理函数是编写MFC应用 程序的主要任务。2.1.1 响应消息的实例2.1.2 消息的种类1标准Windows消息标准Windows消息主要分为三类。(1)键盘消息(2)鼠标消息(3)窗口消息2控件消息3命令消息(1)用户界面对象图2.4说明了用户界面对象的 处理过程

3、。 (2)命令ID(3)命令目标(4)命令和控件消息的处理函 数选择用户界面对象, 如Clear All菜单项产生命令消息 ID_EDIT_CLEAR_ALL命令目标消息映射 ON_COMMAND调用消息处理函数 OnEditClearAll()图2.4 用户界面对象处理过程2.1.3 消息的发送和接收1标准Windows消息和处理函数2命令消息的发送MFC把命令消息发送给命令目标链(有可能处理该消 息的一系列对象),其中至少有一个对象含有处理该命 令消息的消息处理函数。命令目标链中的对象接收到消 息后,将检查自己的消息映射,查看是否能处理相应的 消息。不同对象检查消息映射的时机是不同的,也就

4、是 说,消息是按一定优先顺序在命令目标链中传递的。通 常,每个命令目标类先把命令消息发送给某些其它对象 ,给其它对象先行处理该命令消息的机会。表2.3列出了常用目标类的命令发送顺序。表2.3标准命令的发送顺序接收到命令的命令目标类查询命令的顺序MDI主边框窗口1) 活动的MDI子窗口 2) 主边框窗口 3) 应用程序(CWinApp类对象) MDI子框架窗口1) 活动视图 2) 子框架窗口SDI边框窗口1) 活动视图 2) 框架窗口 3) 应用程序(CWinApp类对象)视图1) 视图 2) 与视图相连的文档文档1) 文档 2) 与文档相连的文档模板对话框1) 本对话框 2) 拥有本对话框的窗

5、口 3) 应用程序(CWinApp类对象)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消息映射的结构表2.4列出了常用的映射宏及其语法格式。注意 ,映射宏之后不能用分号。3手工添加消息映射表2.4常用映射宏

6、及其语法消息类型宏格式参 数标准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_RANG E起始命令ID,结束ID,处 理函数名控件ID范围ON

7、_CONTROL_RANGE控件通知码,起始控件ID ,结束ID,处理函数2.2 菜 单 栏 2.2.1 菜单简介为了使Windows程序更加易于操作,许多程序员在设 计菜单时,都遵循下列规范: 若点击菜单项,会弹出对话框,在该菜单项文本后应 有“”标记; 若某项菜单含有子菜单,在该菜单项文本后应有标 记; 若菜单项需要助记符,在英文菜单中,需要将助记字 母用下划线标出,在中文菜单中,用括号将带下划线的 助记字母括起来; 若为某菜单项设置快捷键,则一般将其列在相应菜单 项文本之后。1菜单风格最常用的菜单是下拉式菜单和级联菜单。2助记符和快捷键通常要为菜单项命令提供助记符和快捷键,以提供 用户通

8、过键盘快速访问菜单命令的功能。2.2.2 设计菜单1菜单资源编辑器设计菜单,主要是设置菜单的属性。在菜单资源 编辑器中,双击菜单项或右击菜单项并从弹出的快 捷菜单中选择“Properties”项,将弹出“Menu Item Properties”对话框,如图2.5所示,可以通过该对 话框编辑设置菜单项的属性。图2.5 菜单资源编辑器图2.5 菜单资源编辑器 表2.5菜单命令对象的有关属性2完成菜单命令的消息映射菜单项作为用户界面对象,被用户操作后能产生 WM_COMMAND命令消息,命令消息能被文档类、应 用程序类、视图类、窗口类等多种对象接收、处理,可 以使用ClassWizard为命令消息

9、进行消息映射,如图2.6所 示。映射命令消息与映射标准Windows消息类似,只是 在Object IDs列表中要选择相应的菜单ID,要将命令消息 映射到合适的类中,请在Class name列表中选择需要进行 映射的类。图2.6 使用ClassWizard映射菜单命令消息3菜单命令消息的处理过程用户操作菜单时,将会产生命令消息,MFC把命令消息 发送给命令目标链,命令消息在命令目标链中是按照一定 的优先顺序进行传递的。这就使不同的类对象优先响应菜 单命令消息的机会不同了。对于SDI应用程序,响应菜单 命令的优先顺序为:视图文档SDI框架窗口应用程 序,对于MDI应用程序,响应菜单命令的优先顺序

10、为:视 图文档MDI子框架窗口MDI主框架窗口应用程序 。 4为菜单添加快捷键在Windows应用程序中,需要为一些常用的菜单项命令 提供快捷键。快捷键与助记符是有所区别的,助记符是由 操作系统进行解释的,而快捷键是作为MFC的一种资源而 存在的,需要在加速键表中进行定义。在Workspace窗口的 ResourceView选项卡中,打开Accelerator,双击 IDR_MAINFRAME,就可以进行快捷键的定义和编辑。图2.7 快捷键编辑器2.2.3 使用菜单类Cmenu1菜单类的基本操作 (1)创建菜单 (2)获取菜单项 (3)添加和删除菜单项 (4)装入菜单2实现弹出菜单使用CMen

11、u类的TrackPopupMenu函数可以很容易创建 弹出菜单,函数原型为:BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );其中,nFlags表示菜单在屏幕上显示的位置以及鼠标按 钮标志,其取值含义见表2.7。pWnd表示拥有弹出菜单的 窗口指针,此窗口将收到菜单的WM_COMMAND命令消 息。x、y表示菜单显示位置。表2.7nFlags参数取值及含义nFlags值含 义TPM_CENTERALIGN屏幕位置标志,菜单水平中心位置由x参数决定TPM_LEFTALIGN屏幕位

12、置标志,菜单左边位置由x参数决定TPM_RIGHTALIGN屏幕位置标志,菜单右边位置由x参数决定TPM_LEFTBUTTON鼠标按钮标志,用户单击鼠标左键时弹出菜单TPM_RIGHTBUTTON鼠标按钮标志,用户单击鼠标右键时弹出菜单nFlags可以是屏幕位置标志中之一和鼠标按钮标志中之一 的组合。2.3 工 具 栏AppWizard生成应用程序时,通常会生成默认的工具栏 图标,其资源ID号为IDR_MAINFRAME,我们可以以此 资源为基础进行编辑修改,也可以创建新的工具栏并在程 序中显示。AppWizard除了生成默认的工具栏资源外,还 在类CMainFrame中定义一个CToolBa

13、r类成员变量 m_wndToolBar,并在CMainFrame类的OnCreate函数中调 用m_wndToolBar的成员函数Create创建并显示相应的工具 栏。如果要创建第二个工具栏,也必须完成如下过程:( 1)创建新的工具栏资源;(2)在CMainFrame类中定义 CToolBar类型成员变量;(3)在CMainFrame类的 OnCreate函数中创建并显示工具栏对象。2.4 状 态 栏2.4.1 AppWizard生成的状态栏通常情况下,AppWizard生成应用程序框架时,会生成默 认的状态栏。状态栏窗格的数量及排列顺序由MainFrm.cpp 文件中定义的全局静态数组ind

14、icators决定,AppWizard默认 生成的数组如下:static UINT indicators = ID_SEPARATOR, / status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,;AppWizard在CMainFrame类中定义了CStatusBar 类的成员变量m_wndStatusBar,并在CMainFrame类 的OnCreate函数中调用m_wndStatusBar的 SetIndicators成员函数和Create函数创建并显示状态 栏类对象。AppWizard还生

15、成了“查看”菜单,其菜单项“状态 栏”控制状态栏的显示和隐藏。此外,每个指示器 窗格都有更新命令UI消息控制函数,用来更新指示 器窗格的状态。2.4.2 定制自己的状态栏在程序开发过程中,我们可以定制自己的状态栏,定制 工具栏需要完成以下步骤。 (1)定制indicators数组,要增加信息行窗格,只需将 ID_SEPARATOR标识符放在数组的适当位置即可。如果要 增加指示器窗格,首先要定义标识符常量,然后在字符串 资源编辑器中增加以该常量作为ID的字符串资源,字符串 资源编辑器如图2.12所示,最后将ID放在indicators数组的 适当位置。在添加字符串资源时,应在Caption栏中填

16、入初始的字符 串值(可以用空格进行填充),因为该字符串的长度决定了 相应指示器窗格的宽度。图2.12 字符串资源编辑器(2)映射增加的指示器窗格的更新命令消息,以控制 该窗格状态的更新。 (3)在程序的适当地方,通过访问CMainFrame类的 m_wndStatusBar对象并调用其成员函数定制状态栏的输 出和状态,CStatusBar类的主要成员函数有:int CommandToIndex( UINT nIDFind ) const;UINT GetItemID( int nIndex ) const;void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号