第7讲--用户交互对象——菜单、工具栏和状态栏_第1页
第7讲--用户交互对象——菜单、工具栏和状态栏_第2页
第7讲--用户交互对象——菜单、工具栏和状态栏_第3页
第7讲--用户交互对象——菜单、工具栏和状态栏_第4页
第7讲--用户交互对象——菜单、工具栏和状态栏_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七讲 用户交互对象 菜单、工具栏和状态栏()计算机高级语言(C+)教学要点 本章内容主要包括菜单资源和工具栏资源的建立,菜单和工具栏按钮对象对WM_COMMAND,UPDATE_COMMAND_UI消息的响应,状态栏牵涉的字符串资源的编辑和对UPDATE _COMMAND _UI消息的响应,在框架类中如何管理工具栏和状态栏。2本章内容从MFC示例开始7.1 菜单7.2 工具栏7.3 状态栏 习题 3从MFC示例开始利用类向导,生成一个名为MfcExam的标准MFC多文档工程4类视图5资源视图6文件视图7用类向导生成菜单消息响应函数8资源ID响应的消息在视图类中响应消息添加消息响应函数9指定消

2、息响应函数的名称10已添加的响应函数编辑代码11类向导生成的代码如下:12在头文件 MfcExamView.h 中添加了响应函数的声明13在视图类 CMfcExamView 中添加了消息响应函数,向导添加的代码未做任何事情1415167.1菜单 7.1.1菜单的组成与分类 7.1.2 创建菜单资源 7.1.3 菜单消息 7.1.4 菜单消息的响应 *7.1.5 为菜单增加快捷键和加速键177.1.1菜单的组成与分类 1菜单的组成 菜单是一种资源,它在资源脚本中经常被存作一个模板,用户通常从菜单栏中选择命令来操作应用程序。菜单主要由下列部分组成: (1)菜单栏 (2)菜单 (3)菜单项 (4)子

3、菜单 (5)分隔条(separator)2菜单的分类 Windows 系统支持三种类型的菜单,它们分别是菜单栏(主菜单)、弹出式子菜单和上下文菜单。187.1.2 创建菜单资源 VC应用程序的资源是由应用程序使用,但却是在程序之外定义的只读数据。菜单是一种资源,可以利用文本编辑器来创建和修改资源,它操作麻烦,不具有可视化的效果。现在的VC程序中的资源编辑都是通过可视化的资源编辑器来进行的。对于SDI的应用程序,应用程序向导生成一个菜单资源IDR_MAINFRAM,对于一般的程序,我们就直接在上面添加自己所需要的菜单资源,方法为:191打开缺省菜单资源 在Workspace窗口中选择Resour

4、ceView选项卡,打开MenuExam工程的资源列表,选中“Menu”资源项目下的“IDR_MAINFRAME”,可以看到应用程序缺省定义的菜单资源形式,它包含如图所示的菜单中的“文件”、“编辑”、“查看”、“帮助”四个菜单项。20 2增加一个主菜单项“图形” 选择“帮助”菜单,然后按“Insert”键将会在“查看”与“帮助”菜单项之间加入一个空菜单项。双击该菜单项,弹出下图所示的主菜单属性对话框,并在其中的“Caption”编辑框中输入主菜单的标题为“图形”。这样在应用程序的主框架中就增加了一个主菜单项“图形”。 21 3、增加主菜单“图形”的子菜单项 用鼠标双击“图形”菜单下的空白菜单项

5、,弹出下图所示的子菜单属性设置对话框,在ID组合框中输入菜单的资源ID为ID_GRAPH_PIE,在“Caption”编辑框中输入“饼图”,在“Prompt”编辑框中输入菜单项提示信息为“在客户区画一个饼图n画饼图”。 22 用同样的方法再添加一个菜单项,其中菜单资源ID为ID_GRAPH_CHORD,“Caption”的内容为“弦图”,“Prompt”中的内容为“在客户区画一个弦图n画弦图”。 23 4增加上下文菜单 上下文菜单必须要有自己的资源ID,在Workspace窗口中选择ResourceView选项卡,打开MenuExam工程的资源列表,鼠标右键单击“Menu”项,在弹出菜单中选择

6、“Insert Menu”,完后将该菜单资源的ID修改为IDR_POPUP_MENU。 用同步骤3的方法在IDR_POPUP_MENU资源中添加主菜单“上下文菜单”。24 7.1.3 菜单消息 菜单被选中时发送消息给Windows,再由Windows传送给应用程序的消息映射。在MFC消息映映射中,有三个菜单消息:WM_COMMAND、ON_UPDATE_COMMAND_UI和WM_CONTEXTMENU。1WM_COMMAND消息 当用户选中了菜单项,激活了相关键加速器或者是选中了与此菜单项相对应的工具栏按钮,Windows发送WM_COMMAND消息,该消息又叫命令消息。命令消息的消息映射采

7、用以下形式: ON_COMMAND(MenuId, ClassMethod)252UPDATE_COMMAND_UI消息 UPDATE_COMMAND_UI是MFC所特有的,如果你想根据应用程序的当前状态激活或者使菜单项无效,或者在程序运行的某一时刻反映菜单项的可用性,该条消息就要处理。消息映射采用以下形式: ON_UPDATE_COMMAND_UI(MenuID, ClassMethod) 3上下文菜单消息WM_CONTEXTMENU 在Windows系统下,随处可见上下文菜单,只要你是在不同程序的不同操作区域内,按下鼠标右键,都会出来一个与当前操作上下文有关的菜单,它就是上下文菜单。当用户

8、按下鼠标右键时,就会发出上下文菜单消息WM_CONTEXTMENU。该消息的消息映射宏为: ON_WM_CONTEXTMENU()26 7.1.4 菜单消息的响应 Windows是通过消息传递机制运行的。菜单项对命令的激发、调用是通过发送WM_COMMAND消息来实现的。在单文档和多文档的应用程序中,要考虑消息的路由问题。 命令消息WM_COMMAND可以映射到不同的类中,可以根据菜单的不同作用进行不同的映射。对于通用的菜单,则在框架中映射。About对话框的显示菜单最好在应用程序类中映射。 在使用类向导为菜单的命令消息进行映射后,ClassWizard自动向程序中插入菜单命令消息映射入口、消

9、息处理函数的原型说明和空的消息映射函数体。 27菜单消息的响应1添加WM_COMMAND菜单命令消息响应函数 (1)打开前面创建的MenuExam工程,选择View|ClassWizard命令打开类向导对话框。 (2)在图7.5所示的对话中,单击“ClassName”列表框中的下拉按钮,在其中选择“CMenuExamView”项,在“Object IDs”列表框中选择“ID_GRAPH_PIE”,在“Message”列表中选择“Command”项,然后单击“Add Fucntion”按钮弹出 “Add Member Function”对话框,采用默认的函数名,单击“OK”按钮。 (3)用同样的

10、方法为视图类CmenuExamView中添加了“弦图”菜单项的命令消息函数 OnGraphChord()。 (4)消息映射函数的实现28菜单消息的响应2添加UPDATE_COMMAND_UI更新菜单命令用户接口的消息响应函数 (1)打开MenuExam工程,选择View|ClassWizard命令打开类向导对话框,单击“ClassName”列表框中的下拉按钮,在其中选择“CMenuExamView”项,在“Object IDs”列表框中选择“ID_GRAPH_PIE”,在“Message”列表中选择“UPDATE_COMMAND_UI”项,然后单击“Add Fucntion”按钮弹出“Add

11、Member Function”对话框,采用默认的函数名OnUpdateGraphPie,单击“OK”按钮。 (2)用同样的方法,在视图类CmenuExamView中添加了“弦图”菜单项的更新命令用户接口的消息函数OnUpdateGraphChord()。 29菜单消息的响应 (3)消息映射函数的实现 “饼图”菜单项的更新命令用户接口消息函数OnUpdateGraphPie的代码void CMenuExamView:OnUpdateGraphPie(CCmdUI* pCmdUI) pCmdUI-Enable(!m_IsPie); “弦图”菜单项的更新命令用户接口消息函数OnUpdateGrap

12、hChord的代码 void CMenuExamView:OnUpdateGraphChord(CCmdUI* pCmdUI) pCmdUI-Enable(m_IsPie); 30 3添加WM_CONTEXTMENU上下文菜单消息响应函数 (1)打开MenuExam工程,选择View|ClassWizard命令打开类向导对话框,单击“ClassName”列表框中的下拉按钮,在其中选择“CMenuExamView”项,在“Object IDs”列表框中选择“CMenuExamView”,在“Message”列表中选择“WM_CONTEXTMENU”项,然后单击“Add Fucntion”按钮弹出

13、“Add Member Function”对话框,采用默认函数名OnContextMenu,单击“OK”按钮。菜单消息的响应31菜单消息的响应(2)鼠标右键单击响应函数OnContextMenu()的实现void CMenuExamView:OnContextMenu(CWnd* pWnd, CPoint point) CMenu PopupMenu; /定义菜单对象PopupMenu.LoadMenu (IDR_POPUP_MENU);PopupMenu.GetSubMenu(0) -TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x

14、,point.y,this); /弹出上下文菜单 327.1.5 为菜单增加快捷键和加速键 在应用程序中,可以为每个菜单项增加快捷键和加速键。所谓快捷键就是当包含该菜单项的菜单被打开时,直接按某指定的键等同于用鼠标单击该菜单项。所谓加速键就是在没有打开包含该菜单项的菜单时,按组合键Ctrl+某指定键等价于用鼠标单击该菜单项。1快捷键的设置 打开菜单资源编辑器,双击“饼图”,修改Caption编辑框的标题为“饼图(&P)tCtrl+T”。33为菜单增加快捷键和加速键2加速键的设置(1)在WorkSpace窗口中选择ResourceView选项卡,单击Accelerator项前面的“+”号,双击展

15、开的列表项中的IDR_MAINFRAME,出现加速键资源编辑器。 ( 2 ) 双击加速键列表项最下面的空白项,单击ID组合框的下拉按钮,从下拉列表中选择ID_GRAPH_PIE,在Key组合框中输入大写字母T。347.2工具栏 本节内容 7.2.1 工具栏简介 7.2.2 一个使用工具栏的应用程序 7.2.3 创建工具栏资源模板 7.2.4 工具栏类CToolBar 7.2.5 在应用程序框架中创建工具栏对象 7.2.6 工具栏的消息处理机制 357.2.1工具栏简介 工具栏为用户提供了程序命令的直接访问方式,工具栏中包含有一些水平排放的图形按钮,当用一次鼠标单击它们时就发送相应的命令消息。

16、从编程角度看,工具栏就是一个子窗口,它显示一系列位图按钮。由于工具栏按钮一般对应着某个菜单选项,因此工具栏的某个按钮和菜单的某个选项除了创建的方式和在界面的显示方式不一样外,对于消息的响应都是一样的。 工具栏和状态栏对象一般作为框架窗口类的成员变量声明,在创建框架窗口时自动创建它们,在销毁框架窗口时自动销毁所创建的控件栏对象。使用AppWizard创建了应用程序的基本框架后,也就建立了初始的工具栏和状态栏对象。367.2.2一个使用工具栏的应用程序 技术要点 本程序主要掌握工具栏资源的建立方法,工具栏对命令消息的响应,熟悉一些API函数的用法,体会VC对系统的控制。3738394041427.

17、2.3 创建工具栏资源模板 工具栏也是一种资源,因此使用工具栏的首要工作是利用VC的可视化的资源编辑器进行工具栏资源的创建与保存,下面为创建与编辑工具栏资源的步骤。 1打开刚才创建的工程ToolBarExam。 2在WorkSpace窗口中选择ResourceView选项卡,单击ToolBar项前面的“+”号展开工具栏资源项目,系统默认的工具栏的ID值为IDR_MAINFRAM。双击IDR_MAINFRAM,VC以设计模式显示出工具条,注意,若想删除无用的工具栏按钮,只需把无用的按钮脱离工具栏即可。 3我们在工具条最右边的空白图标中增加两个新图标,双击创建好的图标,弹出属性对话框,设定该两个工

18、具条按钮的ID为ID_QUIT_WINDOWS和ID_CARTOON,同时在提示栏Prompt中输入“重新启动Windows操作系统n重新启动”和”装载动画鼠标图形n动画图标”。437.2.4 工具栏类CToolBar 类CToolBar提供了带有位图按钮和可选分隔符的工具栏,工具栏按钮有下压式、复选框按钮或单选按钮。CToolBar对象通常是做为派生类CFrameWnd或CMDIFrameWnd框架窗口的对象成员,利用AppWizard创建应用程序框架时,在框架类中已创建了一个CToolBar对象。 MFC的工具栏类CToolBar是创建用来接收某些命令键入并向用户显示状态信息的类,利用它可

19、以立即访问程序命令。 从编程的角度看,工具栏是一个显示一系列位图按钮的子窗口,一旦创建了工具栏并使其可见,就可以用操作窗口的方法来操作它。工具栏的按钮和菜单或加速键一样,单击他们都生成WM_COMMAND消息,并且工具栏的命令ID与菜单或加速键的命令ID相同。下面为该类中几个重要的函数说明。44 1Create()函数 Create()函数用于创建一个Windows工具栏,并将其连接到CToolBar对象上,同时设置工具条的默认高度。该函数的原型如下: BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE |

20、CBRS_TOP,UINT nID = AFX_IDW_TOOLBAR ); 2LoadToolBar()函数 该函数装载指定的工具栏资源,它的原型为: BOOLLoadToolBar(LPCTSTR lpszResourceName ); BOOL LoadToolBar( UINT nIDResource );457.2.5 应用程序框架中创建工具栏对象 在利用MFC AppWizard生成的单文档应用程序中,工具栏对象的创建是在应用程序框架类中,可以说应用程序框架类的一个主要功能就是管理工具栏和状态栏。 1在框架类CMainFrame类中声明工具栏对象 打开上一节所生成的应用程序。在Wo

21、rkSpace窗口中选择ClasseView选项卡,用鼠标双击类视图中的CMainFrame类,程序将定位到该类对应的头文件MainFrm.h中,下面为该类的头文件中有关框架类的声明的内容,所有代码都是自动生成的,请利用上一篇所讲的面向对象理论知识对它进行分析。46 语句CToolBar m_wndToolBar;代表在框架类中有一个从CToolBar派生的对象_wndToolBar;语句CStatusBar m_wndStatusBar代表在框架类中有一个从状态栏类CStatusBar实例化一个状态栏对象m_wndStatusBar。2在框架类CMainFrame类的实现文件中初始化工具栏对

22、象 打开上一节所生成的应用程序。在WorkSpace窗口中选择ClasseView选项卡,用鼠标单击类视图中的CMainFrame类,将该类展开,双击框架类的OnCreate成员函数,程序将自动定位到该类对应的实现文件MainFrm.cpp中的OnCreate的实现处。下面为该类的消息响应函数OnCreate的主要内容(WM_CREATE的响应函数),所有代码都是自动生成的477.2.6 工具栏的消息处理机制 若一个工具栏按钮的资源ID与菜单选项的资源ID一样时,单击工具栏按钮与选择该菜单发出的消息都一样。该命令消息可以像菜单消息一样进行消息的传递,因此在菜单一章中讲的命令消息的传递机制也同样

23、适合于工具栏消息。工具栏要处理的两个主要消息是WM_COMMAND和UPDATE_COMMAND_UI。 和菜单一样,应用程序是通过提供消息映射函数来处理单击工具栏按钮所产生的命令,如果工具栏的某个按钮没有消息COMMAND或UPDATE_COMMAND_UI对应的处理函数,那么框架自动使该按钮无效。 下面我们在视图类中添加对工具栏按钮ID_QUIT_WINDOWS和ID_CARTOON的消息响应函数,添加的方法和对菜单的单击一样,参见7.1.4节的叙述。487.3 状态栏 本节内容 7.3.1 状态栏简介 7.3.2 一个使用状态栏的应用程序 7.3.3 状态栏类CStatuslBar 7.

24、3.4 在应用程序框架中创建状态栏对象 7.3.5 创建字符串资源 7.3.6 状态栏的消息处理49 7.3.1 状态栏简介 状态栏是显示在应用程序主窗口底部的的一个多区域子窗口,用于显示文本信息。 状态栏中的子窗口可以分为状态信息行和状态指示器,如图7.10所示。状态信息行显示应用程序动态提供的字符串,例如单击菜单的命令提示信息,状态指示器显示一些状态信息,如键盘某些键的状态如Capslock键的状态。 AppWizard创建应用程序时,一般自动添加状态栏,程序员在编程的过程中只需在原有的状态栏的基础上适当修改即可。507.3.1状态栏 图7.10 Word软件中的状态栏 状态信息行状态指示

25、器517.3.2 一个使用状态栏的应用程序【例7-3】利用应用程序向导MFC AppWizard(exe)创建一个单文档的应用程序,实现状态栏的操作。1程序功能 本程序是在上一节将的程序基础上添加一个演示状态栏的功能。当程序运行后,在状态栏的信息提示行上显示鼠标在屏幕上的位置,在状态栏指示器的最右端显示系统的时间。2技术要点 本程序主要练习状态栏牵涉的字符串资源的的建立方法,状态栏对更新命令用户接口消息的响应,熟悉自己在类中添加消息映射的方法,熟悉MFC对状态栏的支持。 52535455567.3.3状态栏类CStatuslBar MFC的CStatusBar类用来实现状态栏的功能,CStat

26、usBar类为CControlBar类的派生类,它定义了一个默认的构造函数和一个Create()成员函数。CStatusBar:Create()函数用于创建一个Windows状态栏(子窗口),置初始字体和状态栏的高度,该函数原型为: Bool Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD |WS_VISIBLE|CBRS_BOTTOM,UINT nID = AFX_IDW_STATUS_BAR ); CStatusBar类还提供一系列成员函数来管理状态栏的指示器,主要有: 57 1SetIndicators()函数 函数SetIndica

27、tors()用于设置指示器ID,并装入由每个ID指定的字符串资源,然后将指示器的文字设置为该字符串,该函数的原型为: BOOL SetIndicators( const UINT* lpIDArray, int nIDCount ); 2SetPaneInfo()函数 数SetPaneInfo()用于设置给定索引值的指示器ID、风格和宽度。它的原型为: void SetPaneInfo( int nIndex, UINT nID, UINT nStyle,int cxWidth ); 该函数给标识符栏设置一个新的ID、风格和宽度。 583SetPaneText()函数 函数SetPaneTex

28、t()用于设置给定索引值的指示器的文本,它的 原型为: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 该函数用lpszNewText所指向的字符串来设置状态栏的文字。597.3.4在应用程序框架中创建状态栏对象 在利用MFC AppWizard生成的单文档应用程序中,状态栏对象的创建是在应用程序框架类中。可以说应用程序框架类的一个主要功能就是管理工具栏和状态栏的。因此该节的程序代码请参照7.3.4节内容。1在框架类CMainFrame类的.h头文件中声明状态栏对象 在MFC的应用程序中,状态栏

29、的声明在在框架类CMainFrame类的头文件Mainframe.h中。一般情况在,一个状态栏声明为框架窗口的受保护的CStatusBar成员变量: protected: CStatusBar m_wndStatusBar; 2在框架类CMainFrame类.cpp初始化状态栏对象 状态栏的创建和初始化工作是由该框架窗口在它的OnCreate()函数中完成。Mainfrm.cpp中的OnCreate()函数下60if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/

30、sizeof(UINT)TRACE0(Failed to create status barn); eturn -1; 上述代码的主要功能是调用状态栏对象m_wndStatusBar的成员函数.Create()创建该对象,并且调用状态栏类的成员函数SetIndicators()设置状态栏的提示信息和指示器的信息。 当创建应用程序的基本框架时,AppWizard会在主边框窗口类(CMainFram)中创建类似以下的提示符数组: static UINT indicators = ID_SEPARATOR, / 状态行指示器 ID_INDICATOR_CAPS, ID_INDICATOR_NUM,

31、ID_INDICATOR_SCRL, ;61 7.3.5 创建字符串资源 字符串表也是一种Windows的资源。它包含了应用程序所有字符串的ID号、ID号的数值和字符串内容。使用字符字符串的好处是有利于将应用程序本地化。 要编辑应用程序的字符串资源,可激活WorkSpace窗口的ResourceView栏,双击String Table进入字符串资源编辑器中。在其中插入一个字符串资源ID_INDICATOR_TIME。如图62 添加完字符串资源后,激活WorkSpace窗口的栏,双击Source Files文件夹下的mainfrm.cpp,找到数组indicators的定义,将该字符串资源添加到

32、该数组中。 static UINT indicators = ID_SEPARATOR, / status line indicator ID_INDICATOR_CAPS, /Caps Lock键状态 ID_INDICATOR_NUM, /Num Lock键状态 ID_INDICATOR_SCRL, /Scroll Lock键状态 ID_INDICATOR_TIME /手工添加的显示时间的字符串资源ID ; 637.3.6状态栏的消息处理 本节的程序主要讲解状态栏的使用,状态栏中的子窗口可以分为状态信息行和状态指示器,我们按照状态信息行的消息处理和状态指示器的消息处理来阐述。 1状态信息行的

33、消息处理 许多应用程序都有这样的功能(如AutoCAD)当鼠标在屏幕上移动时,在程序的状态栏上显示鼠标的位置,本节的例子首先要实现该功能。因为鼠标在屏幕移动,这牵涉到WM_MOUSEMOVE消息的处理,因此在状态栏上显示鼠标的位置就是在该消息的响应函数中添加对状态信息行的处理。 利用类向导ClassWizard添加视图类CToolBarExam对WM_MOUSEMOVE的消息映射,在该消息响应函数中添加获取鼠标的光标位置的代码:64 在代码中,使用CWnd的GetDescendantWindow()函数返回一个指向ID_VIEW_STATUS_BAR状态栏的指针,然后使用状态栏成员函数SetP

34、aneText为第0个信息框赋值(注意本程序只能给一个信息框赋值,调用成员函数SetPaneStyle(0,SBPS_POPOUT)将该信息提示框设置成凸起风格。2状态指示器的消息处理 状态指示 器总是与一个字符串资源连接的(7.3.5节创建的ID_INDICATOR_TIME),该字符串是否被显示完全取决于相应更新命令用户接口消息映射函数。指示器是由一个字符串资源ID来标识的,该ID也被用来传递更新命令用户接口消息,因此状态指示器的消息处理主要指对UPDATE_COMMAND_UI消息的映射处理。65(1)声明消息映射函数 在框架类的头文件Mainfrm.h中,找到该类的所有消息映射函数原型的说明,增加ID_INDICATOR_TIME字符串资源ID对UPDATE_COMMAND_UI消息的映射函数OnUpdateTime()原型声明,添加后的代码如下: protected:/AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnUpdateTime(CCmdUI *pCmdUI); / NOTE - the ClassWizard will add

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论