资源描述
Visual C+,程序设计,*,*,第,6,章 菜单、工具栏与状态栏,第,6,章,菜单、工具栏与状态栏,6.1,菜单,6.2,工具栏,6.3,状态栏,1,6.1,菜单,6.1.1,菜单的类型,常见菜单有,3,种,:,主菜单、弹出菜单和快捷菜单,。,1.,主菜单,指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。,2,2.,弹出菜单,指,选择主菜单或一个菜单项时弹出的子菜单,。,3.,快捷菜单,当,右击某个界面对象,时,通常会,弹出快捷菜单,,它出现在鼠标箭头的位置,,快速展示当前对象可用的命令功能,。,3,菜单设计一般需要经过下面两步,:,(1),使用菜单编辑器编辑菜单资源,;,(2),使用,ClassWizard,进行消息映射,编辑成员函数,完成菜单所要实现的功能,。,4,6.1.2,编辑菜单,使用菜单编辑器来编辑菜单资源。双击,ResourceView,视图中的,Menu,菜单资源,打开菜单编辑器。,5,1.,插入新菜单项,在当前空白菜单项位置插入,选定窗口中的空白菜单项后按回车键,(,或双击空白菜单项,),,系统弹出菜单属性对话框。,在某菜单项前插入,选中该菜单项并按,Ins,键,再双击该空白菜单项进行编辑。,6,2.,属性对话框的设置,用于输入菜单项的,标识符,(ID),、,标题,(Caption),和菜单项在状态栏上显示的,提示,(Prompt),信息等,。,菜单项的标识符,(ID),菜单项在状态栏上显示的提示信息,标题,7,8,3.,调整菜单项位置,选中某菜单项将其拖至适当位置。,4.,删除菜单项,用鼠标单击菜单项或用上、下、左、右光标键选择菜单项,然后单击,Cut,按钮或按,Del,键删除。,9,【,例,6.1】,编写一个单文档应用程序,MyDraw,,,在菜单栏中,增加一个“绘图,”主菜单,,并在其中添加“矩形”和“椭圆”两,个菜,单项。,(1),利用,MFC,AppWizardexe,向导生成一个项目名为,MyDraw,的单文档应用程序,。,(2),增加“绘图”主菜单。,打,开,ResourceView,视图中的,Menu,文件夹,双击,IDR_MAINFRAME,打开菜单编辑器。双击菜单栏右侧的虚线空白菜单项,弹出菜单项属性对话框,在,Caption,栏中输入“绘图,(&D)”,。其他采用系统默认值。,10,双击打开菜单编辑器,双击打开菜单项属性对话框,菜单项名称,,&,表示在字母,D,下加下划线,11,(3),为主菜单增加菜单项,右,击“绘图”菜单项下的虚线空白菜单项,在弹出的快捷菜单中选择,Properties,,打开菜单项属性设置对话框。在,ID,栏中输入,ID_RECTANGLE,,,Caption,栏中输入“矩形,(&R)tCtrl+R”,,,Prompt,栏中输入“在视图中绘制矩形,n,矩形”。用同样的方法添加“椭圆”子菜单项,它的,ID,、,Caption,和,Prompt,分别为,ID_ELLIPSE,、椭圆,(&L)tCtrl+L,、在视图中绘制椭圆,n,椭圆,并在“矩形”和“椭圆”两个菜单项之间添加一条分隔线。,12,“矩形”菜单的快捷键,此处仅起提示作用,要真正成为快捷键还需要使用快捷键编辑器进行设置,13,(4),为菜单项添加快捷键。,打开,ResourceView,视图中的,Accelerator,文件夹,双击,IDR_MAINFRAME,打开快捷键编辑器。双击编辑器底部的空白框,打开,Accel,Properties,对话框,在,ID,栏下拉列表中选择,ID_RECTANGLE,,在,Key,编辑框中输入,R,,右边单选按钮接受默认值,关闭对话框。用同样的方法为“椭圆”菜单项定义快捷键。如图所示,,14,15,(5),编译、链接并运行程序。,菜单项为灰色不可用,16,6.1.3,建立消息映射,在上例中仅添加了菜单,并没有实现菜单的功能,即没有对应的命令处理函数与菜单项对应,因此,添加的菜单项是,灰色,的,即,处于当前不可用状态,。,添加新的菜单项后,还应该为菜单项指定一个处理函数,即利用,ClassWizard,类向导添加一个消息处理函数。,17,【,例,6.2】,为例,6.1,中增加的菜单项添加消息处理函数。,(1),打,开例,6.1,中所创建的应用程序,MyDraw,。,(2),单击,【View|,ClassWizard,】,菜单项或按,Ctrl+W,键启动,ClassWizard,类向导,。,(3),为“矩形”及“椭圆”菜单项添加消息处理函,数。,在,ClassWizard,对话框的,Class name,栏下拉列表中选择,CMyDrawView,,在,Object IDs,栏中选择,ID_RECTANGLE,,在,Messages,栏选择,COMMAND,,单击,Add Function,按钮,接受系统默认函数名。单击,Edit Code,按钮,为消息处理函数添加如下代码,。,18,void,CMyDrawView:OnRectangle,(),/TODO:Add your command handler code here,CClientDC,dc(this,);,dc.Rectangle(10,10,200,100);/,绘制矩形,用同样的方法为“椭圆”菜单项添加消息处理函数,并编写如下代码。,void,CMyDrawView:OnEllipse,(),/TODO:Add your command handler code here,CClientDC,dc(this,);,dc.Ellipse(250,100,450,250);,19,(4),编译、链接并运行程序,分别选择“矩形”和“椭圆”菜单项,结果如图所示,。,20,6.1.4,快捷菜单,为应用程序创建快捷菜单主要有以下两种方法。,1.,使用,Component Gallery,创建快捷菜单,Component Gallery(,组件画廊,),是一个组件库,它保存着可以共享或重用的代码。这些代码包括由,Visual C+,自带的组件和从用户工程中增加到,Gallery,中去的用户自定义组件。,21,【,例,6.3】,为例,6.2,中,的应用程序,MyDraw,增加一个快捷菜单。程序运行后,用户在视图窗口中右击,弹出一个快捷菜单,显示主菜单“绘图”下的所有菜单项。,快捷菜单,22,(1)打开例,6,.,2,中的项目MyDraw。,(2)选择【Project|Add To,Project】菜单项,单击【Components,and,Controls】子菜单项,弹出Components,and Controls,Gallery对话框,如图所示,。,23,双击打开对话框中的Visual,C+,Components文件夹,如图所示,。,24,(3),选择对话框列表中的,Pop-up Menu,项,单击,Insert,按钮,在弹出的提示对话框中单击,OK,按钮,弹出,Pop-up Menu,对话框,如图所示,。,在,Pop-up Menu,对话框的,Add pop-up menu to,:下拉列表中选择,CMyDrawView,,即将创建的快捷菜单与视图类相关联。接受默认的菜单,ID,值。单击,OK,按钮,插入快捷菜单,。,25,(4),编辑快捷菜单,。,展开,ResourceView,视图中的,Menu,文件夹,双击新的菜单资源,CG_IDR_POPUP_MY_DRAW_VIEW,,打开菜单资源编辑器,删除菜单,POPUP,下的默认菜单项,。,26,27,打开,IDR_MAINFRAME,菜单资源,将主菜单“绘图”的所有下拉菜单项复制到剪贴板上。返回到新菜单资源编辑器,将复制的内容粘贴到新的快捷菜单上。这样快捷菜单就具有了与“绘图”主菜单完全相同的功能。,28,主菜单“绘图”的所有子菜单,29,(5),为快捷菜单连接一个类。,将鼠标移到新的快捷菜单上,右击选择,ClassWizard,菜单项,打开,ClassWizard,窗口,并弹出,Adding a Class,对话框,如下图所示。,选择,Select an existing class,项,单击,OK,按钮,在弹出的,Select Class,对话框类列表中选择,CMyDrawView,,单击,Select,按钮。,(6),编译、链接并运行程序。,30,2.,使用,TrackPopupMenu,(),函数创建快捷菜单,使用菜单资源编辑器和,CMenu:TrackPopupMenu,(),函数来创建右键快捷菜单。,CMenu:TrackPopupMenu,函数的原型为:,BOOL,TrackPopupMenu(UINT,nFlags,int,x,int,y,CWnd,*,pWnd,LPCRECT,lpRect,=NULL);,该函数的功能是显示一个右键快捷菜单。其中,,nflags,表示屏幕位置标志(见下表)。,x,、,y,分别表示菜单的水平坐标和顶端的垂直坐标;,pWnd,表示弹出菜单的窗口,包括全部的,WM_COMMAND,消息;,lpRect,表示一个矩形域,当单击这个矩形域时菜单不消失。,31,参数,nflags,的含义,32,【,例,6.4】,使用,TrackPopupMenu,(),函数创,建例,6.3,中的快捷菜单。,(1),打,开例,6.2,中,的项目,MyDraw,。,(2),选择,【,Insert|Resource,】,菜单项,向应用程序中添加一个新的菜单资源,并将新菜单的,ID,改为,IDR_POPUP,。,双,击,ResourceView,视图中,Menu,文件夹下的,IDR_MAINFRAME,,,打开标准菜单编辑器,单击,【,绘图,】,菜单项并复制。双击新菜单资源,IDR_POPUP,,打开快捷菜单编辑器,单击空白菜单项并粘贴,。,(3),用例,6.3,中,步骤,(5),的方法为快捷菜单连接类,CMyDrawView,。,33,(4),加载并显示快捷菜单,。,打开ClassWizard对话框,在Class,name栏和Object,IDs下拉列表中均选择CMyDrawView,在Messages中选择WM_CONTEXTMENU,单击Add,Function按钮,再单击Edit,Code,在打开的WM_CONTEXTMENU消息处理函数中添加如下代码,。,34,35,(5),编译、链接并运行程序,得到,与例,6.3,中,相同的效果。,36,6.2,工具栏,在,MFC,中,工具栏的功能由类,CToolBar,实现。工具栏资源和工具栏类,CToolBar,是工具栏的两个要素。创建工具栏的基本步骤是:,l,创建工具栏资源;,l,构建一个,CToolBar,对象;,l,调用,CToolBar:Create,(),或,CreateEx,(),函数创建工具栏窗口;,l,调用,CToolBar:LoadToolBar,载入工具栏资源。,37,6.2.1,编辑工具栏,使用工具栏编辑器来编辑工具栏资源。双击,ResourceView,视图中的,Toolbar,工具栏资源,即可打开工具栏编辑器。,38,1.,添加按钮,双击工具条上的空白按钮或单击空白按钮后,选择,【,View|Properties,】,菜单项,弹出如图所示的,Toolbar Button Properties,属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。,39,2.,删除按钮,将按钮拖出工具栏外,即可删除该按钮。,3.,编辑按钮位图,设置按钮位图有以下两种方法。,l,利用绘图工具与调色板直接进行绘制,l,先利用专用绘图软件制作,然后粘贴到按钮上,40,6.2.2,建立消息映射,通常,只需让一个按钮的,ID,值与同样功能菜单项的,ID,值相同即可。,如果按钮没有对应菜单项,则必须利用,ClassWizard,类向导添加一个消息处理函数。,41,【,例,6.5】,创建一个单文档的应用程序。为该应用程序添加二个按钮到工具条中,单击第一个按钮,在视图窗口中显示“打开文件”对话框;单击第二个按钮,视图窗口中会弹出一消息框,在其中显示自己的名字。,42,(1),使,用,MFC AppWizardexe,向导创建一个单文档应用程,序,Li6_5,,然后打,开工具栏资源编辑器。,(2),用,鼠,标单击工,具栏最后的空,白框,,用绘图工具及调色板制,作,【O】,按,钮。,双,击工具栏中刚绘制的新按钮,打开其属性设置对话框,,在,ID,栏中,选择,ID_FILE_OPEN,。,用,同样的方法定义一,个,【T】,按钮,,设置,其,ID,为,ID_TEXT,。,43,由于第一个新按钮与系统提供的,文件,|,打开,菜单项相对应,因此,不需要为它添加消息处理函数。,(3),为第二个,新按钮添加消息处理函,数。,打,开,ClassWizard,对话框,选择,Message Maps,选项卡,在,Class name,栏中选,择,CLi6_5View,,在,Object IDs,下拉列表中选,择,ID_TEXT,,,在,Messages,栏中选择,COMMAND,,单击,Add Function,按钮,再单击,Edit Code,,在函数中添加代码,。,44,void CLi6_5View:OnText(),CClientDC,dc(this,);,dc.TextOut(50,50,“,学生姓名,);,(5),编译、链接并运行程序。,45,6.3,状态栏,状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。,使用,AppWizard,创建的单文档应用程序,接受默认选项时,生成的应用程序自动创建带有默认窗格的状态栏。,46,6.3.1,状态栏类的继承关系,在,MFC,中,状态栏的功能由,CStatusBar,类实现。,47,6.3.2,状态栏类的成员函数,48,6.3.3,状态栏操作,利用,MFC AppWizard,向导创建应用程序时,首先在,CMainFrame,类中定义一个成员变量,m_wndStatusBar,,,它是状态栏类,CStatusBar,的对象。其次在,MFC,应用程序框架的实现文件,MainFrm.cpp,中,为状态栏定义一个静态数组,indicators,,,如下所示:,static UINT indicators=,ID_SEPARATOR,/,显示命令功能提示,ID_INDICATOR_CAPS,/,显示大写锁定键状态,ID_INDICATOR_NUM,/,显示数字锁定键状态,ID_INDICATOR_SCRL,/,显示滚动锁定键状态,;,49,这个全局的提示符数组,indicators,中的每个元素代表状态栏上一个窗格的,ID,值,这些,ID,在应用程序的串表资源,String Table,中进行了说明。,通过增加新的,ID,标识来增加用于显示状态信息的窗格。状态栏显示的内容由数组,indicators,决定,需要在状态栏中显示的各窗格的标识符、位置以及个数也由该数组决定,状态栏显示的内容是可以修改的。,50,最后,CWnd:Create,(),函数以主框架窗口为父窗口创建状态栏,创建后默认停靠在主框架窗口的底部。,CWnd:SetIndicators(indicators,sizeof(indicators)/sizeof(UINT,),函数将创建后的状态栏分隔为,sizeof(indicators)/sizeof(UINT,),个窗格,窗格的,ID,分别为,indicators,数组中的元素值。,51,一个应用程序只有一个状态栏,所以对状态栏的操作主要是对状态栏上窗格的操作。,为了把一个窗格添加到默认的状态栏中,一般要完成下列步骤:,l,为新建窗格创建一个命令,ID,和默认字符串;,l,将该窗格的命令,ID,添加到状态栏的静态数组,indicators,中;,l,为该窗格创建一个命令更新处理程序。,52,【,例,6.6】,编写一个单文档应用程,序,Li6_6,。,程序运行后,在状态栏中显示系统时间。,(1),启动,Visual C+,,使用,MFC,AppWizardexe,向导创建一个单文档应用程序,Li6_6,。,(2),选择项目工作区的,FileView,视图,打开,MainFrm.cpp,文件。在状态栏的静态数组,indicators,的第一项后面添加,ID_INDICATOR_CLOCK,,为状态增加一个窗格,用来显示系统时间。,(3),选择项目工作区的,ResourceView,视图,打开串表编辑器。双击串表编辑器中的空白框,在弹出的字符串属性设置对话框的,ID,栏中输入,ID_INDICATOR_CLOCK,,在,Caption,栏中输入,00:00:00,,定义窗格中数据输出格式及长度。,53,(4),在,CMainFrame,类的,OnCreate,(),函数中添加如下代码。,int,CMainFrame:OnCreate(LPCREATESTRUCT,lpCreateStruct,),SetTimer(1,1000,NULL);,return 0;,函数,CWnd:SetTimer,(),用来安装一个计时器,它的第一个参数指定计时,ID,为,1,,第二个参数指定计时器的时间间隔为,1000,毫秒。这样,每隔,1,秒,OnTimer,(),函数就会被调用一次。,54,(5)利用ClassWizard类向导给CMainFrame类添加WM_TIMER和WM_CLOSER消息处理函数OnTimer()和OnClose(),并添加代码。,void,CMainFrame:OnTimer(UINT,nIDEvent,),/TODO:Add your message handler code here and/or call default,CTime,time;,time=,CTime:GetCurrentTime();/获得系统时间,/,将系统时间转换成时:分:秒格式的字符串,CString,s=,time.Format(%H:%M:%S,);,/,更新时间窗格显示的时间内容,m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex,(,ID_INDICATOR_CLOCK),s,);,CFrameWnd:OnTimer(nIDEvent,);,55,void,CMainFrame:OnClose,(),/TODO:Add your message handler code here and/or call default,KillTimer(1);/关闭计时器,CFrameWnd:OnClose,();,(6),编译、链接并运行程序。结果如图所示,。,56,57,
展开阅读全文