《第4章菜单工具栏与状态栏.ppt》由会员分享,可在线阅读,更多相关《第4章菜单工具栏与状态栏.ppt(44页珍藏版)》请在三一办公上搜索。
1、第 4 章 菜单、工具栏与状态栏,Visual C+程序设计与应用教程,4.1 菜单 4.2 工具栏 4.3 状态栏 4.4 应用实例,2,4.1 菜单,4.1.1 菜单的类型 常见菜单有3种:主菜单、弹出菜单和快捷菜单。1.主菜单 指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。,3,2.弹出菜单 指选择主菜单或一个菜单项时弹出的子菜单。3.快捷菜单 当右击某个界面对象时,通常会弹出快捷菜单,它出现在鼠标箭头的位置,快速展示当前对象可用的命令功能。,4,菜单设计一般需要经过下面两步:(1)使用菜单编辑器编辑菜单资源;(2)使用ClassWizard进行消息映射
2、,编辑成员函数,完成菜单所要实现的功能。,5,4.1.2 编辑菜单 使用菜单编辑器来编辑菜单资源。双击ResourceView视图中的Menu菜单资源,打开菜单编辑器。,6,1.插入新菜单项在当前空白菜单项位置插入 选定窗口中的空白菜单项后按回车键(或双击空白菜单项),系统弹出菜单属性对话框。在某菜单项前插入 选中该菜单项并按Ins键,再双击该空白菜单项进行编辑。,7,2.属性对话框的设置 用于输入菜单项的标识符(ID)、标题(Caption)和菜单项在状态栏上显示的提示(Prompt)信息等。,菜单项的标识符(ID),菜单项在状态栏上显示的提示信息,标题,8,9,3.调整菜单项位置 选中某菜
3、单项将其拖至适当位置。4.删除菜单项 用鼠标单击菜单项或用上、下、左、右光标键选择菜单项,然后单击Cut按钮或按Del键删除。,10,【例4.1】编写一个单文档应用程序MyDraw,在菜单栏中增加一个“绘图”主菜单,并在其中添加“矩形”和“椭圆”两个菜单项。,11,4.1.3 建立消息映射 在上例中仅添加了菜单,并没有实现菜单的功能,即没有对应的命令处理函数与菜单项对应,因此,添加的菜单项是灰色的,即处于当前不可用状态。添加新的菜单项后,还应该为菜单项指定一个处理函数,即利用ClassWizard类向导添加一个消息处理函数。,12,【例4.2】为例4.1中增加的菜单项添加消息处理函数。,13,
4、4.1.4 菜单的有效控制 一般情况下,菜单项都不止一种状态。例如,在没有选择任何内容时,Edit菜单下的Copy、Cut等菜单项是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在Word的视图菜单项下,当用户选用【网格线】或【标尺】时,相应菜单项前会出现一个“”。MFC通过消息映射机制和CCmdUI类更新菜单项的显示。,14,在类向导ClassWizard的Message Map标签中,如果选择一个菜单ID,在Messages列表框中就会出现以下两项:COMMANDUPDATE_COMMAND_UI 其中UPDATE_COMMAND
5、_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。,15,【例4.3】为例4.2的程序MyDraw添加更新用户界面的消息处理函数,使程序启动时菜单项【椭圆】处于不可用状态,当用户单击【矩形】菜单项后,在菜单项前显示“”标记,并使【椭圆】菜单项变为可用。,16,4.1.5 快捷菜单 为应用程序创建快捷菜单主要有以下两种方法。,1.使用Component Gallery创建快捷菜单 Component Gallery(组件画廊)是一个组件库,它保存着可以共享或重用的代码。这些代码包括由Visual C+自带的组件和从用户工程中增加到Gallery中去的用户自定义组件。,17,【例
6、4.4】为例4.3中的应用程序MyDraw增加一个快捷菜单。程序运行后,用户在视图窗口中右击,弹出一个快捷菜单,显示主菜单“绘图”下的所有菜单项。,快捷菜单,18,2.使用TrackPopupMenu()函数创建快捷菜单 使用菜单资源编辑器和CMenu:TrackPopupMenu()函数来创建右键快捷菜单。CMenu:TrackPopupMenu函数的原型为:BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT lpRect=NULL);该函数的功能是显示一个右键快捷菜单。其中,nflags表示屏幕位置标志(见下表)。x、
7、y分别表示菜单的水平坐标和顶端的垂直坐标;pWnd表示弹出菜单的窗口,包括全部的WM_COMMAND消息;lpRect表示一个矩形域,当单击这个矩形域时菜单不消失。,19,参数nflags的含义,20,【例4.5】使用TrackPopupMenu()函数创建例4.3中的快捷菜单。,21,4.1.6 创建动态菜单动态创建菜单分为以下3个步骤。(1)利用CreateMenu()函数创建一个空的弹出式菜单,该函数的原型为:HMENU CreateMenu()该函数没有参数,它的返回值是一个菜单句柄。(2)调用AppendMenu()或InsertMenu()函数在菜单中加入菜单项。(3)调用函数Se
8、tMenu()加载动态菜单。,22,【例4.6】为例4.4中的应用程序MyDraw创建一个【画笔】动态菜单。程序运行后,用户单击【绘图|矩形】菜单项,在主菜单中添加动态菜单【画笔】,并通过此菜单的子菜单项画一个红色矩形。,23,4.1.7 创建基于对话框的菜单 从第2章可知,利用MFC AppWizardexe向导工具可以生成基于对话框的应用程序。基于对话框的应用程序在运行时并没有菜单栏。下面我们通过实例来讨论如何给它创建一个菜单。,24,【例4.7】编写一个基于对话框的应用程序Li4_7,为该应用程序添加一个菜单。菜单包括【文件】、【编辑】、【视图】和【帮助】4个主菜单项。,25,4.2 工
9、具栏,在MFC中,工具栏的功能由类CToolBar实现。工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的基本步骤是:l 创建工具栏资源;l 构建一个CToolBar对象;l调用CToolBar:Create()或CreateEx()函数创建工具栏窗口;l 调用CToolBar:LoadToolBar载入工具栏资源。,26,4.2.1 编辑工具栏 使用工具栏编辑器来编辑工具栏资源。双击ResourceView视图中的Toolbar工具栏资源,即可打开工具栏编辑器。,27,1.添加按钮 双击工具条上的空白按钮或单击空白按钮后,选择【View|Properties】菜单项,弹出如
10、图所示的Toolbar Button Properties属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。,28,2.删除按钮 将按钮拖出工具栏外,即可删除该按钮。3.编辑按钮位图设置按钮位图有以下两种方法。l利用绘图工具与调色板直接进行绘制l先利用专用绘图软件制作,然后粘贴到按钮上,29,4.2.2 建立消息映射 通常,只需让一个按钮的ID值与同样功能菜单项的ID值相同即可。如果按钮没有对应菜单项,则必须利用ClassWizard类向导添加一个消息处理函数。,30,【例4.8】编写一个单文档应用程序Li4_8。删除默认工具栏上的【打印设置】按钮,并在【帮助】按钮前添加【上一页】和【下
11、一页】2个按钮,当用户单击这两个按钮后,视图中分别显示文本“这是上一页按钮!”和“这是下一页按钮!”。,31,4.2.3 自定义工具栏的操作 向导生成的标准工具栏的ID值为IDR_MAINFRAME。对一些功能复杂的应用程序,需要创建多个不同的工具栏。生成工具栏的基本步骤:(1)添加工具栏资源;(2)参照MFC应用程序框架添加工具栏的方法,构造一个CToolBar类的对象,调用CToolBar:Create()或CreateEx()函数创建工具栏窗口;(3)调用CToolBar:LoadToolBar()函数载入工具栏资源。,除这些基本步骤之外,还可以调用其他相关函数从而进一步改善工具栏。,3
12、2,1.创建工具栏窗口 调用CToolBar:Create()或CreateEx()函数创建并初始化工具栏窗口对象。若创建成功,函数返回TRUE,否则返回FALSE。2.装载工具栏资源 调用LoadToolBar()函数装载工具栏资源。用Create()或者CreateEx()函数创建工具栏,其实只是获得了一个窗口句柄,工具栏窗口中位图按钮的加载是靠LoadToolBar()函数来完成的。若加载成功,将返回TRUE,否则返回FALSE。,33,3.设置工具栏风格 如果在调用初始化函数CToolBar:Create()或者CreateEx()时设置的工具栏风格不满足需要,可以再用SetBarSt
13、yle()函数重新进行设置。4.设置工具栏停靠特性 设置工具栏停靠特性,需要调用EnableDocking()函数。既要调用CControlBar:EnableDocking()函数设置工具栏的停靠特性,还要调用框架类的成员函数EnableDocking()函数来设置框架窗口以允许它的子窗口控制栏可以以何种方式停靠。不管一个框架窗口中有多少个子窗口控制栏,该函数只需调用一次。,34,5.设置工具栏的初始停靠位置 通过调用CFrameWnd:DockControlBar()函数定位一个工具栏的初始停靠位置。6.移动工具栏 调用CFrameWnd:FloatControlBar()函数来移动、定位
14、一个工具栏。7.工具栏隐显控制 通过对函数CWnd:SetStyle()的调用可以改变某些工具栏窗口的风格,但该函数不能改变WS_VISIBLE,只能通过父类CWnd的ShowWindow()成员函数来显示或隐藏工具栏。,35,【例4.9】编写一个单文档应用程序Li4_9。为该应用程序创建一个带有“线”、“圆”、“矩形”和“文本”4个按钮的工具栏,当用户单击工具栏上的按钮时,在窗口中显示相应的图形。,36,4.3 状态栏,状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。使用AppWizard创建的单文档应用程序,接受默认选项时,生成的应用程序自动创建带有默认窗格的状态栏。,3
15、7,4.3.1 状态栏类的继承关系 在MFC中,状态栏的功能由CStatusBar类实现。,38,4.3.2 状态栏类的成员函数,39,4.3.3 状态栏操作,利用MFC AppWizard向导创建应用程序时,首先在CMainFrame类中定义一个成员变量m_wndStatusBar,它是状态栏类CStatusBar的对象。其次在MFC应用程序框架的实现文件MainFrm.cpp中,为状态栏定义一个静态数组indicators,如下所示:static UINT indicators=ID_SEPARATOR,/显示命令功能提示 ID_INDICATOR_CAPS,/显示大写锁定键状态 ID_I
16、NDICATOR_NUM,/显示数字锁定键状态 ID_INDICATOR_SCRL,/显示滚动锁定键状态;,40,这个全局的提示符数组indicators中的每个元素代表状态栏上一个窗格的ID值,这些ID在应用程序的串表资源String Table中进行了说明。通过增加新的ID标识来增加用于显示状态信息的窗格。状态栏显示的内容由数组indicators决定,需要在状态栏中显示的各窗格的标识符、位置以及个数也由该数组决定,状态栏显示的内容是可以修改的。,41,最后CWnd:Create()函数以主框架窗口为父窗口创建状态栏,创建后默认停靠在主框架窗口的底部。CWnd:SetIndicators(
17、indicators,sizeof(indicators)/sizeof(UINT)函数将创建后的状态栏分隔为sizeof(indicators)/sizeof(UINT)个窗格,窗格的ID分别为indicators数组中的元素值。,42,一个应用程序只有一个状态栏,所以对状态栏的操作主要是对状态栏上窗格的操作。为了把一个窗格添加到默认的状态栏中,一般要完成下列步骤:l为新建窗格创建一个命令ID和默认字符串;l将该窗格的命令ID添加到状态栏的静态数组indicators中;l为该窗格创建一个命令更新处理程序。,43,【例4.10】编写一个单文档应用程序Li4_10。程序运行后,在状态栏中显示系统时间。,44,4.4 应用实例,编写一个能用不同的颜色及线宽绘制正弦与余弦曲线的应用程序。程序运行后,首先在视图窗口中显示坐标轴,然后根据用户所选择的曲线类型、颜色及线宽绘制曲线,并在状态栏中显示相关的提示信息。,