1、第5章 菜单、工具栏与状态栏5.1 编辑菜单资源Windows中的菜单由顶层的水平列表项以及分别与各项相连的下拉式菜单所组成。5.1.1 系统生成的菜单当用AppWizard自动生成一个应用程序框架时,应用程序中已经被加入了多种资源。如果在AppWizard的Step 1对话框中选择创建的是基于单文档SDI或基于多文档MDI的应用程序,则在应用程序的资源项中将自动包含菜单资源。5.1.1.1 SDI应用程序中自动生成的菜单5.1.1.2 MDI应用程序中自动生成的菜单5.1.1.2 MDI应用程序中自动生成的菜单(续)5.1.2 菜单的编辑菜单编辑器的作用:创建标准的菜单和命令;移动菜单和命令
2、;编辑菜单项属性。5.1.2 菜单的编辑(实例)步骤1:运行AppWizard创建单文档工程Eg5_1步骤2:添加菜单资源5.2 使用 ClassWizard添加消息处理函数操作步骤:1.确定打开了Eg5_1工作空间Eg5_1.dsw。2.选择ViewClassWizard菜单项,弹出MFC ClassWizard对话框。3.在Class name下拉式列表中选择视图类CEg5_1View,在Object IDs列表框中选择ID_MESSAGE_DISPLAY。4.在Messages列表框中的COMMAND上双击鼠标左键,或者在其上单击左键,然后按Add Function按钮,在弹出的Add
3、Member Function对话框中直接按OK按钮。5.2 使用 ClassWizard添加消息处理函数(续)5.按Edit Code按钮,或在Member functions列表框中双击新添的函数,退出ClassWizard转入到文本编辑,为该函数添加执行代码。代码如下:5.2 使用 ClassWizard添加消息处理函数(续)void CEg5_1View:OnMessageDisplay()/TODO:Add your command handler code here MessageBox(这是一个简单的对话框这是一个简单的对话框);lvoid CEg5_1View:OnMessag
4、eStyleOkcancel()ll/TODO:Add your command handler code herelMessageBox(这是一个有确定和取消按钮的对话框这是一个有确定和取消按钮的对话框,l OKCANCEL对话框对话框,MB_OKCANCEL);l5.2 使用 ClassWizard添加消息处理函数(续)lvoid CEg5_1View:OnMessageChange()ll/TODO:Add your command handler code herelMessageBox(这个对话框的标题已经改变了这个对话框的标题已经改变了,l 新对话框新对话框);llvoid CEg
5、5_1View:OnMessageStyleYesno()ll/TODO:Add your command handler code herelMessageBox(这是一个有这是一个有Yes和和No按钮的消息框按钮的消息框,l YESNO消息框消息框,MB_YESNO);l5.2.2MessageBox()函数在这个实例中,主要用到了MessageBox()函数。MessageBox()函数的作用是用于一个消息框,它是一个预定义对话框。MessageBox()函数包括三个参数:第一个参数表示消息框要显示的文本;第二个参数代表消息框的标题;第三个参数代表显示风格。5.3 加入键盘加速键5.3.
6、1 键盘加速键的含义l键盘加速键应用程序定义的键盘上的某一个键或两至三个键的组合,给用户提供一种选择菜单项和执行某些任务的快速方法。l键盘加速键可以和菜单项关联,也可以定义某些菜单上没有提供的命令。5.3.2 添加键盘加速键操作步骤:1.在工作区中选择Resource View标签,展开Menu项,双击IDR_MAINFRAME,修改菜单项的属性。如下图所示:5.3.2 添加键盘加速键(续)2.在工作区中单击Resource View标签,展开Accelerator项,在IDR_MAINFRAME上双击左键,启动App Studio之加速键资源编辑器,客户区中打开一个用于编辑加速键的窗口。5.
7、3.2 添加键盘加速键(续)客户区中打开的加速键编辑窗口:5.3.2 添加键盘加速键(续)3.在最后的虚框上双击鼠标左键,或者单击右键并在弹出的菜单中选择New Accelerator菜单项,弹出如图所示的加速键属性(Accel Properties)对话框。5.3.2 添加键盘加速键(续)加速键属性对话框:5.3.2 添加键盘加速键(续)4.编译、链接、运行。5.4 工具栏和状态栏在这一节中,介绍如何为应用程序创建适合自己的状态条和工具条:如何在工具条中加自己的图形按钮以及如何控制它的外形、如何来禁止状态条显示正常的菜单提示和键盘状态指示,使得可以把状态条另作它用。5.4.1 工具栏工具栏提
8、供一个既漂亮又快捷的命令选择界面,它已渐渐成为应用程序的基本配件。工具栏提供了另一种选择,它可以弥补菜单和加速键的缺陷,在使用上非常便捷,而且以图形代替文字说明,赋予程序更亲切的用户界面。5.4.2 用MFC创建工具栏使用MFC建立工具栏的基本步骤如下:1.先使用Visual C+6.0工作平台中的资源编辑器中打开资源,打开Toolbar中工具条的位图资源,然后根据自己的需要建立和修改工具栏。2.在程序中建立一个CToolBar对象。5.4.2 用MFC创建工具栏(续)l/修改主框架MainFrm.h文件,增加工具栏对象数据成员说明lclassCMainFrm:publicCMDIFrameW
9、ndl l lprotected:lCToolBar m_wndToolVar;/工具栏对象ll5.4.2 用MFC创建工具栏(续)3.调用CToolBar类的Create()成员函数建立窗口的工具栏,该函数同时会将工具栏子窗口与CToolBar对象连结在一起。4.调用CToolBar类的LoadBitmap()成员函数装入工具栏命令按钮组的图形位图资源。5.调用CToolBar类的SetButtons()成员函数设定工具栏中的命令按钮风格,并赋予每个命令按钮在位图资源中的图形。5.4.3 创建一个实际的工具栏5.4.3.1 创建工程5.4.3.2 添加工具栏上新建按钮的位图资源5.4.3.3
10、 创建菜单资源5.4.3.4 添加成员变量5.4.3.5 添加程序代码5.4.3.6 添加响应函数5.4.4 状态栏5.4.4.1 状态栏的构成状态栏分成两部分:左边是状态信息行,右边是状态指示器。l状态信息行用来显示程序动态提供一些字符串 l状态指示器用来显示一些状态信息,默认的有三个键的状态,依次为:CapsLock键、NumLock键和ScrollLock键的状态 5.4.4.2 为应用程序添加状态栏步骤1:定位到文件MainFrm.cpp文件,添加如下代码:lstatic UINT indicators=llID_SEPARATOR,/status line indicatorlID_
11、SEPARATOR,/显示显示x坐标信息坐标信息lID_SEPARATOR,/显示显示x坐标信息坐标信息lID_INDICATOR_CAPS,lID_INDICATOR_NUM,lID_INDICATOR_SCRL,l;5.4.4.2 为应用程序添加状态栏(续)步骤2:为状态栏添加标识号。通过菜单ViewResource Symbols打开Resource Symbols对话框,单击New按钮,添加名为IDC_STATUSBAR的标识号,数值取默认值。5.4.4.2 为应用程序添加状态栏(续)步骤3:定位到函数CMainFrame:OnCreate,在其中添加状态栏的设置代码:lint CMa
12、inFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)ll/TODO:Delete these three lines if you dont want the toolbar tol/be dockablel/设置状态信息行的宽度设置状态信息行的宽度l/x坐标信息窗口坐标信息窗口l m_wndStatusBar.SetPaneInfo(1,IDC_STATUSBAR,SBPS_POPOUT,50);l/y坐标信息窗口坐标信息窗口l m_wndStatusBar.SetPaneInfo(2,IDC_STATUSBAR,SBPS_POPOUT,50);ll
13、5.4.4.2 为应用程序添加状态栏(续)步骤4:定位到文件MainFrm.h中类的定义处,将成员变量m_wndStatusBar和m_wndToolBar的保护类型(protected)改为公用类型(public)。5.4.4.2 为应用程序添加状态栏(续)步骤5:通过ClassWizard在类CEg5_2View中添加WM_MOUSEMOVE消息的响应函数(在标识号Object IDs项中选中CEg5_2View),并添加代码如下:5.4.4.2 为应用程序添加状态栏(续)lvoid CEg5_2View:OnMouseMove(UINT nFlags,CPoint point)ll/TO
14、DO:Add your message handler code here and/or call defaultlchar PositionString50;l/获取主框架指针获取主框架指针lCMainFrame*MFrame=(CMainFrame*)AfxGetMainWnd();l/在状态信息行在状态信息行1中显示中显示X坐标坐标lsprintf(PositionString,X:%d,point.x);lMFrame-m_wndStatusBar.SetPaneText(1,PositionString);l /在状态信息行在状态信息行2中显示中显示Y坐标坐标lsprintf(Pos
15、itionString,Y:%d,point.y);lMFrame-m_wndStatusBar.SetPaneText(2,PositionString);l lCView:OnMouseMove(nFlags,point);l5.4.4.2 为应用程序添加状态栏(续)步骤6:在文件CEg5_2View.cpp前部的其他包含语句(include)后面添加包含语句:#include MainFrm.h“最后,编译、链接和运行程序。5.5 小结这一章介绍了菜单的生成过程以及对工具栏和状态栏的修改;从编辑一个菜单的可视化外观开始,然后为菜单添加消息处理函数,便得菜单有相应的执行功能;介绍了如何在为菜单项设置加速键。