《菜单 工具栏和状态栏.pptx》由会员分享,可在线阅读,更多相关《菜单 工具栏和状态栏.pptx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、5.1 菜单图5.1是一个菜单样例,注意它们的规则含义。需要说明的是,在常见的菜单系统中,最上面的一层水平排列的菜单称为“顶层菜单”,每一个顶层菜单项可以是一个简单的菜单命令,也可以是下拉(Popup)菜单,在下拉菜单中的每一个菜单项也可是菜单命令或下拉菜单,这样一级一级下去可以构造出复杂的菜单系统。顶层菜单弹出菜单图5.1 菜单样例第1页/共50页用编辑器设计菜单1.编辑菜单在顶层菜单的最后一项,Visual C+为用户留出了一个空位置,用来输入新的顶层菜单项。在菜单的空位置上双击鼠标左键,出现菜单项的属性对话框,在标题框中输入“测试(&T)”,结果如图5.2所示,其中符号&用来将其后面的字
2、符作为该菜单项的助记符,这样当按住“Alt”键不放,再敲击该助记符键时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键,对应的菜单项也会被选中。子菜单的空位置保存可见按钮顶层菜单的空位置图5.2 Ex_SDI菜单资源第2页/共50页用编辑器设计菜单1.编辑菜单单击“测试”菜单项下方的空位置,在菜单项属性对话框中,输入标题“切换菜单(&D)”,在ID框输入该菜单项的资源标识符:ID_TEST_CHANGE,结果如图5.3所示。图5.3 修改菜单项属性关闭菜单项属性对话框,将新添加的菜单项拖放到“查看”和“帮助”菜单项之间,结果如图5.4所示。需要说明的是,菜单项位置改变后,其属性并
3、没改变。图5.4 菜单项“测试”拖放后的位置第3页/共50页用编辑器设计菜单2.菜单命令的消息映射(1)选择“查看”“建立类向导”菜单命令或按Ctrl+W快捷键,则出现MFC ClassWizard对话框,并自动切换到Message Maps页面。从“Class name”列表中选择CMainFrame,在IDs列表中选择ID_TEST_CHANGE,然后在Messages框中选择COMMAND消息。如图5.5所示。图5.5 菜单命令消息的映射第4页/共50页2.菜单命令的消息映射(2)单击Add Function按钮或双击COMMAND消息,出现“Add Member Function”对话
4、框以输入成员函数的名称。系统默认的函数名为OnTestChange,如图5.6所示。该函数是对菜单项ID_TEST_CHANGE的映射,也就是说,当应用程序运行后,用户选择“测试”“对话框”菜单时,该函数OnTestDlg被调用,执行函数中的代码。(3)单击OK按钮,在ClassWizard的“Member functions”列表中将列出新增加的成员函数。选择此函数,单击Edit Code按钮(或直接在函数名双击鼠标),在此成员函数中添加下列代码:void CMainFrame:OnTestChange()/TODO:Add your command handler code hereAfx
5、MessageBox(现在就切换吗?);图5.6 添加映射函数第5页/共50页2.菜单命令的消息映射(4)编译并运行。在应用程序的顶层菜单上,单击“测试”菜单项,然后将鼠标移动到弹出的子菜单项“切换菜单”上,则结果如图5.7所示,此时状态栏上显示该菜单项的提示信息,该信息就是在前图5.3的菜单项属性对话框“提示”框中设置的内容。单击“切换菜单”,则弹出一个消息对话框,显示内容“现在就切换吗?”。图5.7 Ex_SDI运行后的菜单第6页/共50页使用键盘快捷键(1)展开项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,出现如图5.8的加速键资源列表。图5.8 Ex_
6、SDI的加速键资源 下端的空行第7页/共50页使用键盘快捷键(2)建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图5.9所示的“Accel Properties”(加速键属性)对话框,其中可设置的属性如表5.2所示图5.9 加速键属性对话框 表5.2 加速键General属性对话框的各项含义第8页/共50页使用键盘快捷键(3)在加速键属性对话框中,先选择在Ex_SDI应用程序菜单资源添加的“切换菜单”菜单项ID_TEST_CHANGE作为要联用的加速键的ID标识符,然后单击下一键按钮,并按下Ctrl+1作为此加速键的键值。需要说明的是,为了使其他用户能查看并使用该加速键,还需在
7、相应的菜单项文本后面添加加速键内容。例如,可将ID_TEST_CHANGE菜单项的标题改成“切换菜单(&C)tCtrl+1”,其中“t”是将后面的“Ctrl+1”定位到一个水平制表位。(4)编译运行并测试。当程序运行后,按Ctrl+1键将执行相应的菜单命令。第9页/共50页菜单的编程控制1.创建菜单CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下:BOOL CreateMenu();/产生一个空菜单BOOL CreatePopupMenu();/产生一个空的弹出式子菜单2.装入菜单将菜单从资源装入应用程序中,需调用CMenu成员
8、函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。BOOL LoadMenu(LPCTSTR lpszResourceName);BOOL LoadMenu(UINT nIDResource);其中,lpszResourceName为菜单资源名称,nIDResource为菜单资源ID标识符。第10页/共50页菜单的编程控制3.添加菜单项当菜单创建后,用户可以调用AppendMenu或InsertMenu函数来添加一些菜单项。但每次添加时,AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。BOOL
9、AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);其中,
10、nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表5.3所示。第11页/共50页表5.3 nFlags的值及其对其他参数的影响第12页/共50页菜单的编程控制4.删除菜单项调用DeleteMenu函数可将指定的菜单项删除,函数DeleteMenu的原型如下:BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中,参数nPosition表示要删除的菜单项位置,它由n
11、Flags进行说明。若当nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID标识符,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。5.获取菜单项下面的3个CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式子菜单的句柄。UINT GetMenuItemCount()const;该函数用来获得菜单的菜单项数,调用失败后返回-1。UINT GetMenuItemID(int nPos)const;该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR(分
12、隔符),则返回-1。CMenu*GetSubMenu(int nPos)const;该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。第13页/共50页菜单的编程控制 例Ex_Menu 用程序添加并处理一个菜单项(1)创建一个默认的单文档应用程序Ex_Menu。(2)选择“查看”菜单“Resource Symbols”命令,弹出如图5.10所示的“资源符号”对话框,它能对应用程序中的资源标识符进行管理。由于程序中要添加的菜单项需要一个标识值,最好用一个标识符来代替这个值,这是一个好的习惯。因此这里通过“资源
13、符号”对话框来创建一个新的标识符。图5.10“资源符号”对话框第14页/共50页 例Ex_Menu(3)单击新建按钮,弹出如图5.11所示的“New Symbol”(新标识符)对话框。在名字(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在值(Value)框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。保留默认的ID值101,单击确定按钮。图5.11 新标识符对话框第15页/共50页例Ex_Menu(4)关闭“资源符号”对话框,在CMainFrame:OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。
14、int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct).CMenu*pSysMenu=GetMenu();/获得程序菜单指针CMenu*pSubMenu=pSysMenu-GetSubMenu(1);/获得第二个子菜单的指针CString StrMenuItem(新的菜单项);pSubMenu-AppendMenu(MF_SEPARATOR);/增加一水平分隔线pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/在子菜单中增加一菜单项m_bAutoMenuEnable=FA
15、LSE;/关闭系统自动更新菜单状态pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/激活菜单项DrawMenuBar();/更新菜单return 0;第16页/共50页例Ex_Menu(5)此时编译运行后,结果如图5.12所示。但此时选择“新的菜单项”命令不会有反应。图5.12 程序添加的菜单项第17页/共50页例Ex_Menu(6)用MFC ClassWizard在CMainFrame添加OnCommand消息函数的重载,并添加下列代码:BOOL CMainFrame:OnCommand(WPARAM wPar
16、am,LPARAM lParam)/wParam的低字节表示菜单、控件、加速键的命令ID if(LOWORD(wParam)=ID_NEW_MENUITEM)MessageBox(你选中了新的菜单项);return CFrameWnd:OnCommand(wParam,lParam);(7)编译运行并测试。这时当选择菜单“编辑”“新的菜单项”命令后,就会弹一个对话框,显示“你选中了新的菜单项”消息。第18页/共50页使用快捷菜单快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面设计风格。当用户按下鼠标右键时,就会相应地弹出一个浮动菜单,其中提供了几个与当前选择内容相关的选项。用资源编辑器和M
17、FC库的CMenu:TrackPopupMenu函数可以很容易地创建这样的菜单,CMenu:TrackPopupMenu函数原型如下:BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT lpRect=NULL);该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志,如表5.4所示。表5.4 nFlags的值及其对其他参数的影响第19页/共50页使用快捷菜单例Ex_ContextMenu 使用快捷菜单(1)创建一个默认的单文档应用程序Ex_ContextMenu。
18、用MFC ClassWizard在CEx_ContextMenuView类添加WM_CONTEXTMENU消息映射,并在映射函数中添加下列代码:void CEx_ContextMenuView:OnContextMenu(CWnd*pWnd,CPoint point)CMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得主窗口指针CMenu*pSysMenu=pFrame-GetMenu();/获得程序窗口菜单指针int nCount=pSysMenu-GetMenuItemCount();/获得顶层菜单个数int nSubMenuP
19、os=-1;for(int i=0;iGetMenuString(i,str,MF_BYPOSITION);if(str.Left(4)=文件)nSubMenuPos=i;break;if(nSubMenuPosGetSubMenu(nSubMenuPos)-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);第20页/共50页例Ex_ContextMenu(3)在Ex_ContextMenuView.cpp文件的前面添加CMainFrame类的文件包含:#include Ex_ContextMenuView.h
20、#include MainFrm.h(4)运行并测试。当用户在应用程序窗口的客户区中右击鼠标,会弹出如图5.13的快捷菜单。图5.13 快捷菜单 客户区第21页/共50页5.2 工具栏使用工具栏编辑器选择菜单“文件”“打开工作区”,将前面的单文档应用程序Ex_SDI调入或重新创建。在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME,则工具栏编辑器出现在主界面的右边,如图5.14所示。图5.14 工具栏编辑器窗口空按钮图形工具箱颜色工具箱第22页/共50页使用工具栏编辑器下面就工具栏按钮的一般操作进行说明。(1)创建一个新的工具栏按钮。(2
21、)移动一个按钮。(3)删除一个按钮。(4)在工具栏中插入空格。在工具栏中插入空格有以下几种情况:如果按扭前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。第23页/共50页使用工具栏编辑器工具栏按钮的一般操作进行说明(5)工具栏按钮属性的设
22、置。双击某按钮弹出其属性对话框,如图5.15所示。属性对话框中的各项说明见表5.5。图5.15 工具栏按钮属性对话框表5.5 工具栏按钮属性对话框的各项含义第24页/共50页使用工具栏编辑器工具栏按钮的一般操作进行说明(6)工具栏和菜单相结合。工具栏和菜单相结合是指当选择工具按钮或菜单命令时,操作结果是一样的。使它们结合的具体方法是在工具按钮的属性对话框中将按钮的ID标识符设置为相关联的菜单项ID。需要说明的是,对于单独工具按钮命令消息的映射方法跟菜单命令是一样的。第25页/共50页多个工具栏的使用例Ex_SDI 使用多个工具栏1)添加并更改应用程序菜单(1)创建一个默认的单文档应用程序Ex_
23、SDI。(2)按快捷键Ctrl+R,弹出“插入资源”对话框,在资源类型中选定“Menu”,如图5.16。图5.16 “插入资源”对话框第26页/共50页例Ex_SDI1)添加并更改应用程序菜单(3)单击新建按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1,以后依次为IDR_MENU2、IDR_MENU3、.),同时自动打开这个新的菜单资源,如图5.17所示。菜单空位置 菜单默认ID图5.17 添加菜单资源后的开发环境第27页/共50页例Ex_SDI1)添加并更改应用程序菜单(4)在Menu资源的ID_MENU1上右击鼠标,从弹出的快捷菜
24、单中选择“Properties”命令,出现如图5.18所示的菜单属性对话框,在这里可以重新指定菜单资源ID,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为_DEBUG,则菜单资源只存在于Debug编译环境中。图5.18 菜单属性对话框第28页/共50页例Ex_SDI1)添加并更改应用程序菜单(5)为菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,如图5.19所示。需要再次强调的是,符号&用来指定后面的字符是一个助记符。(6)打开Ex_SDI程序菜单资源IDR_M
25、AINFRAME,在“查看”菜单的最后添加一个子菜单项“显示测试菜单(&M)”,ID设为ID_VIEW_TEST。图5.19 设计新的菜单资源第29页/共50页例Ex_SDI1)添加并更改应用程序菜单(7)为CMainFrame类添加一个CMenu类型的成员变量m_NewMenu。如下面的代码:class CMainFrame:public CFrameWnd /Attributespublic:CMenu m_NewMenu;(8)按快捷键Ctrl+W打开MFC ClassWizard对话框,切换到Message Maps页面,从“Class name”列表中选择CMainFrame,分别为
26、菜单项ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默认的消息映射函数名,并添中下列代码:第30页/共50页例Ex_SDI(8)添中下列代码:void CMainFrame:OnViewTest()m_NewMenu.Detach();/使菜单对象和菜单句柄分离m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);/清除应用程序菜单SetMenu(&m_NewMenu);/设置应用程序菜单void CMainFrame:OnTestReturn()m_NewMenu.Detach();m_NewMenu.LoadMenu
27、(IDR_MAINFRAME);SetMenu(NULL);SetMenu(&m_NewMenu);代码中,LoadMenu和Detach都是CMenu类成员函数,LoadMenu用来装载菜单资源,而Detach是使菜单对象与菜单句柄分离。在调用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创建,因而会发生运行时错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。(9)第一次编译运行并测试。第31页/共50页例Ex_SDI2.添加并设计工具栏按钮(1)
28、在项目工作区的ResourceView页面中,展开Toolbar(工具栏)资源,双击双击“Toolbar”项中的IDR_MAINFRAME,显示工具栏编辑器。(2)利用工具栏编辑器设计两个工具按钮,其位置和内容如图5.20所示。(3)双击刚才设计的第一个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_TEST_RETURN,在提示框内键入“返回应用程序主菜单n返回主菜单”。图5.20 设计的两个工具栏按钮第32页/共50页例Ex_SDI2.添加并设计工具栏按钮(4)双击刚才设计的第二个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_VEW_TEST,在提
29、示框内键入“显示测试菜单n显示测试菜单”。(5)第二次编译运行并测试。当程序运行后,将鼠标移至刚才设计的第一个工具按钮处,这时在状态栏上显示出“返回应用程序主菜单”信息,若稍等片刻后,还会弹出提示小窗口,显示出“返回主菜单”字样,如图5.21所示。单击新添加的这两个按钮,会执行相应的菜单命令。图5.21 工具按钮提示第33页/共50页例Ex_SDI3.添加工具栏(1)在项目工作区切的ResourceView页面中,展开Toolbar(工具栏)资源,用鼠标单击IDR_MAINFRAME不松开,然后按下Ctrl键,移动鼠标将IDR_MAINFRAME拖到Toolbar资源名称上,这样就复制了工具栏
30、默认资源IDR_MAINFRAME,复制后的资源标识系统自动设为IDR_MAINFRAME1。(2)右击工具栏资源IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,如图5.22所示,将ID设为IDR_TOOLBAR1。(3)双击IDR_TOOLBAR1,打开工具栏资源,按图5.23删除不要的工具按钮。图5.22 工具栏属性对话框图5.23 删除不要的工具按钮(4)在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar。CToolBar类封装了工具栏的操作。第34页/共50页例Ex_SDI3.添加工具栏(5)在CMainFram
31、e:OnCreate函数中添加下面的工具栏创建代码:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;int nRes=m_wndTestBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR+10);i
32、f(!nRes|!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)TRACE0(Failed to create toolbarn);return-1;/fail to create m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);DockControlBar(&m_wndTestBar);return 0;第35页/共50页
33、例Ex_SDI4.完善程序代码(1)事实上这不是本例要的结果。还需调用CFrameWnd类的成员函数ShowControlBar来使程序一开始运行时隐藏工具栏IDR_TOOLBAR1。(2)在CMainFrame:OnCreate函数中添加下列代码:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)ShowControlBar(&m_wndTestBar,FALSE,FALSE);/关闭测试工具栏return 0;代码中,ShowControlBa函数有三个参数,第一个参数用来指定要操作的工具栏或状态栏指针,第二个参数是一个布尔型,当为
34、TRUE时表示显示,否则表示隐藏,第三个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。第36页/共50页例Ex_SDI4.完善程序代码(3)在CMainFrame:OnViewTest和CMainFrame:OnTestReturn函数中添加下列代码:void CMainFrame:OnViewTest()ShowControlBar(&m_wndTestBar,TRUE,FALSE);/显示测试工具栏ShowControlBar(&m_wndToolBar,FALSE,FALSE);/关闭主工具栏void CMainFrame:OnTestReturn()ShowCon
35、trolBar(&m_wndTestBar,FALSE,FALSE);/关闭测试工具栏ShowControlBar(&m_wndToolBar,TRUE,FALSE);/显示主工具栏 第37页/共50页例Ex_SDI4.完善程序代码(4)编译运行并测试,结果如图5.25所示,左边是一开始运行的结果,右边是单击工具按钮 运行的结果。图5.25 Ex_SDI最后运行结果第38页/共50页5.3 状态栏状态栏是一条水平长条,位于应用程序的主窗口的底部。它可以分割成几个窗格,用来显示多组信息。状态栏的定义用MFC AppWizard创建的单文档或多文档应用程序框架中,有一个静态的indicators数
36、组,它是在MainFrm.cpp文件中定义的,被MFC用作状态栏的定义。图5.26列出了indicators数组元素与标准状态栏窗格的关系。图5.26 indicators数组的定义第39页/共50页状态栏的常用操作Visual C+6.0中可以方便地对状态栏进行操作,如增减窗格、在状态栏中显示文本、改变状态栏的风格和大小等,并且MFC的CStatusBar类封装了状态栏的大部分操作。1.增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可;若在状态栏中增加一个用户
37、指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素即可。第40页/共50页状态栏的常用操作2.在状态栏上显示文本有3种办法可以在状态栏窗格显示文本信息:(1)调用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样
38、。(2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。(3)调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下:BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE);其中,lpszNewText表示要显示的字符串。nIndex是表示设置的窗格索引(第一个窗格的索引为0)。若bUpdate为TRUE,则系统自动更新显示的结果。值得注意的是,在使用第2种方法时,应按一定的步骤进行。例如下面
39、的示例过程是在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。第41页/共50页状态栏的常用操作例Ex_SDIMouse 将鼠标在窗口客户区的位置显示在状态栏上(1)创建一个默认的单文档应用程序Ex_SDIMouse。(2)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。(3)将状态栏indicators数组的定义改为下列代码:static UINT indicators=ID_SEPARATOR,ID_SEPARATOR,;第42页/共50页例Ex_SDIMou
40、se(4)由于鼠标移动消息WM_MOUSEMOVE在CMainFrame类映射后不起作用,因此只能映射到CEx_SDIMouseView类中。但是,这样一来,就需要更多的代码,因为状态栏对象m_wndStatusBar是在CMainFrame类定义的成员变量,因而需要在CEx_SDIMouseView类中添加访问CMainFrame类的代码。CEx_SDIMouseView:OnMouseMove函数代码如下:void CEx_SDIMouseView:OnMouseMove(UINT nFlags,CPoint point)CString str;CMainFrame*pFrame=(CMa
41、inFrame*)AfxGetApp()-m_pMainWnd;/获得主窗口指针CStatusBar*pStatus=&pFrame-m_wndStatusBar;/获得主窗口中的状态栏指针if(pStatus)str.Format(X=%d,Y=%d,point.x,point.y);/格式化文本pStatus-SetPaneText(1,str);/更新第二个窗格的文本CView:OnMouseMove(nFlags,point);第43页/共50页例Ex_SDIMouse(5)将MainFrm.h文件中的受保护变量m_wndStatusBar变成公共变量。(6)在Ex_SDIMouseV
42、iew.cpp文件的开始处增加下列语句:#include Ex_SDIMouseView.h#include MainFrm.h(7)编译并运行,结果如图5.27所示。图5.27 鼠标的位置显示在状态栏上第44页/共50页状态栏的常用操作3.改变状态栏的风格在MFC的CStatusBar类中,有两个成员函数可以改变状态栏风格,它们是:void SetPaneInfo(int nIndex,UINT nID,UINT nStyle,int cxWidth);void SetPaneStyle(int nIndex,UINT nStyle);其中,参数nIndex表示要设置的状态栏窗格的索引,nI
43、D用来为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观,例如SBPS_POPOUT表示窗格是凸起来的,具体见表5.6。表5.6 状态栏窗格的风格类型第45页/共50页5.4 交互对象的动态更新例Ex_Update 交互对象的动态更新(1)创建一个默认的单文档应用程序Ex_Update。(2)将项目工作区窗口切换到ResourceView页面,展开Toolbar资源节点。(3)选中Toolbar资源IDR_MAINFRAME,然后按下Ctrl键不放,移动鼠标将IDR_MAIN-FRAME拖到Toolbar资源名称上,这样就复制了工具栏
44、默认资源IDR_MAINFRAME,复制后的资源标识系统自动设为IDR_MAINFRAME1。(4)右击IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,在弹出的属性对话框中将ID改为IDR_NEWBAR。(5)将IDR_NEWBAR工具按钮删除几个以与IDR_MAINFRAME有所区别。(6)打开MainFrm.h文件,在CMainFrame类中声明一个CToolBar类变量m_wndNewBar,一个BOOL型的成员变量m_bNewBar。protected:/control bar embedded membersCStatusBar m_wndStatusB
45、ar;CToolBar m_wndToolBar;CToolBar m_wndNewBar;BOOLm_bNewBar;第46页/共50页例Ex_Update(7)在CMainFrame:OnCreate中添加下列代码:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;if(!m_wndNewBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|C
46、BRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR+10)|!m_wndNewBar.LoadToolBar(IDR_NEWBAR)TRACE0(Failed to create newbarn);return-1;/fail to create m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndNewBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar
47、(&m_wndToolBar);DockControlBar(&m_wndNewBar);return 0;第47页/共50页例Ex_Update(8)打开菜单资源IDR_MAINFRAME,在“查看”菜单下添加一个菜单项“新工具栏(&N)”,ID标识符设定为ID_VIEW_NEWBAR。(9)用MFC ClassWizard在CMainFrame类中添加菜单ID_VIEW_NEWBAR的COMMAND和UPDATE_COMMAND_UI两个消息映射,并在映射函数中添加下列代码:void CMainFrame:OnViewNewbar()m_bNewBar=!m_bNewBar;ShowCon
48、trolBar(&m_wndNewBar,m_bNewBar,FALSE);/显示或隐藏工具栏void CMainFrame:OnUpdateViewNewbar(CCmdUI*pCmdUI)m_bNewBar=m_wndNewBar.IsWindowVisible();pCmdUI-SetCheck(m_bNewBar);第48页/共50页例Ex_Update代码中,OnUpdateViewNewbar是ID_VIEW_NEWBAR的更新命令消息的消息映射函数。该函数只有一个参数,它是指向CCmdUI对象的指针。CCmdUI 类仅用于ON_UPDATE_COMMAND_UI消息映射函数,它的成员函数将对菜单项、工具按钮等用户交互对象起作用,具体如表5.7所示。表5.7 CCmdUI 类的成员函数对用户交互对象的作用第49页/共50页感谢您的观看。第50页/共50页