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

下载本文档

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

文档简介

1、第5章 菜单、工具栏和状态栏菜单是一系列命令的列表,用户能够选中其中的菜单项(命令)并执行相应任务。除一些简单的基于对话框的应用程序外,所有的Windows程序都提供了各自的菜单。菜单是Windows应用程序中不可缺少的界面元素,其风格和外观有时直接影响着用户对软件的评价。许多优秀的软件(如Microsoft Office)为增加对用户的吸引力,不惜资源资源,将菜单做得多姿多彩,甚至达到三维效果。*用编辑器设计菜单1、在原有的菜单”文件(F)”里加一个菜单,其作用是你单击它后,能在屏幕上显示一行字。(1)建一个SDI单文档应用程序名为:显示一行字(2)ResourceViewàMen

2、u(双击打开)àIDR_MAINFRAMEà右面出现菜单à文件(下拉)à(想在哪儿加,可点重下边一个,按Insert键)à双击空白菜单à出现对话框à在Caption处写菜单名“窗口显示(&C)”(&为快捷键标志)àID处写ID_FILE_XSà最下面的状态栏里可写点什麽à关闭对话框 (3)在Doc.h的public下加: CString str; 在Doc.cpp的构造函数里加: str=” ”;/置空 (4)将菜单ID_FILE_XS映射到View视图类中 Viewà

3、ClassWizardàMessageMapsà在Class name里置Viewà在Object IDS里找到ID_FILE_XS(你加的)à右边Messages里点黑COMMANDàAdd Functionà出现对话框,里面OnFileXS点ok(对话框消失)àEdit Code进入视图文件:void View:OnFileXS() CMyDoc *pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->str=“你成功的在File菜单里建立了一个显示菜单”; Invalidat

4、e();(5)再在View.cpp里(往上找到) CMyView:OnDraw(CDC *Pdc) pDC->TextOut(100,100,pDoc->str); (6)运行(1)点你建的菜单,在屏幕上显示你的一行字(2)打开菜单别动,直接按C键,也出现这行字(3)将鼠标放在这个菜单上,下面状态栏也出现你写的注释。 (7)若建子菜单,需在caption处写上这个菜单名后,点Pop_up便屏蔽ID,你关闭此对话框,双击出现的子菜单栏,开始建就行了。 (8)改变菜单位置 点重不放,往你想加的地方拖即可!2、在顶层菜单栏里加一个菜单项,其作用是你单击它后能进入”山东旅游”。1、Reso

5、urceViewàMenuàIDR_MAINFRAMEà右面出现菜单编辑à在菜单的空位置上双击(或点重一个菜单,按Insert键就在这个菜单前加上一个菜单),出现对话框,你在Caption处写:“山东旅游(&S)”à点Pop_up(屏蔽ID)à退出2、在下面出现的空白菜单上双击,写:烟台(&Y)àPop_upà关闭。3、旁边出现子菜单,你双击它à写”蓬莱村 Ctrl +F5”àID_SD_YT_PLàprompt处写:蓬莱仙境4、烟台下面写“青岛”à子菜单写“

6、崂山 Ctrl +F6”àID_SD_QD_LSà注释栏 (prompt) 写:崂山道士。 5、青岛下面写:泰安à子菜单处写:泰山 Ctrl +F7àID_SD_TA_TSàprompt处写:五岳之首 6、填加速键表:(资源栏)Acceleratorà(双击)IDR_MAINFRAMEà出现加速键表,你双击最下面的空白格à出现对话框àID处下拉找到ID_SD_YT_PL置好àkey处下拉,找到VK_F5置好(或置好ID后,单击Next Key Typed,按下Ctrl+5键也可)7、按第6步,将

7、青岛崂山、泰安泰山分别置好VK_F6 ,VK_F7.8、向工具栏中加新按钮:使鼠标放在这个按钮上,就出现个小方框和菜单注释栏中的蓬莱仙境一样字样。(1)ResoureViewàToolbaràIDR_MAINFRAMEà点一下最后的空白按钮,用红刷将中间大块涂红色。(2)双击你涂好的红色按钮,出现对话框,你在ID栏下拉,找到ID_SD_YT_PL点黑置好(和烟台蓬莱菜单共用一个ID)Prompt处写:蓬莱仙境n蓬莱仙境。(如果你不想与蓬莱仙境一起显示,就写自己的工具栏ID号,自己在注释栏写东西n-à将ID映射到View中,设变量,运行后点工具栏就出现你写

8、的东西)。 9、使菜单变灰(不被激活,不起作用) ViewàClassWizardàClassname选Viewà在ObjectTDS里找到你想屏蔽的菜单,点黑ID_SD_TA_TS,右边选UPDATE COMMAND UIàAddFoutionàEdit Codeà在此函数里写:pCmdUI->Enable(false);(CCmdUI类是用来设置菜单的等,5.0书128页,教材243页) 10、核对菜单项,使这个菜单字的前面加个“”号,和前面一样用ClassWizard,View里连接UPDATE COMMAND UI,是哪

9、个要被核对,就将哪个ID映射到View里,这里是ID_SD_QD_LS,并加代码: pCmdUI->Enable(true); pCmdUI->SetCheck(1);/如果括弧里写0是删除核对符 11、建立显示字符串的过程(1)在View.h里的public:写 CString str; 在View.cpp的构造函数里写: str=“ ”; (2)分别将烟台蓬莱ID_SD_YT_PL、青岛崂山ID_SD_QD_LS、泰安泰山ID_SD_TA_TS映射到视图类View里,即:ViewàClassWizardà在LassName处置Viewà在Objec

10、tIDs里分别找到以上的各个ID并点黑à点黑COMMANDàAdd Functionà各个加完后àEdit Codeà分别加代码:(青岛崂山映射函数:) str=“青岛崂山”;Invalidate();(烟台蓬莱映射函数:) str=“八仙过海”;Invalidate();(泰安泰山映射函数:) str=“五岳之首”;Invalidate();(3)在OnDraw()函数里写:pDC->TextOut(50,50,str);菜单General(属性)对话框的各项含义:(223页表5.1)ID 菜单的资源ID标识符Caption(标题) 用

11、于标识菜单项显示文本,助记符字母的前面有一个“ &”符号,这个字母与Alt构成组合键Separator(分隔符) 选中时,菜单项是一个分隔符或是一条水平线Checked(选中的) 选中时,菜单项文本前显示一个选中标记Pop_up(弹出) 选中时,菜单项含有一个弹出式子菜单Grayed(变灰) 选中时,菜单项显示是灰色的,用户不能选用Inactive(非激活) 选中时,菜单项没有被激活,用户不能选用Help(帮助) 选中时,菜单项在程序运行时被放在顶层菜单的最右端Break(暂停) 当为Column时,对于顶层菜单上的菜单项来说,被防置在另外一行上,而对于弹出式子菜单的菜单项来说,则被放

12、置在另外一列上;当为Bar时,与Column相同,只不过对于弹出式子菜单来说,它还在新列与原来的列之间增加一条竖直线,注意这些效果只能在程序运行后才能看到Prompt(提示) 用于指明光标移至该菜单项时在状态栏上显示的提示信息下面回到书221页5.1菜单 习惯上菜单的显示都遵循下列一些规则:(1)若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“”(2)若某项菜单有子菜单,那么在该菜单项文本后有“”(3)若菜单项需要助记符,则用括号将带下划线的字母括起来,助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中(4)若某项菜单需要快捷键的支持,则一

13、般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N,使用时是先按下”Ctrl”键不放,然后再按”N”键。任何时候按下快捷键,相应的菜单命令都会被执行。如书221页图5.1所示用编辑器设计菜单(1) 建一个单文档应用程序(2) ResourceViewà双击Menu项中的IDR_MAINFRAMEà顶层菜单的右边最后一个空位置双击à出现属性对话框àPop-up处于选中状态à Caption处写:测试(&T)(3)单击“测试”菜单项下方的空位置,在Caption对话框中,输入标题 “切换菜单(&D)”,在ID框

14、输入该菜单项的资源标识符:ID_TEST_CHANGE 在最下面的注释栏中写“单击此菜单项将主菜单变成另一菜单”。(3) view(查看)àClassWizard(类向导)àMessage MapsàClass nameà选CMainFrameàIDsà选ID_TEST_CHANGEàMessagesà选中COMMANDà单击“Add Function”或双击“COMMAND”消息àOKàEdit Code(4) 加代码:AfxMessageBox(“现在就切换吗?”);(5) 编译运

15、行!出现对话框,上面写“现在就切换吗?”(6) 按Alt+T 再接着按Alt+D便不用鼠标点就能出来“现在就切换吗?”对话框。以上为作业,上机完成。使用键盘快捷键(加速键)(接上个程序)A、打开此例的项目工作区窗口中的Accelerator的资源项,双击其下的:IDR_MAINFRAME,出现加速键表。B、你双击最下面的空行,弹出书225页图5.8,其中可设置属性如:书225页ID处下拉找到ID_TEST_CHANGE,Key处下拉找到VK_F5置好(单击Next Key Typed,按下Ctrl+F5键也可),(在对话框属性名字后面加:Ctrl+F5即写成:切换菜单Ctrl+F5)。C、运行

16、程序 按Ctrl +F5将弹出对话框。菜单的编程控制 在交互式软件的设计中,菜单有时会随着用户操作的改变而改变,这时的菜单就需要在程序中进行控制。菜单的基本操作MFC提供的菜单类CMenu可在程序运行时,处理有关菜单的操作:如: 创建菜单、装入菜单、删除菜单、获取菜单或设置菜单的状态等。1、 创建菜单:CMenu类的CreateMenu()和CreatePopupMenu()函数分别用于创建一个菜单或子菜单框架,它们的原型是:BOOL CreateMenu(); 产生一个空菜单BOOL CreatePopupMenu();产生一个空的弹出式子菜单2、 装入菜单将菜单从资源装入应用程序中,需要调

17、用CMenu成员函数LoadMenu或者用SetMenu对应用程序菜单进行重新设置。BOOL LoadMenu(LPCTSTR lpszResourceName); BOOL LoadMenu(UINT nIDResource); 其中参数:lpszResourceName:菜单资源名称nIDResource:菜单资源ID标识号3、 添加菜单项BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL); BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBit

18、map *pBmp); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0, LPCTSTR lpszNewItem=NULL); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem, const CBitmap *pBmp);其中:nIDNewItem 表示新菜单项的资源ID号 lpszNewItem表示新菜单项的内容 pBmp 用于菜单项的位图指针 nPosition 表示新菜单项要插入的菜单项位置 nFlags表示要增加的新菜单项的状态信息(见246页表

19、)4、 删除菜单项BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中:nPosition表示要删除的菜单项位置 当:Flags为MF_BYCOMMAND时,nPosition表示菜单项ID号 当:Flags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项为0)5、 获取菜单项UINT GetMenuItemCount()const;获得菜单项的项数,调用失败返回-1.UINT GetMenuItemID(int nPos)const;获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATO

20、R(分隔符)则返回-1。 CMenu *GetSubMenu(int nPos)const; 获得指定菜单的弹出式菜单的菜单句柄,该弹出式菜单由参数nPos指定,开始位置为0,若选单不存在,则创建一个临时的菜单指针。例:用程序添加并处理一个菜单项(1)新建一个单文档(SDI)应用程序(2)ViewàResourceSymbols弹出书228页图5.10的对话框(3)单击“New”按钮弹出如图228页5.11所示的“New Symbol”(新标识符)对话框。在名字(Name)框中输入一个新的标识符ID_NEW_MENUITEM.在值(Value)框中,输入该ID的值,系统要求用户定义的

21、ID值应大于15(0X000F)而小于61440(0XF000)。保留默认的ID值101,单击“确定”按钮。(4)关闭“资源符号”对话框,在CMainFrame:OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) CMenu *pSysMenu=GetMenu();/获得主菜单句柄 CMenu *pSubMenu=pSysMenu->GetSubMenu(1);/获得第二个子菜单指针 CString StrMenuItem(“新的选单项”); pSubMenu-&

22、gt;AppendMenu(MF_SEPARATOR);/增加一水平分割线 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); /在子选单中增加一选单项,允许使用ON_UPDATE_COMMAND_UI或 /ON_COMMAND的选单项 m_bAutoMenuEnable=FALSE;/关闭系统自动更新菜单状态 pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND| MF_ENABLED);/激活菜单项 DrawMenuBar();/更新菜单 return 0

23、;(5)(6)使用ClassWizard在CMainFrame主框架类中添加OnCommand消息函数的重载,并检测用户选单的nID参数 View->ClassWizard->在Class name处下拉置CMainFrame ->Messages处找到OnCommand消息映射到CMainFrame里并添代码: BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam) /wParam的低字节表示选单、控件、加速键的命令IDif(LOWORD(wParam)=ID_NEW_MENUITEM) MessageBox(“你选中了

24、新的选单项”);(7)编译运行并测试。编辑->新的选单项;弹出对话框,显示“你选中了新的选单项” 使用快捷菜单快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面设计风格,当用户按下鼠标右键时,就会相应地弹出一个浮动菜单,其中提供了几个与当前选择内容相关的选项。用资源编辑器和MFC库的CMenu:TrackPopupMenu()函数可以 很容易地创建这样的菜单,其原形如下: BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd, LPCRECT lpRect=NULL);该函数用于显示一个浮动的弹出式菜单,其位置由各参数决定。其中:

25、nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志,见230页表5.4。x,y表示菜单的水平坐标和菜单的顶端的垂直坐标。pWnd表示弹出菜单的窗口,此窗口将收到菜单的全部WM_COMMAND消息。lpRect是一个RECT结构或CRect对象指针,它表示一个矩形区域,用户单击这个区域时,弹出菜单不消失。当lpRect为NULL时,若用户在菜单外面单击,菜单立刻消失。例1:使用快捷菜单(显示运行后的窗口菜单里的”文件(F)”下面的菜单项)按 书230页做 第2步:void CMyView:OnContextMenu(CWnd* pWnd, CPoint point) / TODO: Add y

26、our message handler code hereCMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;/获得/主窗口指针CMenu *pSysMenu=pFrame->GetMenu();/获得程序窗口菜单指针int nCount=pSysMenu->GetMenuItemCount();/获得顶层菜单个数int nSubMenuPos=-1;for(int i=0;i<nCount;i+)/查找“文件”菜单CString str;pSysMenu->GetMenuString(i,str,MF_

27、BYPOSITION);if(str.Left(4)="文件") nSubMenuPos=i; break;if(nSubMenuPos<0) return;/没有找到返回pSysMenu->GetSubMenu(nSubMenuPos)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);第3步:#include “MainFrm.h”第4步:编译运行,在应用程序窗口的客户区中,用鼠标单击右键,会弹出快捷菜单(将原File下拉的菜单弹出来)(如书231页图5.13)。说明

28、:由于菜单、工具栏、状态栏是由主框架类CMainFrame来控制的,虽在视图类可以添加快捷菜单消息映射,但若要在视图类中访问应用程序的主框架窗口的系统菜单,则必须通过AfxGetApp来获取主框架类对象指针后才能获取相应的菜单。AfxGetApp是CWinApp类的一个成员函数,该函数可在应用程序项目中的任何类中使用,用于获取应用程序中的CWinApp类对象指针。例:使用快捷菜单(自己建立的菜单以快捷方式弹出来)1、创建一个单文档应用程序2、InsertàResourceà点黑MenuàNewà便在Menu资源下出现一个新菜单资源(默认的ID号为IDR_

29、MENU1),将此ID号改为:IDR_MYFLOATMENU。3、双击这个菜单资源,文档区出现一个空白菜单项,你为它起个名叫“弹出式菜单”,关闭à点开下面的子菜单,依次添加如下子菜单项:菜单 ID 标 题 属 性ID_MENU_SCOREIN 成绩输入(&S) 默认ID_MENU_SCOREPRINT 成绩打印(&P) 默认ID_SEPARATRO Separator- 其他(&Q) Pop_up其余默认4、 (如果要有提问对话框,你回答选择已存在的类,否则按以下步骤做)ViewàClassWizardàClassNameàCMa

30、inFrameà将上面的ID分别选中,并分别加COMMAND消息。这里我们仅选ID_MENU_SCOREIN映射COMMAND消息,并加如下代码:void CMainFrame:OnMenuScorein() AfxMessageBox(“现在就输入成绩吗?”); 5、在CMainFrame类(或其它类)加入WM_CONTEXTMENU消息处理函数,添加代码:void CMainFrame:OnContextMenu(CWnd *pWnd,CPoint point) CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU);/刚才加上的菜单资源 menu.

31、GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,point.x,point.y,this); 6、运行并测试,你在出现的应用程序窗口中,单击右键会出现你创建的菜单(快捷菜单)你再按成绩输入会出现已写好的“现在就输入成绩吗?”; 注意:若按“成绩打印菜单”有信息在窗口显示则: 在View.h里写:CString str; 将ID_MENU_SCOREPRINT映射到View中,在此函数中加: str=“你按了成绩打印菜单”; Invalidate(); 在OnDraw()里:pDC->TextOut(100,1

32、00,str);5.2工具栏工具栏是一系列工具按钮的组合,借助它们可以提高用户的工作效率。Visual C+6.0系统保存了每个工具栏相应的位图,其中包括所有按钮的图象,而所有的按钮图象具有相同的尺寸(15像素高,16像素宽),它们在位图中的排列次序与屏幕上的按钮在工具栏上的次序相同。使用工具栏编辑器(1)创建一个SDI单文档应用程序。(2)ResourceViewàToobaràIDR_MAINFRAMEà点最后一个空的工具栏à涂红色后à再双击出现属性对话框,ID处写:ID_TOOLBARà在prompt框内键入“向系统输入学生成绩

33、n成绩输入”(3)将ID_TOOLBAR映射到View视图类中,写:void CMainFrame:OnToolbar() / TODO: Add your command handler code hereMessageBox(“工具栏显示”);(4)编译运行(在状态拦上出现上面的字,鼠标放在工具拦上就出现一个成绩输入框)(5)建一个菜单项ResourceViewàMenuà双击IDR_MAINFRAMEà出现空白菜单à标题处写:和工具栏连用àID处写和工具栏的ID一样的ID即:ID_TOOLBAR这样运行à点这个菜单和点这个工具栏

34、的显示结果是一样的(工具栏和菜单相结合)。*(1)在工具栏中移动一个按钮(2)消失一个按钮(删除)(3)复制一个按钮 (4)按钮前插入一个空格(5)按钮后插入空格(6)按钮前后空格消失 见232页“工具栏按钮属性”对话框的各项含义:ID 工具栏按钮的标识符,可以输入自己的标识符名称,也可从ID的下拉列表中选取标识符名称Width(宽) 工具栏按钮的像素宽度Height(高) 工具栏按钮的像素高度Prompt(提示) 工具栏按钮提示文本:若为“建立新文档n新建”,则表示将鼠标指向该按钮时,在状态栏中显示“建立新文档”,而在弹出的提示信息中出现“新建”字样。”n”是它们的分割转义符。多个工具栏的使

35、用 实际应用中,常常需要多个工具栏,下面来讨论多个工具栏的创建、显示和隐藏,以及多个工具栏和菜单之间的联动操作等。例:使用多个工具栏(1)添加并更改应用程序菜单1)创建一个单文档应用程序2)按快捷键Ctrl+R(或InsertàResourceà在资源类型中选中Menu(233页5.16所示)3)单击“New”按钮,便在右边出现一个空菜单,系统给的默认ID为IDR_MENU1 如书234页图5.174)不做(书只是说明)5)、6)、按书233页做7)CMenu m_NewMenu;8)void CMainFrame:OnViewTest() / TODO: Add your

36、 command handler code herem_NewMenu.Detach();/使菜单对象和菜单句柄分离.m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);/清除应用程序菜单SetMenu(&m_NewMenu);/设置应用程序菜单void CMainFrame:OnTestReturn() / TODO: Add your command handler code herem_NewMenu.Detach();/使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(IDR_MAINFRAME);SetMenu(NULL);S

37、etMenu(&m_NewMenu);9)编译运行:查看à显示测试菜单à在上面出现“测试”à测试à返回à又回到原菜单。(2)添加并设计工具栏按钮按书235页做 1)、2)、3)、4)、5)(3)添加工具栏1)、2)、3)、4)5)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_I

38、DW_TOOLBAR+10); if(!nRes|!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)TRACE0("Failed to create toolbarn");return -1;m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndTestBar);程序中的代码:Create(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS

39、_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR+10);第一个参数用于指定工具栏所在的父窗口指针(this表示当前的CMainFrame类窗口指针)第二个参数用于指定工具按钮的风格(TBSTYLE_FLAT表示工具按钮是“平面”的)第三个参数用于指针工具栏的风格,由于这里的工具栏是CMainFrame的子窗口,因此需要指定WS_CHILD|WS_VISIBLE。CBRS_TOP表示工具栏放置在父窗口的顶部,CBRS_GRIPPER表示工具栏前面有一个“把手”CBRS_TOOLTIPS表示允许有工具提示CBRS_FLYBY表示在状态栏显示工具提示文本CB

40、RS_SIZE_DYNAMIC表示工具栏在浮动时,其大小是可以动态改变的第四个参数用于指定工具栏四周的边框大小,一般都为0(如:CRect(0,0,0,0))最后一个参数用于指定工具栏这个子窗口的标识ID(与工具栏资源标识不同)if语句中的LoadToolBar函数用于装载工具栏资源。若CreateEx或 LoadToolBar的返回值为0,既调用不成功,则显示诊断信息“Failed to create toolbar”。TRACEO是一个用于程序调试的跟踪宏OnCreate函数返回-1时,主框架窗口被清除。应用程序中的工具栏一般具有停靠或浮动性:m_wndTestBar.EnableDock

41、ing使得m_wndTestBar对象可以停靠,CBRS_ALIGN_ANY表示可以停靠在窗口的任一边。EnableDocking(CBRS_ALIGN_ANY)调用的是CFrameWnd类的成员函数,用于让工具栏或其它控制条在主框架窗口可以进行停靠操作。DockControlBar也是CFrameWnd类的成员函数,用于将指定的工具栏或其他控制条进行停靠。说明:AFX_IDW_TOOLBAR是系统内部的工具栏子窗口标识,并将AFX_IDW_TOOLBAR+1的值表示默认的状态栏子窗口标识。如果在创建新的工具栏时没有指定相应的子窗口标识,则会使用默认的AFX_IDM_TOOLBAR。这样,当打

42、开“查看”菜单,单击“工具栏”菜单时,显示或隐藏的工具栏不是原来的工具栏,而是新添加的工具栏。为此,需要重新指定工具栏子窗口的标识,并使其值等于AFX_IDW_TOOLBAR+10(4)完善程序代码1) 见书2)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)ShowControlBar(&m_wndTestBar,FALSE,FALSE);/关闭测试工具栏Return 0;说明:ShowControlBar函数有3个参数,第1个参数用于指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐

43、藏,第3个参数用于表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。3)void CMainFrame:OnViewTest() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/关闭测试工具栏ShowControlBar(&m_wndToolBar,TRUE,FALSE);/显示主工具栏void CMainFrame:OnTestReturn() ShowControlBar(&m_wndTestBar,FALSE,FALSE);/关闭测试工具栏 ShowControlBar(&m_wndToolBar,TRUE,

44、FALSE);/显示主工具栏4)编译运行:结果见238页图5.25所示5.3状态栏 状态栏是一条水平长条,位于应用程序的主窗口的底部,它可以分割成几个窗格,用来显示多组信息。应用程序往往需要把当前的状态信息或提示信息告诉用户,虽然其他窗口(如窗口的标题栏上、提示窗口等)也可显示文本,但它们的功能比较有限,而状态栏能很好地满足应用程序显示信息的需求。 状态栏的定义在MFC AppWizard创建的SDI或MDI应用程序框架的MainFrm.cpp文件中有一个静态数组indicators数组,它被MFC用做状态栏的定义(见239页图5.26为indicator数组元素与标准状态栏窗口的关系)。这个

45、数组中的元素是一些标识常量或是字串资源的ID标识符。默认的indicators数组包含了4个元素,它们是:ID_SEPARATOR 是用于标识信息行窗格的,菜单项或工具栏按钮的许多信息都在这个信息行窗格中显示。ID_INDICATOR_CAPS 是用于标识指示器窗格显示出CapsLock键的状态(大写)ID_INDICATOR_NUM 是用于标识指示器窗格显示出NumLock键状态(数字)ID_INDICATOR_SCRL 是用于标识指示器窗格显示出ScrollLock键的状态(小写)状态栏的常用操作Visual C+6.0中可以方便地对状态栏进行操作,如增加窗格、减少窗格、在状态栏中显示文本

46、、改变状态栏的风格 大小等,并且MFC的CStatusBar类封装了状态栏的大部分操作。1、增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格2类。(1)若在状态栏中增加一个信息行窗格,则只需要在indicators数组的适当位置增加一个ID_SEPARATOR标识即可;(2)若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。(3)若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素即可。2、在状态栏上显示文本(1)调用CWnd:SetWindowText更

47、新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar显示为m_wndStatusBar。SetWindowText(“消息”)语句将在信息行窗格(或窗格0)内显示”消息”字样。(2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。(3)调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本,此函数原型描述如下: BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bU

48、pdate=TRUE);其中:nIndex是表示设置的窗格索引(第1个窗格的索引为0) lpszNewText表示要显示的字符串,若bUpdate为TRUE,则系统自动更新显示的结果注意:在使用第2种方法时,应按一定的步骤进行,例如: 例 1:在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。按书239页做第4步:void CNnView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; /获得主窗口指针 CSt

49、atusBar *pStatus=&pFrame->m_wndStatusBar; /获得主窗口中的状态栏指针 if(pStatus) str.Format("X=%d,Y=%d",point.x,point.y);/格式化文本 pStatus->SetPaneText(1,str);/更新第2个窗格的文本 第5步:将MainFrm.h文件中的受保护变量m_wndStatusBar变为公共变量第6步:在View.cpp视图类的最上面写:#include “MainFrm.h”结果见书240页图5.27所示3、改变状态栏的风格 在MFC的CStatusBa

50、r类中,有2个成员函数可以改变状态栏风格,他们是:void SetPaneInfo(int nIndex,UINT nID,UINT nStyle,int cxWidth);viod SetPaneStyle(int nIndex,UINT nStyle);其中,参数nIndex表示要设置的状态栏窗格的索引,nID用于为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用于指定窗格的外观,例如:SBPS_POPOUT表示窗格是凸起来的,状态栏窗格的风格类型如下:风格类型 含义SBPS_NOBORDERS 窗口周围没有3D边框SBPS_POPOUT 反显边

51、界以使文字“凸出来”SBPS_DISABLED 禁用窗格,不显示文本SBPS_STRETCH 拉伸窗格,并填充窗格不用的空白空间。但状态栏只能有一个窗格具有这种风格SBPS_NORMAL 普通风格,它没有”拉伸”,”3D边框”或”凸出来”等特性在上面的OnMouseMove(UINT nFlags, CPoint point)里加:pStatus->SetPaneStyle(1,SBPS_POPOUT);(见241页)str.Format("X=%d,Y=%d",point.x,point.y);/格式化文本 pStatus->SetPaneText(1,str

52、);/更新第2个窗格的文本见窗格就鼓起来了,如241页图5.28所示例 2:在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。(1)建一个单文档的应用程序(2)将项目工作区窗口切换到ResourceView页面,双击”String Table”项的“String Table”图标,则在主界面的右边出现字符串编辑器。在字符串列表的最后一行的空项上双击鼠标左键,弹出一个对话框如下图2所示: 图2:(3)在该对话框中,用户可以指定相应的ID和字符串值,这里加入2个字符串资源ID_LEFT和ID_RIGHT,其字符的多少决定窗格的大小,其结果如下图: 图 3 :添加的字符串资源(4)打开Ma

53、inFrm.cpp文件,将原先的indicators数组修改如下:static UINT indicators =ID_SEPARATOR, / 第一个信息行窗格 ID_SEPARATOR, / 第二个信息行窗格 ID_LEFT, / 第三个窗格 ID_RIGHT, / 第四个窗格;(5)由于ClassWizard不能组织相应的命令更新消息的映射,用户必须手工添加消息处理函数原型。打开View.h文件,在AFX_MSG内增加消息处理语句,ClassWizard以后允许用户访问和编辑该代码。protected:/AFX_MSG(CQqView)/ NOTE - the ClassWizard w

54、ill add and remove member functions here.afx_msg void OnUpdateXY(CCmdUI *pCmdUI);/ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSG注意:CCmdUI 类:其数据成员:m_nID用户界面元素对象的ID,m_nIndex用户界面(6)打开View.cpp文件,在其消息入口处添加消息映射函数BEGIN_MESSAGE_MAP(CQqView, CView)/AFX_MSG_MAP(CQqView)/ NOTE - the ClassWizard will add and remove mapping macros here. ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY) ON_UPDATE_COMMAND_UI(ID_RIGHT,OnUpdateXY)/ DO NOT EDIT

温馨提示

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

评论

0/150

提交评论