菜单栏工具栏状态栏_第1页
菜单栏工具栏状态栏_第2页
菜单栏工具栏状态栏_第3页
菜单栏工具栏状态栏_第4页
菜单栏工具栏状态栏_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第十八讲工具栏和状态栏教学提纲一、教学内容:工具栏和状态栏编程二、学时:两课时三、教学目的和要求掌握工具栏的创建方法和步骤,如何将工具栏的功能与菜单的功能相对应掌握创建状态栏的方法和步骤四、教学重点和难点重点:工具栏编程难点:状态栏编程五.教学过程提要工具栏编程状态栏编程本单小结内容提要§6.2工具栏§6.3状态栏§6.2工具栏

工具栏是一系列工具按钮的组合,也是一种常用的命令输入方式。可以说,工具栏是菜单的一种快捷方式。6.2.1创建工具栏的方法和步骤创建工具栏资源在这里,我们将对上一节的例子进行扩充,增加一个工具栏。当用鼠标选择工具栏上的某个按钮时,显示出【个人资料】对话框。具体步骤如下:步骤一:打开上一节创建的Dialog例子。步骤二:在工作区窗口中选择【ResourceView】选项卡,展开【DialogResources】文件夹,由于我们在用AppWizard生成应用程序时,没有选择生成工具栏,因此在【DialogResources】文件夹中,找不到Toolbar文件夹。6.2工具栏步骤三:选择【Insert】菜单中的【Resource】菜单项,在弹出菜单中选择【Insert】菜单项。系统将弹出【InsertResource】对话框,在对话框中选择【Toolbar】,单击【New】按钮。步骤四:系统将自动在【DialogResounrces】文件夹中添加一个【Toolbar】文件夹,同时在【Toolbar】文件夹中添加了一个名为IDR_TOOLBAR1的文件。屏幕上同时显示工具栏设计窗口。步骤四:鼠标右键单击【ResourceView】中【Toolbar】文件夹中的IDR_TOOLBAR1项目。在弹出菜单中选择【Properties】菜单项,系统将弹出工具栏属性对话框。在属性对话框中的【ID】框中,我们把ID号修改为IDR_MYTOOLBAR。步骤五:添加按钮和制作按钮图标。我们可以利用【Graphic】和【Color】工具栏上提供的设计工具,根据自己需要制作按钮图标。我们用字母R作为按钮的图标。工具栏按钮的绘制是一个个分开进行的,在画完一个按钮后,该按钮的实际效果立刻显示出来。

在【ToolbarButtonProperties】工具栏按钮属性对话框中,各项的含义如表6.5所示。项目含义IDWidthHeightPrompt用于输入或从下拉列表中选择工具栏按钮的ID号用于输入工具栏按钮的宽度,单位是像素用于输入工具栏按钮的高度,单位是像素工具栏按钮文本

注:要使选择工具栏按钮的功能与选择菜单的功能一致时,应将工具栏按钮属性对象框中的ID号设置为与某一菜单项的ID号相同。

值得一提的是,在创建工具栏按钮的过程中,可以进行有关的操作及方法:(1)创建新的工具栏按钮在新建一个工具栏的过程中,在工具栏的右端会有一个空按钮,用鼠标单击该按钮,则该按钮的周围有虚的方框包围,同时在编辑区内显示出该按钮,用户可以在其中绘制图形。(2)移动工具栏中的按钮在编辑工具栏的过程中,可以根据用户的需要移动工具栏中的按钮,将某个按钮放置到所需要的位置上。(3)复制工具栏中的按钮在工具栏编辑窗口内,选择待移动的工具栏按钮,在按下Ctrl键的同时,将其拖动到所需要的位置。(4)删除工具栏中的按钮方法是用鼠标拖动该按钮到工具栏以外的位置。(5)在工具栏中的按钮间插入空格可以根据需要在某个按钮的左边、右边或两边插入一个空格分隔符,方法是:①如果某按钮左边没有任何空格,拖动该按钮向右移动并当按钮的右边界接触到右边按钮时,释放鼠标键,则可以此按钮的左边插入一个空格,反之,亦然。②如果某按钮的左边已有空格而右边没有空格,拖动该按钮向左移动并当按钮的左边界接触到左边按钮时,释放鼠标键,则可在此按钮右边插入一个空格。③如果某按钮的左右两边都有空格,拖动该按钮向右移动并接触到相邻按钮时,则此按钮左边的空格保留,按钮右边的空格消失。反之亦然。实现工具栏

编码实现工具栏。具体实现步骤如下:步骤一:在工作区中窗口中选中【ClassView】选项卡,用鼠标右键单击【CmainFrame】,在弹出的菜单中选择【AddMemberVariable】菜单项,系统将弹出【AddMemberVariable】对话框。步骤二:在【VariableType】栏中输入类型名称CToolBar,在【VariableName】栏中输入变量名称m_MyDataToolBar。单击【OK】按钮继续。此时,VisualC++将自动在主框架中的类定义文件MainFrm.h中添加以下声名:CToolBarm_MyDataToolBar;步骤三:选择【View】菜单中的【ClassWizard】菜单项,或者直接按Ctrl+R键,弹出【MFCClassWizard】对话框。在【Classname】列表框选择CmainFrame类;在【ObjectIds】列表框中选中CMainFrame;双击【Messages】列表栏中的WM_CREATE选项,或者选中WM_CREATE,再单击【AddFunction】按钮。在【MemberFunction】栏中将会出现OnCreate()函数。步骤四:单击【EditCode】按钮,ClassWizard将自动在框架类的实现文件MainFrm.cpp中添加成员函数OnCreate()。在函数中加入显示工具栏的代码。具体代码如下,其中粗体部分为新添加的代码。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;}return0;}步骤五:编译并运行该程序。当单击工具栏上的新建按钮,窗口中将弹出【个人资料】对话框。此按钮的作用和选择【显示】菜单中的【个人资料】菜单项的效果是一样的。说明:(1)在上例创建工具栏的过程中,曾用到了CToolBar类的对象,CToolBar类是由CControlBar类派生而来的,它用于描述工具栏。其中,Create函数是其成员函数,该函数的原型为:BOOLCreate(Cwnd*pParentWnd,DWORDwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UNITnID=AFX_IDW_TOOLBAR);其中:参数pParentWnd是指向父窗口的指针,dwStyle是工具栏的风格,nID是子窗口的ID号。取值风格CBRS_TOPCBRS_BOTTOMCBRS_NOALIGNCBRS_TOOLTIPSCBRS_SIZE_DYNAMICCBRS_SIZE_FIXEDCBRS_FLOATINGCBRS_FLYBYCBRS_HIDE_INPLACE在框架窗口的顶部在框架窗口的底部不随父窗口改变尺寸显示按钮提示尺寸可改变控件条固定浮动状态状态栏中显示按钮的信息不显示工具栏表6.6工具栏的部分风格(2)TRACE宏

TRACE宏提供了类似与printf函数的输出格式,用于将某一信息(即字符串)输出到Dump的设备环境DC中。该宏只在调试状态下工作。TRACE宏的限制是一次最多输出512个字符。如:inti=1;charsz[]="one";TRACE("Integer=%d,String=%s\n",i,sz);此外,还有TRACE0~TRACE3这样4个独立的宏,分别用于输出纯字符串~字符串+3个参数。它们的原型分别为:TRACE0(exp)TRACE1(exp,param1)TRACE2(exp,param1,param2)TRACE3(exp,param1,param2,param3)如:TRACE0("StartDumpofMyClassmembers:");inti=1;TRACE1("Integer=%d\n",i);//Output:'Integer=1'intj=1;charsz[]="one";TRACE2("Integer=%d,String=%s\n",j,sz);//Output:'Integer=1,String=one'6.2.2实现工具栏的船坞化所谓船坞化工具栏就是可以将工具栏拖动到屏幕的任意位置上,还可以用鼠标改变工具栏的大小。下面我们就来实现工具栏的船坞化。首先要通过调用CControlBar的成员函数EnableDocking()使工具栏能够船坞化;然后通过调用CFrameWnd类的成员函数EnableDocking()确保边框窗口能够船坞化;最后调用CFrameWnd的成员函数DockControlBar()使工具栏固定在边框窗口上。

所有这些工作都在边框窗口类的成员函数OnCreate()中完成。这三个函数的原型为:voidCControlBar::EnableDocking(DWORDdwStyle);voidCFrameWnd::EnableDocking(DWORDdwDockStyle);voidCFrameWnd::DockControlBar(CControlBar*pBar,UINTnDockBarID=0,LPCRECTlpRect=NULL);

其中:参数dwStyle和dwDockStyle表示工具栏的风格,其取值见表6.6,pBar是指向待船坞化的工具栏的指针。

具体代码如下,其中粗体部分为新添加的代码。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;} m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_MyDataToolBar);return0;}

编译并运行该应用程序,将看到工具栏已经船坞化了。可以用鼠标将它拖动到窗口的任意位置。与工具栏相关的MFC类MFC的两个类CToolBar和CToolBarCtrl都是用来为工具条提供操作支,CToolBar继承了类CControlBar,CToolBarCtrl直接继承CWnd,CToolBarCtrl能提供更复杂的功能。§6.3状态栏

状态栏位于应用程序框架窗口的底部,它可以分割成几个窗格,一般用于显示一些文本信息,比如:工具栏按钮的提示信息、CapsLock键及NumLock键的状态等等。1、创建状态栏资源下面,我们在前例的基础上,为应用程序Dialog添加一个状态栏,用来显示一个消息区、一个字符串和NumLock键的状态。其具体步骤如下:步骤一:打开资源符号对话框。步骤二:在对话框中单击【New】按钮,弹出【NewSymbol】对话框,在【Name】栏中填入ID_STATUSBAR_STR,在【Value】栏中的数字是系统为用户提供的ID数值。单击【OK】按钮继续。6.3状态栏步骤三:新添加的ID信息将会出现在【ResourceSymbols】对话框的列表中。单击【Close】按钮关闭【ResourceSymbols】对话框。此时完成创建ID的工作。步骤四:在工作区窗口中选择【ResourceView】选项卡,双击【StringTable】文件夹中的【StringTable】选项,窗口中将显示出串表编辑器。在编辑器中单击鼠标右键,在弹出的菜单中选择【NewString】菜单项。步骤五:系统弹出【StringProperties】对话框,在【ID】框中选择ID_STATUSBAR_STR项,在【Caption】框中输入字符串“测试状态栏!”,按【Enter】键确认。2、实现状态栏实现状态栏的具体步骤如下:步骤一:在工作区窗口中选择【ClassView】选项卡,用鼠标右键单击【CMainFrame】选项,在弹出菜单中选择【AddMemberVariable】菜单项。弹出【AddMemberVariable】对话框,在【VariableType】栏中输入类型名称CStatusBar,在【VariableName】栏中输入类型名称为m_MyStatusBar。单击【OK】按钮继续。此时,VisualC++将自动在主框架的类定义文件MainFrm.h中添加以下声明:CStatusBarm_MyStatusBar;步骤二:在MainFrm.cpp文件中加入数组indicators的定义,具体代码如下,其中粗体部分为新增加的代码。//CMainFrameIMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CONTEXTMENU()ON_WM_CREATE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()staticUINTindicators[]={ID_SEPARATOR, //状态行指示器

ID_STATUSBAR_STR,ID_INDICATOR_NUM,};步骤三:在文件MainFrm.app中对函数OnCreate()进行修改,增加状态栏的创建代码。具体代码如下,其中粗体部分为新增加的代码。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n"); return-1; } m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_MyDataToolBar);if(!m_MyStatusBar.Create(this)||!m_MyStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){TRACE0("Failedtocreatedstatusbar\n");return-1;//failtocreate}return0;}步骤四:编译并运行此应用程序,将会看到在原来程序的基础之上,在窗口的最下端增加了一个状态栏。说明:(1)在上例创建状态栏的过程中,曾用到了CStatusBar类的对象,CStatusBar是VisualC++的MFC类库中的一个类,它用于描述状态栏,CStatusBar类是由CControlBar类派生而来的。其中,Create函数是其成员函数,该函数的原型为:

BOOLCreate(CWnd*pParentWnd, DWORDdwStyle=WS_CHILD|WS_VISIBLE |CBRS_BOTTOM, UINTnID=AFX_IDW_STATUS_BAR);其中:pParentWnd是指向状态栏父窗口的指针,dwStyle是状态栏的风格,nID是子窗口的ID号,表6.7中列出了决定状态栏风格的几种常用的取值及对应的风格。

表6.7dwStyle的取值及对应的状态栏的风格(2)在MainFrm.cpp文件中加入的数组indicators的定义:staticUINTindicators[],用于描述状态栏中所包含的内容。如果在利用AppWizard向导创建SDI或MDI应用程序框架中的第4步中,选择了“Initialstatusbar”时,则向导会自动在MainFrm.cpp文件中加入数组indicators的定义。向导生成的缺省的indicator数组包含了四个元素,它们是ID_SEPARATOR、ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL。取值风格CBRS_TOPCBRS_BOTTOMCBRS_NOALIGN在框架窗口的顶部在框架窗口的底部当父窗口改变尺寸以后不随之变动(3)要在状态栏的窗格中显示文本信息,可以采用以下三种方法:①调用CWnd::SetWindowText函数更新信息行窗格中的文本。由于状态栏也是一种窗口,所以在程序中可以直接调用该函数。如:若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowText(“新修改的信息”)语句将在信息行窗格中显示“新修改的信息”。②手动处理状态栏的MAND_UI更新信息,并在处理函数中调用CCmdUI::SetText函数,该函数的原型为:virtualvoidSetText(LPCTSTRlpszText);其中:参数lpszText是一个指向字符串的指针。③调用函数CStatusBar::SetPaneText与CStatusBar::GetPaneText可以设置或获得任何窗格(包括信息行窗格)中的文本。此函数的原型为:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);CStringGetPaneText(intnIndex)const;其中,参数nIndex是待设置的窗格位置索引号(第1个窗格的位置索引为0),lpszNewText表示要显示的字符串,若参数bUpdate的值为TRUE,系统自动更新显示的结果。(4)调用CStatusBar::CommandToIndex可以获得指定资源ID号所在窗格的位置索引号,该函数的原型为:intCommandToIndex(UINTnIDFind)const;其中:参数nIDFind是状态栏中某一资源ID号。(5)调用函数CStatusBar::SetPaneInfo与CStatusBar::GetPaneInfo可设置或获得窗格的长度、风格等信息,它们的函数原型为:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);voidGetPaneInfo(intnIndex,UINT&nID,UINT&nStyle,int&cxWidth)const;其中:参数nIndex表示要设置的状态栏窗格的索引号,nID用来为状态栏窗格指定新的资源ID号,cxWidth表示窗格的像素宽度,nStyle表示状态栏窗格的风格类型,用来指定窗格的外观,如:SBPS_POPOUT表示窗格是凸起来的。具体见表6.8。风格取值风格SBPS_NOBORDERSSBPS_POPOUTSBPS_DISABLEDSBPS_STRETCH

SBPS_NOMAL窗格四周没有3D边框反显边框使文字凸起显示禁用窗格,不显示文本拉伸窗格,交填充窗格不用的空白空间。但状态栏中只能有一个窗格具有这种风格普通窗格,没有“拉伸”、“3D边框”、“文字凸起显示”等效果表6.8状态栏中各窗格的风格取值及对应风格(6)调用CStatusBar::SetPaneStyle与CStatusBar::GetPaneStyle可分别用来设置或获得状态栏窗格的风格,二者的原型如下:UINTGetPaneStyle(intnIndex)const;voidSetPaneStyle(intnIndex,UINTnStyle);其中:参数nIndex是状态栏中某一窗格的位置索引号,nStyle为状态栏中窗格的风格。3、进一步完善状态栏现在,我们在刚才添加状态栏例子的基础上进行修改。当用户选择“关于”菜单项时,弹出“字体对话框”,当单击“确定”按钮关闭此对话框后,在状态栏上原来显示文本测试状态栏的空格中显示“您已经查看过字体对话框!”,按照下面的方法进行操作。步骤一:选择【View】菜单中的【ClassWizard】菜单项。弹出【MFCClassWizard】对话框,在【Classname】列表中选择类CMainFrame,在【ObjectIDs】列表中选择ID_APP_ABOUT;右边的【Messages】栏中将出现COMMAND和MAND_UI,双击COMMAND选项。将弹出AddMemberFunction对话框。步骤二:接受系统缺省的函数名称OnAppAbout,单击【OK】按钮,返回MFCClassWizard对话框。这时在MFCClassWizard对话框中的【Memberfunctions】框中增加了一个函数OnAppAbout。步骤三:单击【EditCode】按钮,在代码编辑窗口中打开OnAppAbout函数。在编辑此函数之前,首先要在MainFrm.cpp文件中添加一个#include语句。具体代码如下,其中粗体部分为新增加的代码。//MainFrm.cpp:implementationoftheCMainFrameclass//#include"stdafx.h"#include"Dialog.h"#include"MainFrm.h"#include"MydataDialog.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif步骤四:在代码编辑窗口中,编辑函数OnAppAbout()。具体代码如下,其中粗体部分为新增加的代码。voidCMainFrame::OnAppAbout(){//TODO:AddyourcommandhandlercodehereCMydataDialogdlg;if(dlg.DoModal()==IDOK){CClientDCdc(this);SIZEsize=dc.GetTextExtent("您已经查看过个人资料对话框!");intmandToIndex(ID_STATUSBAR_STR);m_MyStatusBar.SetPaneInfo(index,ID_STATUSBAR_STR,SBPS_POPOUT,size.cx);说明:在此函数中,首先生成了一个字体对话框的实例,并且显示为有模式对话框。当用户单击【确定】按钮退出此对话框时,要改变状态栏的字符串显示。首先调用函数GetTextExtent()来获得字符串的长度,然后调用CommandToIndex()函数获得窗格的索引,再通过调用函数SetPaneInfo()来设置窗格的长度、风格等信息。在此例中,我们使用了风格SBPS_POPOUT,它使创建的窗格看起来是从状态栏中凸出来的。最后调用函数SetPaneText()来显示文本内容。步骤五:编译并运行此应用程序。m_MyStatusBar.SetPaneText(index,_T("您已经查看过个人资料对话框!"),TRUE);}}在应用程序中,要实现菜单的功能,其步骤和方法是先利用菜单编辑器建立菜单资源,然后编写菜单命令的MAND消息映射函数及相应代码。在MFC框架中,菜单命令消息是按照一定的顺序进行传递的。

温馨提示

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

评论

0/150

提交评论