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

下载本文档

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

文档简介

第5章菜单、工具栏和状态栏,5.1菜单5.2工具栏5.3状态栏,2,5.1菜单,菜单的显示规则:若单击菜单项后,将弹出一个对话框,那么在该菜单项文本后有“”。若某菜单有子菜单,那么在该菜单项文本后有“”若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与Alt构成一个组合键。或在菜单打开时,直接按助记符键,对应的菜单项也会被选中。若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。,3,5.1菜单,顶层菜单,下拉菜单,4,5.1.1用编辑器设计菜单,1.编辑菜单,5,5.1.1用编辑器设计菜单,1.编辑菜单单击“测试”菜单项下方的空位置,在菜单项属性对话框中,输入标题“切换菜单(,5.1.1用编辑器设计菜单,9,(4)编译并运行。在应用程序的顶层菜单上,单击“测试”菜单项,然后将鼠标移动到弹出的子菜单项“切换菜单”上,则结果如图所示,此时状态栏上显示该菜单项的提示信息,该信息就是在前图的菜单项属性对话框“提示”框中设置的内容。单击“切换菜单”,则弹出一个消息对话框,显示内容“现在就切换吗?”。,5.1.1用编辑器设计菜单,10,5.1.2使用键盘快捷键,例:为前面菜单项ID_TEST_CHANGE定义键盘快捷键(1)展开项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,出现加速键资源列表。,下端的空行,11,5.1.2使用键盘快捷键,(2)建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图所示的“AccelProperties”(加速键属性)对话框,其中可设置的属性如表所示,12,5.1.2使用键盘快捷键,(3)在加速键属性对话框中,先选择在Ex_SDI应用程序菜单资源添加的“切换菜单”菜单项ID_TEST_CHANGE作为要联用的加速键的ID标识符,然后单击下一键按钮,并按下Ctrl+1作为此加速键的键值。此外,还需在相应的菜单项文本后面添加加速键内容。例如,可将ID_TEST_CHANGE菜单项的标题改成“切换菜单(/产生一个空菜单BOOLCreatePopupMenu();/产生一个空的弹出式子菜单2.装入菜单将菜单从资源装入应用程序中BOOLLoadMenu(LPCTSTRlpszResourceName);/lpszResourceName为菜单资源名称BOOLLoadMenu(UINTnIDResource);/nIDResource为菜单资源ID标识符。,14,5.1.3菜单的编程控制,3.添加菜单项AppendMenu函数:将菜单项添加在菜单的末尾处InsertMenu函数:在指定位置处插入菜单项,后面的菜单项依次下移BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);/lpszNewItem为新菜单项的内容BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);/pBmp用于菜单项的位图指针BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);/nFlags:要增加的新菜单项的状态信息。,15,5.1.3菜单的编程控制,0表示第一个菜单项,-1表示菜单的末尾,说明:当菜单项增加、改变或删除后,都应该调用CWnd:DrawMenuBar来更新菜单。,16,5.1.3菜单的编程控制,4.删除菜单项DeleteMenu函数原型:BOOLDeleteMenu(UINTnPosition,UINTnFlags);/nPosition表示要删除的菜单项位置,由nFlags进行说明。若当nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID标识符,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。,17,5.1.3菜单的编程控制,5.获取菜单项UINTGetMenuItemCount()const;/获得菜单的菜单项数,调用失败后返回-1。UINTGetMenuItemID(intnPos)const;/获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR(分隔符),则返回-1。CMenu*GetSubMenu(intnPos)const;/获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。,18,5.1.3菜单的编程控制,例Ex_Menu用程序添加并处理一个菜单项(1)创建一个默认的单文档应用程序Ex_Menu。(2)选择“查看”菜单“ResourceSymbols”命令,弹出“资源符号”对话框,对应用程序中的资源标识符进行管理。由于程序中要添加的菜单项需要一个标识值,最好用一个标识符来代替这个值。因此这里通过“资源符号”对话框来创建一个新的标识符。,19,(3)单击新建按钮,弹出“NewSymbol”(新标识符)对话框。在名字(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在Value框中,输入该ID的值,系统要求ID值应大于15(0X000F)而小于61440(0XF000)。保留默认的ID值101,单击确定按钮。,5.1.3菜单的编程控制,20,(4)关闭“资源符号”对话框,在CMainFrame:OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。intCMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct).CMenu*pSysMenu=GetMenu();/获得程序菜单指针CMenu*pSubMenu=pSysMenu-GetSubMenu(1);/第二个子菜单指针CStringStrMenuItem(新的菜单项);pSubMenu-AppendMenu(MF_SEPARATOR);/增加一水平分隔线pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/在子菜单中增加一菜单项m_bAutoMenuEnable=FALSE;/关闭系统自动更新菜单状态pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/激活菜单项DrawMenuBar();/更新菜单return0;,5.1.3菜单的编程控制,21,(5)此时编译运行后,结果如图。但此时选择“新的菜单项”命令不会有反应。,5.1.3菜单的编程控制,22,(6)用MFCClassWizard在CMainFrame添加OnCommand消息函数的重载,并添加代码:BOOLCMainFrame:OnCommand(WPARAMwParam,LPARAMlParam)if(LOWORD(wParam)=ID_NEW_MENUITEM)MessageBox(你选中了新的菜单项);returnCFrameWnd:OnCommand(wParam,lParam);(7)编译运行并测试。这时当选择菜单“编辑”“新的菜单项”命令后,就会弹一个对话框,显示“你选中了新的菜单项”消息。,5.1.3菜单的编程控制,23,5.1.4使用快捷菜单,快捷菜单:一种浮动的弹出式菜单,当用户按下鼠标右键时,就会相应地弹出一个浮动菜单,其中提供了几个与当前选择内容相关的选项。资源编辑器和CMenu:TrackPopupMenu函数:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);/nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志/pWnd指向弹出菜单的窗口,它接收菜单所有WM_COMMAND信息。/lpRect是一个RECT结构或CRect类指针,表示一个矩形区域,用户单击这个区域时,弹出菜单不消失,lpRect为NULL时,在菜单外单击鼠标,菜单消失。,24,5.1.4使用快捷菜单,25,5.1.4使用快捷菜单,例Ex_ContextMenu使用快捷菜单单击鼠标右键会向系统发送WM_CONTEXTMENU消息,因此快捷菜单通过映射该函数来实现。(1)创建一个默认的单文档应用程序Ex_ContextMenu(2)在CEx_ContextMenuView类添加WM_CONTEXTMENU消息映射,并在映射函数中添加代码:voidCEx_ContextMenuView:OnContextMenu(CWnd*pWnd,CPointpoint)/获得主窗口指针CMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得程序窗口菜单指针CMenu*pSysMenu=pFrame-GetMenu();/获得顶层菜单个数intnCount=pSysMenu-GetMenuItemCount();,26,5.1.4使用快捷菜单,intnSubMenuPos=-1;for(inti=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);,27,(3)在Ex_ContextMenuView.cpp文件的前面添加CMainFrame类的文件包含:#includeEx_ContextMenuView.h#includeMainFrm.h(4)运行并测试。当用户在应用程序窗口的客户区中右击鼠标,会弹出如图的快捷菜单。,客户区,5.1.4使用快捷菜单,28,5.2工具栏,5.2.1使用工具栏编辑器选择菜单“文件”“打开工作区”,将前面的单文档应用程序Ex_SDI调入或重新创建。在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME,则工具栏编辑器出现在主界面的右边。,29,5.2.1使用工具栏编辑器,工具栏按钮的一般操作:(1)创建一个新的工具栏按钮。双击空按钮弹出属性对话框,输入标识符名称;单击该按钮,在工具按钮设计窗口进行编辑,30,5.2.1使用工具栏编辑器,(2)移动一个按钮:鼠标左键单击并拖动;若按下Ctrl,则在新位置复制。(3)删除一个按钮:将之脱离工具栏;delete键并不删除按钮,只是将按钮中的图形以背景色填充。,31,5.2.1使用工具栏编辑器,(4)在工具栏中插入空格在工具栏中插入空格有以下几种情况:如果按扭前没有空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。,32,5.2.1使用工具栏编辑器,(5)工具栏按钮属性的设置。双击某按钮弹出其属性对话框。属性对话框中的各项说明见下表。,(6)工具栏和菜单相结合。即当选择工具按钮或菜单命令时,操作结果是一样的。使它们结合的具体方法是在工具按钮的属性对话框中将按钮的ID标识符设置为相关联的菜单项ID。需要说明的是,对于单独工具按钮命令消息的映射方法跟菜单命令是一样的。,33,5.2.2多个工具栏的使用,例Ex_SDI使用多个工具栏1.添加并更改应用程序菜单(1)创建一个默认的单文档应用程序Ex_SDI。(2)按快捷键Ctrl+R,弹出“插入资源”对话框,在资源类型中选定“Menu”。,34,1.添加并更改应用程序菜单(3)单击新建按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1,以后依次为IDR_MENU2、IDR_MENU3、.),同时自动打开这个新的菜单资源。,5.2.2多个工具栏的使用,35,1.添加并更改应用程序菜单(4)在Menu资源的ID_MENU1上右击鼠标,从弹出的快捷菜单中选择“Properties”命令,出现菜单属性对话框,在这里可以重新指定菜单资源ID,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为_DEBUG,则菜单资源只存在于Debug编译环境中。,5.2.2多个工具栏的使用,36,1.添加并更改应用程序菜单(5)为菜单ID_MENU1添加一个顶层弹出菜单项“测试(8)按快捷键Ctrl+W打开MFCClassWizard对话框,切换到MessageMaps页面,从“Classname”列表中选择CMainFrame,分别为菜单项ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默认的消息映射函数名,并添中下列代码:,5.2.2多个工具栏的使用,38,voidCMainFrame:OnViewTest()m_NewMenu.Detach();/使菜单对象和菜单句柄分离m_NewMenu.LoadMenu(IDR_MENU1);/装载菜单资源SetMenu(NULL);/清除应用程序菜单SetMenu(9)第一次编译运行并测试。,5.2.2多个工具栏的使用,39,2.添加并设计工具栏按钮(1)在项目工作区的ResourceView页面中,展开Toolbar(工具栏)资源,双击“Toolbar”项中的IDR_MAINFRAME,显示工具栏编辑器。(2)利用工具栏编辑器设计两个工具按钮,其位置和内容如图所示。(3)双击刚才设计的第一个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_TEST_RETURN,在提示框内键入“返回应用程序主菜单n返回主菜单”。,5.2.2多个工具栏的使用,40,2.添加并设计工具栏按钮(4)双击刚才设计的第二个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_VEW_TEST,在提示框内键入“显示测试菜单n显示测试菜单”。(5)第二次编译运行并测试。当程序运行后,将鼠标移至刚才设计的第一个工具按钮处,这时在状态栏上显示出“返回应用程序主菜单”信息,若稍等片刻后,还会弹出提示小窗口,显示出“返回主菜单”字样,如图所示。单击新添加的这两个按钮,会执行相应的菜单命令。,5.2.2多个工具栏的使用,41,3.添加工具栏(1)在项目工作区切的ResourceView页面中,展开Toolbar(工具栏)资源,用鼠标单击IDR_MAINFRAME不松开,然后按下Ctrl键,移动鼠标将IDR_MAINFRAME拖到Toolbar资源名称上,这样就复制了工具栏默认资源IDR_MAINFRAME,复制后的资源标识系统自动设为IDR_MAINFRAME1。(2)右击工具栏资源IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,如图所示,将ID设为IDR_TOOLBAR1。(3)双击IDR_TOOLBAR1,打开工具栏资源,按图删除不要的工具按钮。,5.2.2多个工具栏的使用,42,3.添加工具栏(4)在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar。CToolBar类封装了工具栏的操作。(5)在CMainFrame:OnCreate函数中添加下面的工具栏创建代码:intCMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct)if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;intnRes=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);,5.2.2多个工具栏的使用,43,if(!nRes|!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)TRACE0(Failedtocreatetoolbarn);return-1;/failtocreatem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(6)编译运行,5.2.2多个工具栏的使用,44,4.完善程序代码(1)调用CFrameWnd类的成员函数ShowControlBar来使程序一开始运行时隐藏工具栏IDR_TOOLBAR1。(2)在CMainFrame:OnCreate函数中添加下列代码:intCMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct)ShowControlBar(,5.2.2多个工具栏的使用,指定要操作的工具栏或状态栏指针,TRUE显示FALSE隐藏,是否延迟显示或隐藏,FALSE立即显示或隐藏。,45,4.完善程序代码(3)在CMainFrame:OnViewTest和CMainFrame:OnTestReturn函数中添加下列代码:voidCMainFrame:OnViewTest()ShowControlBar(/关闭主工具栏,5.2.2多个工具栏的使用,46,4.完善程序代码voidCMainFrame:OnTestReturn()ShowControlBar(/显示主工具栏(4)编译运行并测试,结果如图所示,左边是一开始运行的结果,右边是单击工具按钮运行的结果。,5.2.2多个工具栏的使用,47,5.3状态栏,5.3.1状态栏的定义用MFCAppWizard创建的单文档或多文档应用程序框架中,有一个静态的indicators数组,它是在MainFrm.cpp文件中定义的,被MFC用作状态栏的定义。,48,5.3.2状态栏的常用操作,1.增加和减少窗格在状态栏中增加一个信息行窗格,只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可;在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素即可。,49,5.3.2状态栏的常用操作,2.在状态栏上显示文本三种办法:(1)调用CWnd:SetWindowText更新信息行窗格中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样。(2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。,50,5.3.2状态栏的常用操作,2.在状态栏上显示文本(3)调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);/nIndex是表示设置的窗格索引(第一个窗格的索引为0)。/lpszNewText表示要显示的字符串。/bUpdate若为TRUE,则系统自动更新显示的结果。,51,5.3.2状态栏的常用操作,例Ex_SDIMouse将鼠标在窗口的位置显示在状态栏最右边窗格中(1)创建一个默认的单文档应用程序Ex_SDIMouse。(2)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。(3)将状态栏indicators数组的定义改为下列代码:staticUINTindicators=ID_SEPARATOR,ID_SEPARATOR,;,52,(4)鼠标移动消息WM_MOUSEMOVE只能映射到CEx_SDIMouseView类中。但是,状态栏对象m_wndStatusBar是在CMainFrame类定义的成员变量,因而需要在CEx_SDIMouseView类中添加访问CMainFrame类的代码:voidCEx_SDIMouseView:OnMouseMove(UINTnFlags,CPointpoint)CStringstr;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得主窗口指针CStatusBar*pStatus=,5.3.2状态栏的常用操作,53,(5)将MainFrm.h文件中的受保护变量m_wndStatusBar变成公共变量。(6)在Ex_SDIMouseView.cpp文件的开始处增加MainFrm包含语句:#includeEx_SDIMouseView.h#includeMainFrm.h(7)编译并运行,结果如图所示。,5.3.2状态栏的常用操作,54,5.3.2状态栏的常用操作,3.改变状态栏的风格CStatusBar类中改变状态栏风格的两个成员函数:-voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);-voidSetPaneStyle(intnIndex,UINTnStyle);/nIndex表示要设置的状态栏窗格的索引/nID用来为状态栏窗格指定新的ID/cxWidth表示窗格的像素宽度,/nStyle表示窗格的风格类型,用来指定窗格的外观,例如SBPS_POPOUT表示窗格是凸起来的,具体见表5.6,55,例如,在前例中,修改OnMouseMove函数代码:voidCEx_SDIMouseView:OnMouseMove(UINTnFlags,CPointpoint)CStringstr;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得主窗口指针CStatusBar*pStatus=,5.3.2状态栏的常用操作,56,5.4交互对象的动态更新,用户交互对象:可由用户的操作而产生命令消息的对象,如菜单项、工具栏中的工具按钮和加速键等。每个用户交互对象都有一个唯一的ID标识符,在发送消息时,该ID标识符被包含在WM_COMMAND消息中。菜单项:选中、未选中、灰显三种状态为实现用户交互对象动态更新,用ClassWizard直接映射交互对象的更新命令来实现。它自动将用户交互对象的ID标识符与ON_UPDATE_COMMAND_UI宏相连接并产生处理更新消息的相应函数。,57,5.4交互对象的动态更新,例Ex_Update交互对象的动态更新(1)创建一个默认的单文档应用程序Ex_Update。(2)将项目工作区窗口切换到ResourceView页面,展开Toolbar资源节点。(3)选中Toolbar资源IDR_MAINFRAME,然后按下Ctrl键不放,移动鼠标将IDR_MAIN-FRAME拖到Toolbar资源名称上,这样就复制了工具栏默认资源IDR_MAINFRAME,复制

温馨提示

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

评论

0/150

提交评论