




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章菜单、工具栏和状态栏,主讲:吕骏,2,菜单,菜单是应用程序中常用的用于交互操作的界面工具之一,它能够将一个应用程序的功能有效地按类组织,并以列表的方式显示出来,方便用户操作。常见的菜单可分为三类:主菜单、弹出菜单和快捷菜单1.主菜单指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。主菜单的PopUp属性为True,主菜单只有显示弹出菜单的能力,没有执行的能力(没有ID,不能添加事件处理函数),2.弹出菜单指选择主菜单或一个菜单项时弹出的子菜单。3.快捷菜单当右击某个界面对象时,通常会弹出快捷菜单,它出现在鼠标箭头的位置,快速展示当前对象可用的命令功能。,3,4,主菜单,弹出菜单,快捷菜单,菜单项,对于菜单的显示都遵循下列一些规则:若点击某菜单项会弹出一对话框,那么在该菜单项文本后有“”。若某项菜单有子菜单,那么在该菜单项文本后有“”。菜单项需要助记符,用括号将带下划线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。任何时候按下快捷键,相应的菜单命令都会被执行。,创建菜单在系统自动生成的菜单资源中添加一个主菜单命令IDR_MAINFRAME菜单是MFCAppWizard的单文档应用程序自动创建的一个默认的主菜单。双击该菜单资源名称,可以打开菜单编辑器。在菜单编辑器中,为程序添加自己的菜单命令,7,菜单属性,标题,是否被选中,是否为灰色,是否可选,是否弹出子菜单,ID标号,提示信息,是否为分割线,ID(菜单命令的ID)ID_顶层菜单名_下一级菜单名(_再下一级菜单名)Caption(菜单命令的名称)快捷键设置在菜单标题中相应的字母前输入“,16,同样的方法可以添加矩形的消息响应函数。运行界面如下:,17,消息映射从代码上来看,对应着3个部分的代码:在响应这个菜单命令的类的声明中添加一个响应函数的声明afx_msgvoidOnLine();在该类的实现文件中,在这个类的消息映射表中添加这个菜单的映射宏ON_COMMAND(ID_LINE,因此,也可以不使用类向导,自己添加上述三部分代码,完成同样的功能。,18,加速键用于实现对快捷键的设置。,19,为程序MyMenu中添加的两个菜单项添加加速键。打开加速键列表在“资源视图”中双击“Accelerator”文件夹下的“IDR_MAINFRAME”,打开加速键列表。编辑加速键资源三个菜单的加速键资源如图所示。当按下键盘上的“Alt+Shift+L”和“Alt+Shift+R”时,就相当于选择了“画图”子菜单下的“直线”和“矩形”菜单项。,这与在编辑菜单项名称时所写的“获取菜单项数目失败时,函数返回值为-1。5.获取菜单ID号UINTCmenu:GetMenuItemID(intnPos)const;GetMenuItemID()方法根据菜单项的位置返回菜单ID,如果该菜单项对应一个弹出菜单,则返回值为-1,如果该菜单项是一个分隔条,则返回值为0。nPos:标识菜单项的位置,第一个菜单项为0。,25,6.对菜单项属性的修改voidCCmdUI:SetCheck(intnCheck1=1);设定菜单项是否被选中,nCheck1=1为选中,0为未选中。voidCCmdUI:Enable(BOOLbOn=TRUE);设定菜单项是否可选,bOn=1为可选,0为不可选(呈灰色),26,7.显示快捷菜单BOOLCMenu:TrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);nFlags:表示菜单在屏幕显示的位置以及鼠标按钮标志.x:菜单的水平坐标;y:菜单的垂直坐标;pWnd:标识显示快捷菜单的窗口,此窗口将收到此快捷菜单全部的WM_COMMAND消息;lpRect:一个RECT结构或CRect对象指针,表示一个矩形区域,用户单击这个区域时,快捷菜单不消失。当lpRect为NULL时,表示用户单击在菜单外面时,菜单会立即消失。,一般情况下,菜单项都不止一种状态。例如,在没有选择任何内容时,Edit菜单下的Copy、Cut等菜单项是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。MFC通过消息映射机制和CCmdUI类更新菜单项的显示。,28,为菜单项添加消息响应函数时,如果选择一个菜单ID,在Messages列表框中就会出现以下两项:COMMANDUPDATE_COMMAND_UI其中UPDATE_COMMAND_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。CCmdUI的成员函数:,29,为程序添加更新用户界面的消息处理函数,使得用户在选择某一菜单项后,为此菜单项添加复选标记,同时设置为无效状态,表示不可再选此项。记录用户当前选择的菜单项在CMainFrame类中添加一个成员变量inttype;在类的初始化函数中赋初值为0,即type=0;在OnLine()函数中将其设置为1,即type=1;在OnRectangle()函数中将其设置为2,即type=2;建立菜单的ON_UPDATA_COMMAND_UI消息映射,30,为菜单的消息处理函数添加代码voidCMainFrame:OnUpdateLine(CCmdUI*pCmdUI)pCmdUI-SetCheck(0);if(type=1)pCmdUI-SetCheck(1);pCmdUI-Enable(FALSE);,31,运行程序,选择矩形菜单,点击了弹出对话框的“确定”按钮,再单击“画图”菜单项的状态,32,我们平时在使用程序时,经常会用到单击鼠标右键显示的快捷菜单,也称为上下文菜单,或右键菜单。显示快捷菜单需要使用CMenu:TrackPopupMenu()函数CMenu:TrackPopupMenu函数的原型为:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);该函数的功能是显示一个右键快捷菜单。其中,nflags表示屏幕位置标志。x、y分别表示菜单的水平坐标和顶端的垂直坐标;pWnd表示弹出菜单的窗口,包括全部的WM_COMMAND消息;lpRect表示一个矩形域,当单击这个矩形域时菜单不消失。,33,34,参数nflags的含义,为程序添加一个快捷菜单,显示“画图”菜单对应的弹出菜单添加菜单资源在项目工作区窗口中选择“资源视图”,在“Menu”项目上单击鼠标右键,选择“插入Menu”,向应用程序添加一个新的菜单资源,缺省的ID号为IDR_MENU1,编辑菜单。为该菜单资源中的顶层菜单的第一项加一任意标题(实际上该标题无用),在此菜单项下依次添加菜单项设置“直线”和“矩形”菜单项的ID与IDR_MAINFRAME中相应的菜单相同,也可以在ID的下拉列表框中,分别选择“ID_LINE”和“ID_RECTANGLE”。,35,建立消息映射,编辑响应函数快捷菜单通常都不涉及这样的操作,因为快捷菜单中显示的菜单项在程序的主菜单中都可以找到,只要在第一步中,将快捷菜单中菜单项的ID选为主菜单中相应菜单项的ID即可,这样就将快捷菜单中的菜单项就与主菜单中相应的菜单项关联到同一响应函数了。在CVIEW类中加入WM_CONTEXTMENU消息的处理函数选择“Cview”类的“消息窗口”,建立“WM_CONTEXTMENU”消息的响应函数“OnContextMenu”。,36,编辑WM_CONTEXTMENU消息处理函数编辑OnContextMenu函数如下,因为函数中要用到参数point,故要去掉其注释:CMenumenu;menu.LoadMenuW(IDR_MENU1);menu.GetSubMenu(0)-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd();,37,38,运行程序,界面如下,编程方法给系统菜单添加一个菜单项例向应用系统菜单中添加一个菜单项。(1)打开一个单文档应用程序项目,若没有可按前面提及的方法进行创建。(2)选择资源中的StringTable。(3)单击New,在Name框中,可以指定一个用于菜单项的ID号,输入“ID_NEW_MENUITEM”。在Value框中,可以定义该ID的值,选择默认的ID值101,单击OK按钮,caption输入“新建菜单项”。,StringTable也称为串表,用于实现对字符串资源的ID和Caption等的设置。,40,(4)在CMainFrame:OnCreate函数体(或自定义的函数)中加入代码:.CMenu*pSysMenu=GetMenu();/获得主菜单句柄CMenu*pSubMenu=pSysMenu-GetSubMenu(1);/获得第二个子菜单的句柄CStringStrMenuItem(新的菜单项);pSubMenu-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();/更新菜单return0;,(5)使用ClassWizard处理OnCommand消息并检测用户菜单的nID参数。(在虚函数中找)BOOLCMainFrame:OnCommand(WPARAMwParam,LPARAMlParam)/wParam的低字节表示菜单、控件、加速键的命令IDif(LOWORD(wParam)=ID_NEW_MENUITEM)MessageBox(_T(你选中了新的菜单项“);returntrue;CFrameWnd:OnCommand(wParam,lParam);,从第四章可知,利用MFC向导可以生成基于对话框的应用程序,利用向导生成的对话框应用程序是没有菜单的,虽然我们也可以为应用程序添加菜单资源,但编辑好的菜单资源在程序运行时并不显示。这时只要打开该对话框的“属性”页,将“Menu”属性值设置为所添加的菜单资源的ID即可。,43,通常步骤:在资源视图中,右键点击.rc文件(资源文件),选择AddResource,选择Menu新建一个菜单。添加相关的菜单项及属性设置。在主对话框属性中Menu属性中添加新建的菜单ID。为菜单项添加在主对话框类的消息响应函数。,44,例建立一个基于对话框的应用程序,为程序的对话框添加菜单资源,所添加的菜单是在前面练习过的有两个菜单项的“画图”菜单,每个菜单项的功能也同前。建立基于对话框的应用程序MyDialogMenu编辑菜单资源IDM_MENU1将菜单与对话框相关联,45,添加菜单ID,建立菜单项的消息映射编辑消息处理函数,46,工具栏,在MFC中,工具栏的功能由类CToolBar实现。工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的方法有两种:使用ResourceView视图中自带的工具栏进行创建。添加自定义工具栏,47,工具栏概述,系统默认生成的工具栏资源为IDR_MAINFRAME_256,可以在此基础上设计自己的工具栏,删除或添加一些按钮。需要为工具栏按钮提供ID号,一般取某个菜单项的ID。编程时,菜单、快捷键、工具栏资源往往配合使用。具有相同ID号的菜单项、工具栏按钮、快捷键被用户操作后,会产生相同的命令消息,只需要进行一次消息映射。,工具栏的基本操作,添加按钮双击工具条上的空白按钮或单击空白按钮后,绘制新的按钮。删除按钮将按钮拖出工具栏外,即可删除该按钮。移动按钮鼠标选中按钮,按住鼠标不动,移动到指定位置上,松开鼠标。需要注意的是,按Delete键并不能删除该按钮,只是将其中的图形以背景色填充。在工具栏中插入空格,49,工具栏按钮属性的设置。,50,例打开单文档应用程序MyMenu,为其添加工具栏按钮。具体步骤如下:打开单文档应用程序MyMenu编辑工具栏资源编辑“直线”和“矩形”菜单项对应的工具栏按钮,将工具栏按钮的ID与菜单项的ID分别对应。,51,工具栏的操作,52,编辑工具栏使用工具栏编辑器来编辑工具栏资源。双击ResourceView视图中的Toolbar工具栏资源,即可打开工具栏编辑器。,绘图编辑器,颜色选择,属性,状态栏,状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。状态栏可以分为两部分,其中左边最长的那部分称为提示行,当我们把鼠标移动到某个菜单项或工具按钮上时,该部分将显示相应的提示信息。,53,用AppWizard创建的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在MainFrm.cpp文件中定义的,被MFC用作状态栏的定义。,状态栏的常用操作增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识;若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素。,在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:(1)调用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样。(2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。(3)调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);,例在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。(1)将前面的单文档应用程序打开或重新创建;(2)将项目工作区窗口切换到ResourceView页面,双击“StringTable”项的“StringTable”图标。在字符串列表的最后一行空项上双击鼠标左键,如图:(3)该对话框中,可以指定相应的ID和字符串值,这里加入两个字符串资源ID_LEFT和ID_RIGHT,其字符的多少决定窗格的大小。如图:,(4)打开MainFrm.cpp文件,将原先的indicators数组修改如下:staticUINTindicators=ID_SEPARATOR,/第一个信息行窗格ID_SEPARATOR,/第二个信息行窗格ID_LEFT,/第三个窗格ID_RIGHT,/第四个窗格;(5)必须手工添加消息处理函数原型。打开mymenuView.h文件,在AFX_MSG内增加消息处理语句,ClassWizard以后允许访问和编辑该代码。protected:/AFX_MSG(CEx_SdiView)afx_msgvoidOnUpdateXY(CCmdUI*pCmdUI);/AFX_MSGDECLARE_MESSAGE_MAP(),(6)打开mymenuView.cpp文件,在其消息入口处添加消息映射函数:BEGIN_MESSAGE_MAP(CEx_SdiView,CView)/AFX_MSG_MAP(CEx_SdiView)ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY)ON_UPDATE_COMMAND_UI(ID_RIGHT,OnUpdateXY)/AFX_MSG_MAP(7)增加修改状态栏指示器的消息映射函数代码,状态栏的窗格需要更
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年燃气储运中级工考试预测题及解析
- 工作总结及个人成长报告
- 五一银行活动方案
- 田青蛙动态课件
- steam课件电信教学
- 用药安全知识培训材料课件
- 制作表格直播教学课件
- 人教版九年级英语期中基础复习卷(B卷)(含答案无听力音频及原文)
- 黑龙江省绥化市北林区2024-2025学年八年级下学期期末语文试题(含答案)
- 第三单元 勇担社会责任 单元检测题(含答案)-2025-2026学年 八年级上册道德与法治 - 副本
- 端子铆压标准规范
- csc服务分包考试
- 高级(三级)育婴师理论试题-附答案
- YY 0271.1-2016牙科学水基水门汀第1部分:粉/液酸碱水门汀
- GB/T 30146-2013公共安全业务连续性管理体系要求
- GB 1886.232-2016食品安全国家标准食品添加剂羧甲基纤维素钠
- 地理信息系统技术概述课件
- 美育PPT精选文档课件
- 医院介入手术病人护送交接流程
- 农机职业技能竞赛农机修理工理论题库
- 食品物流学:食品配送课件
评论
0/150
提交评论