第4章菜单、工具栏与状态栏VisualC++程序设计与应用教程4.1菜单4.2工具栏4.3状态栏4.4应用实例VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏24.1菜单4.1.1菜单的类型常见菜单有3种:主菜单、弹出菜单和快捷菜单。1.主菜单指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏32.弹出菜单指选择主菜单或一个菜单项时弹出的子菜单。3.快捷菜单当右击某个界面对象时,通常会弹出快捷菜单,它出现在鼠标箭头的位置,快速展示当前对象可用的命令功能。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏4菜单设计一般需要经过下面两步:(1)使用菜单编辑器编辑菜单资源;(2)使用ClassWizard进行消息映射,编辑成员函数,完成菜单所要实现的功能。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏54.1.2编辑菜单使用菜单编辑器来编辑菜单资源。双击ResourceView视图中的Menu菜单资源,打开菜单编辑器。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏61.插入新菜单项在空白菜单项位置回车或双击在某菜单项前插入选中该菜单项并按Ins键或拖动VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏72.属性对话框的设置用于输入菜单项的标识符(ID)、标题(Caption)和菜单项在状态栏上显示的提示(Prompt)信息等。菜单项的标识符(ID)菜单项在状态栏上显示的提示信息标题VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏8VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏93.调整菜单项位置选中,拖动。4.删除菜单项用鼠标单击菜单项或用上、下、左、右光标键选择菜单项,然后单击Cut按钮或按Del键删除。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏10【例4.1】编写一个单文档应用程序MyDraw,在菜单栏中增加一个“绘图”主菜单,并在其中添加“矩形”和“椭圆”两个菜单项。(1)编辑菜单(2)添加快捷键VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏114.1.3建立消息映射在上例中仅添加了菜单,并没有实现菜单的功能,即没有对应的命令处理函数与菜单项对应,因此,添加的菜单项是灰色的,即处于当前不可用状态。添加新的菜单项后,还应该为菜单项指定一个处理函数,即利用ClassWizard类向导添加一个消息处理函数。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏12【例4.2】为例4.1中增加的菜单项添加消息处理函数。在视图类中添加画图消息。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏134.1.4菜单的有效控制一般情况下,菜单项都不止一种状态。例如,在没有选择任何内容时,Edit菜单下的Copy、Cut等菜单项是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在Word的视图菜单项下,当用户选用【网格线】或【标尺】时,相应菜单项前会出现一个“√”。MFC通过消息映射机制和CCmdUI类更新菜单项的显示。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏14在类向导ClassWizard的MessageMap标签中,如果选择一个菜单ID,在Messages列表框中就会出现以下两项:COMMANDUPDATE_COMMAND_UI其中UPDATE_COMMAND_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏15【例4.3】为例4.2的程序MyDraw添加更新用户界面的消息处理函数,使程序启动时菜单项【椭圆】处于不可用状态,当用户单击【矩形】菜单项后,在菜单项前显示“√”标记,并使【椭圆】菜单项变为可用。在头文件定义变量,在构造函数全部初始化为FALSE,然后:voidCMyDrawView::OnUpdateRectangle(CCmdUI*pCmdUI){pCmdUI-SetCheck(m_bCheckR);}voidCMyDrawView::OnUpdateEllipse(CCmdUI*pCmdUI){pCmdUI-SetCheck(m_bCheckE);pCmdUI-Enable(m_bEnableE);}voidCMyDrawView::OnRectangle(){…m_bCheckR=TRUE;m_bCheckE=FALSE;m_bEnableE=TRUE;}voidCMyDrawView::OnEllipse(){…m_bCheckE=TRUE;m_bCheckR=FALSE;}VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏164.1.5快捷菜单为应用程序创建快捷菜单主要有以下两种方法。1.使用ComponentGallery创建快捷菜单ComponentGallery(组件画廊)是一个组件库,它保存着可以共享或重用的代码。这些代码包括由VisualC++自带的组件和从用户工程中增加到Gallery中去的用户自定义组件。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏17【例4.4】为例4.3中的应用程序MyDraw增加一个快捷菜单。程序运行后,用户在视图窗口中右击,弹出一个快捷菜单,显示主菜单“绘图”下的所有菜单项。Project|AddToProject,单击ComponentsandControls,选择VisualC++Components.选择Pop-upMenu,单击Insert。选择CMyDrawView。展开资源的Menu文件夹,双击新的菜单资源,删除菜单POPUP下的默认菜单项。将绘图菜单复制过来。为快捷菜单连接一个类。选择存在的类CMyDrawView。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏18快捷菜单2.使用TrackPopupMenu()函数创建快捷菜单(不做要求)4.1.6创建动态菜单(不做要求)VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏194.1.7创建基于对话框的菜单从第2章可知,利用MFCAppWizard[exe]向导工具可以生成基于对话框的应用程序。基于对话框的应用程序在运行时并没有菜单栏。下面我们通过实例来讨论如何给它创建一个菜单。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏20【例4.7】编写一个基于对话框的应用程序Li4_7,为该应用程序添加一个菜单。菜单包括【文件】、【编辑】、【视图】和【帮助】4个主菜单项。插入菜单资源;将菜单链接到对话框类中;在对话框属性中加载。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏214.2工具栏在MFC中,工具栏的功能由类CToolBar实现。工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的基本步骤是:创建工具栏资源;构建一个CToolBar对象;调用CToolBar::Create()或CreateEx()函数创建工具栏窗口;调用CToolBar::LoadToolBar载入工具栏资源。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏224.2.1编辑工具栏使用工具栏编辑器来编辑工具栏资源。双击ResourceView视图中的Toolbar工具栏资源,即可打开工具栏编辑器。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏231.添加按钮双击工具条上的空白按钮,弹出如图所示的ToolbarButtonProperties属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏244.2.2建立消息映射通常,只需让一个按钮的ID值与同样功能菜单项的ID值相同即可。如果按钮没有对应菜单项,则必须利用ClassWizard类向导添加一个消息处理函数。2.删除按钮:拖出工具栏外即可3.编辑按钮位图:可直接绘制VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏25【例4.8】编写一个单文档应用程序Li4_8。删除默认工具栏上的【打印设置】按钮,并在【帮助】按钮前添加【上一页】和【下一页】2个按钮,当用户单击这两个按钮后,视图中分别显示文本“这是《上一页》按钮!”和“这是《下一页》按钮!”。1.编辑工具栏2.添加消息若跟菜单项链接,只需将ID复制即可VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏264.2.3自定义工具栏的操作(不做要求)4.3状态栏状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。使用AppWizard创建的单文档应用程序,接受默认选项时,生成的应用程序自动创建带有默认窗格的状态栏。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏274.3.1状态栏类的继承关系在MFC中,状态栏的功能由CStatusBar类实现。CObjectCCmdTargetCWndCControlBarCStatusBarVisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏284.3.2状态栏类的成员函数成员函数名功能CreateCreateExSetIndicatorsSetPaneTextCommandToIndexGetItemIDGetItemRectGetPaneInfoGetPaneStyleGetPaneText创建一个状态栏,并与状态栏对象相联系,同时初始化字体及高度创建一个有附加风格的状态栏设置窗格ID号设置窗格文本获取给定ID号的窗格索引获取与索引对应的窗格ID号获取给定索引的显示矩形获取给定索引的窗格ID号、风格和宽度获取给定窗格风格获取给定索引的窗格文本VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏294.3.3状态栏操作在CMainFrame类中定义成员变量m_wndStatusBar,它是状态栏类CStatusBar的对象。在MainFrm.cpp中,定义一个静态数组indicators。staticUINTindicators[]={ID_SEPARATOR,//显示命令功能提示ID_INDICATOR_CAPS,//显示大写锁定键状态ID_INDICATOR_NUM,//显示数字锁定键状态ID_INDICATOR_SCRL,//显示滚动锁定键状态};状态栏显示的内容由数组indicators决定。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏30一个应用程序只有一个状态栏,所以对状态栏的操作主要是对状态栏上窗格的操作。为了把一个窗格添加到默认的状态栏中,一般要完成下列步骤:为新建窗格创建一个命令ID和默认字符串;将该窗格的命令ID添加到状态栏的静态数组indicators中;为该窗格创建一个命令更新处理程序。VisualC++程序设计与应用教程2020/2/16第4章菜单、工具栏与状态栏31在静态数组indicators的第一项后面添加ID_INDICATOR_CLOCK;双击串表的空白处,将ID输入,在Caption输入00:00:00;在OnCr