第6章 菜单、工具栏和状态栏.ppt
《第6章 菜单、工具栏和状态栏.ppt》由会员分享,可在线阅读,更多相关《第6章 菜单、工具栏和状态栏.ppt(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、返回返回第六章 菜单、工具栏和状态栏 本章导本章导读读 掌握菜单的创建步骤和方法,如何进行命令消息的映射和编写相应的程序代码。掌握CMenu类及其常用成员函数的功能和使用方法,掌握利用这些成员函数创建快捷菜单和实现动态增加或减少菜单项。掌握工具栏的创建方法和步骤,如何将工具栏的功能与菜单的功能相对应。掌握创建状态栏的方法和步骤。学习和掌握CMenu类、CStatusBar类、CToolBar类、CCmdUI类及常用成员函数的功能和使用。菜单、工具栏和状态栏是Windows应用程序中最重要的三个用户界面元素,是应用程序设计中不可缺少的步骤。1返回返回6.1创建菜单菜单是一系列命令的列表,是最常用
2、的命令输入方式。在Windows中,几乎所有的命令操作都与菜单有关。Windows应用程序中的菜单是按照一定层次来进行组织的,包括菜单项和弹出菜单,其中弹出菜单又可以包括菜单项和其他的弹出菜单。1.创建菜单资源创建菜单资源菜单中的每一个菜单项都由菜单项名和命令ID号两个基本要素组成。在菜单资源中,每个菜单项都必须有一个唯一的命令ID号来对它进行标识,这个ID号是系统在对菜单项进行识别时使用的。对于用户而言,菜单项的标识是利用它所属的弹出菜单和菜单项的句子来标识的,比如ID_FILE_OPEN,其所属的弹出菜单是【文件】,菜单项名称为【打开】。2返回返回创建菜单可以有几种方法,最简单的方法是用菜
3、单资源编辑器进行设计。在这里,我们把第五章关于模式对话框的例子进行改造,使对话框的弹出方式由在窗口中双击鼠标改为由单击某个菜单命令实现。具体步骤如下:步骤一:在VisualC+6.0中,选【File】菜单中的【OpenWorkspace】菜单项,打开已创建的“Dialog.dsw”文件。步骤二:在工作区窗口中选择【ResourceView】选项卡,展开【DialogResources】目录,再展开【Menu】文件,将会看到菜单IDR_MAINFRAME。步骤三:双击IDR_MAINFRAME,将在菜单资源编辑器中打开菜单资源。步骤四:在主菜单中增加一个【显示】菜单。用鼠标双击主菜单最右边的空菜
4、单项,或者用鼠标右击,在弹出的快捷菜单中选择【Properties】菜单项。系统将弹出属性对话框。3返回返回在【Caption】栏中输入“显示(&P)”,括号中的&P表示紧跟在它后面的字母“P”是助记符,这样,在程序运行过程中,就可以用Alt+P键来激活【显示】菜单。按【Enter】键继续。这时,在主菜单中将增加一个“显示”菜单,在助记符P下面有下划线。同时,在生成的菜单的右面和下面各出现一个新的菜单或菜单项,可以继续添加新的菜单或菜单项。步骤五:在【显示】菜单中增加一个【个人资料】菜单项。用鼠标右键单击【显示】菜单中的空菜单项,在弹出菜单中选择【Properties】选项。单击属性对话框左上
5、角的“图钉”按钮,把对话框“钉”在屏幕上。在属性对话框的【Caption】栏中输入“个人资料(&D)”。4返回返回对于【个人资料】菜单项,VisualC+6.0将为该菜单项自动分配一个ID号。单击其他菜单项或者屏幕的其他部分,再选中【个人资料】菜单项,系统在【ID】栏中显示 出 为 该 菜 单 项 分 配 的 ID号,其 一 般 格 式 为MENUITEMxxxxx(xxxxx代表一个整数)。【Prompt】框中的文本是光标处于菜单项时,状态栏显示的帮助信息在菜单项属性对话框的【General】选项卡中,各选项的含义如下图所示。步骤六:用鼠标左键按住【显示】菜单,将其拖到【编辑】与【帮助】菜单
6、中间。这样,利用菜单资源编辑器,我们就很轻松地创建了一个标准的Windows菜单。5返回返回项目含义IDCaptionSeparatorCheckedPop_upGrayedInactiveHelpBreakPrompt菜单的资源ID号菜单项的标题文本,当其中某一字母的前面含有&符号时,则该字母与Alt键构成组合键选中时,则相应的菜单项是一个分隔符或一条水平线选中时,则相应的菜单项前显示一个选中标记“”选中时,表示该菜单项含有弹出式子菜单选中时,表示该菜单项呈灰色显示,该菜单项被禁用选中时,表示该菜单项没有被激活,用户不能选用选中时,表示该菜单项在程序运行时被放于顶层菜单的最右端其默认值为No
7、ne,表示菜单项按常规形式显示。该项的取值还可为Column或Bar,指明当光标移到该菜单项时在状态栏上显示的提示表6.1菜单General属性对话框的各项含义6返回返回2.建立快捷键建立快捷键在Windows应用程序中的某些菜单项后面有一个组合键,表示一个快捷键(shortcutkey),在程序运行过程中,如果用户按下了该组合键,则相应的菜单命令就会被执行。当然,若要使用快捷键选择某个菜单项,就必须事先对其作出定义。现在我们来为刚才创建的菜单添加快捷键,具体步骤如下:步骤一:在工作区窗口的【ResourceView】选项卡中,双击【Accelerator】文件夹,双击IDR_MAINFRAM
8、E,则系统会弹出一个加速器表。步骤二:在加速器表中浏览一下,发现Ctrl+D还没有被使用,我们就把Ctrl+D设置为菜单项【个人资料】的快捷键。方法是双击加速器表末尾的空行,将弹出快捷键的属性对话框(AccelProperties)。7返回返回 在属性对话框(Accel Properties)中,各项的含义如表6.2所示。表6.2 Accel Properties对话框中各选项的含义选项 含义 IDModifiersTypeKeyNext Key Typed 为了能使设定的快捷键与某个菜单项的功能相对应,从中选择所需的菜单资源ID号用来选择Ctrl、Alt、Shift键是否为快捷键的组成键用来
9、确定快捷键的值是虚拟键(VirKey)还是ASCII是指启动快捷键的键盘按键单击此按钮时,用户所按的任何按键将成为快捷键的键值 8返回返回步骤三:在对话框中的【ID】下拉列表中选择【ID_DISPLAY_DATA】选项,当选中ID号时,【ID】框中同 时 显 示 出 此 ID号 对 应 的 整 数,如ID_DISPLAY_DATA=32771。步 骤 四:在【Key】列 表 框 中 输 入“D”,确 认【Modifiers】栏中的【Ctrl】复选框被选中,而且【Alt】和【Shift】都未被选中;或者,直接单击【NextKeyTyped】按钮,按下Ctrl+D组合键放开,此时系统会自动记录所按
10、下的Ctrl+D键为所要设定的组合键。按【Enter】键继续。步骤五:为了在【显示】菜单中提示【个人资料】菜单项的快捷键,可以返回6.1.1节中的步骤五,将【Caption】框中的内容修改为“个人资料(D)tCtrl+D”。这样,我们就建立了一个完整的菜单资源。9返回返回3 菜单功能的实现菜单功能的实现在MFC框架中,菜单命令消息是按照一定的顺序进行传递的。对于一个单文档应用程序,消息传递的顺序为:视图类文档类框架类应用程序类。因此,如果我们在视图类和文档类中同时定义了某个菜单项的消息映射接口时,由于消息首先传递给视图类,在视图类中对此消息做出了响应,所以,文档类中定义的此菜单项的消息映射函数
11、就无法执行。在菜单资源中,我们定义了MFC如何来构造菜单的结构,同 时 还 指 定 了 菜 单 的 资 源 ID号,MFC通 过ClassWizard会自动把菜单和相应的框架窗口联系在一起。但除了由系统产生的少量代码外,MFC不能自动地对程序的菜单项进行响应,必须用手工实现。10返回返回对 于 每 个 菜 单 项,系 统 提 供 了 COMMAND和UPDATE_COMMAND_UI两种消息可供选择:(1)COMMAND消息需要用户的干预,如单击、双击等操作;(2)UPDATE_COMMAND_UI消息系统会自动进行响应,通过它可以实现对菜单项外观的动态管理。例如,设计人员可以使菜单有效、无效
12、或给菜单项动态添加检查标记等。可以利用ClassWizard同时设置这两种消息,但是在实际编程中,必须为每个菜单项提供有关WM_COMMAND类型消息映射接口。下面,我们在视图类中对前面已建立的“个人资料(&D)”菜单项的消息做出响应。具体步骤如下:11返回返回步骤一:选择【View】菜单中的【ClassWizard】菜单项,弹出【MFCClassWizard】对话框。步骤二:在【MFC ClassWizard】对话框中,选择【MessageMaps】选项卡。在【Classname】下拉列表框中,选择类CDialogView;在【Object Ids】中单击选择ID_DISPLAY_DATA选
13、项;在【Messages】栏中将出现COMMAND和UPDATE_COMMAND_UI两个选项,选中其中的COMMAND。步骤三:单击对话框右侧的【AddFunction】按钮,系统将会弹出【AddMemberfunction】对话框。系统将自动生成一个缺省名称为OnDisplayData的映射函数亦可另取别的名称,在此取缺省名称,单击【OK】按钮继续。步骤四:单击【EditCode】按钮退出【MFCClassWizard】对话框,并编辑新增加的函数OnDisplayData。12返回返回经过以上操作完成后,VisualC+会对程序中的一些程序文件的代码进行必要的修改,其中粗体部分的代码是由C
14、lassWizard自动添加的代码。1.在CDialogView类的定义文件DialogView.h中的消息映射部分将会改变为:/Generatedmessagemapfunctionsprotected:/AFX_MSG(CDialogView)afx_msgvoidOnLButtonDblClk(UINTnFlags,CPointpoint);afx_msg void OnDisplayData();/ClassWizard自动添加的自动添加的/AFX_MSGDECLARE_MESSAGE_MAP();13返回返回其中:/AFX_MSG(CDialogView)/AFX_MSG是Class
15、Wizard分别用来识别命令消息处理函数定义的起始标记和结束标记,在AFX_MSG(CDialogView)后面括号内的CDialogView表示是处理该消息的类。2.在CDialogView类的实现文件DialogView.cpp中的消息映射部分也进行了一些修改:BEGIN_MESSAGE_MAP(CDialogView,CView)/AFX_MSG_MAP(CDialogView)14返回返回ON_WM_LBUTTONDBLCLK()ON_COMMAND(ID_DISPLAY_DATA,OnDisplayData)/ClassWizard自动添加的自动添加的/AFX_MSG_MAPEND_
16、MESSAGE_MAP()其中:/AFX_MSG_MAP(CDialogView)/AFX_MSG_MAP是ClassWizard标识命令消息处理映射机制的起始标记和结束标记。15返回返回3.在DialogView.cpp文件中编写OnDisplayData函数的代码。把 DialogView.cpp文 件 中 响 应 双 击 窗 口 的 函 数 OnLButtonDBLCLK()的代码复制到OnDisplayData()函数中,具体代码如下:voidCDialogView:OnDisplayData()/TODO:AddyourcommandhandlercodehereCMydataDia
17、log dlg;dlg.m_radio_m=0;dlg.m_edit_name=;CString msg;if(dlg.DoModal()=IDOK)msg=按钮被按下!按钮被按下!;Else msg=按钮被按下!按钮被按下!;16返回返回msg+=rn;msg+=姓名:姓名:;msg+=dlg.m_edit_name;msg+=rn;msg+=性别:性别:;switch(dlg.m_radio_m)case 0:msg+=男男;break;case 1:msg+=女女;break;msg+=rn;msg+=最高学历:最高学历:;msg+=dlg.m_combo_school;msg+=rn;
18、msg+=爱好:爱好:;17返回返回if(dlg.m_check_art=TRUE)msg+=艺术艺术;if(dlg.m_check_music=TRUE)msg+=音乐音乐;if(dlg.m_check_sport=TRUE)msg+=体育体育;AfxMessageBox(msg);步骤五:编译运行并测试此应用程序。当选择【显示】菜单中的【个人资料】菜单项,或单击Ctrl+D键时,将弹出【个人资料】对话框,在对话框内可以进行各种设置,然后单击【确认】或【取消】按钮退出。可以看到其效果与双击应用程序窗口是一样的。18返回返回4.CMenu类及其常用成员函数介绍类及其常用成员函数介绍Visual
19、C+的MFC提供的菜单类Cmenu的对象可以用来表示各种Windows菜单,其中包括顶层菜单项及其相应的弹出式菜单。并且该类可以在程序运行时处理有关菜单的操作,如创建菜单、装入菜单、删除菜单项、获取或设置菜单项的状态等。创建菜单创建菜单CMenu类的成员函数CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,其函数原型如下:BOOLCreateMenu();/产生一个空菜单BOOLCreatePopupMenu();/产生一个空弹出式子菜单19返回返回装入菜单装入菜单CMenu类的成员函数LoadMenu可用来将菜单资源装入应用程序中,它的函数原型有两种,如下
20、所示:BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UNITnIDResource);其中:形参lpszResourceName表示菜单资源的名称,形参nIDResource为菜单资源的ID号。添加菜单项添加菜单项当菜单创建后,可以调用CMenu类提供的成员函数AppendMenu或InsertMenu来向菜单中添加一些菜单项,但每次添加时,函数AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu是在指定的位置处插入菜单项,并将后面的菜单项依次下移。它们的函数原型如下:20返回返回BOOLAppendMenu(UNIT
21、nFlags,UNITnIDNewItem,constCBitmap*pBmp);BOOLAppendMenu(UNITnFlags,UNITnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UNITnPosition,UNITnFlags,UNITnIDNewItem,constCBitmap*pBmp);BOOLInsertMenu(UNITnPosition,UNITnFlags,UNITnIDNewItem=0,LPCTSTRlpszNewItem=NULL);其中:形参nIDNewItem表示新增菜单项的资源ID号,形参lpsz
22、NewItem表示新增菜单项的标题内容,形参pBmp是新增菜单项的位图指针,形参nPosition表示新增菜单项要插入的菜单项的位置,nFlags表示要增加的菜单项的状态信息,其取值的不同会影响其他参数的含义,见表6.3。21返回返回nFlags的取值含义nPosition值nIDNewItem值lpszNewItem值MF_BYCOMMANDMF_BYPOSITIONMF_POPUPMF_SEPARATORMF_OWNERDRAWMF_STRINGMF_CHECKEDMF_UNCHECKEDMF_DISABLEDMF_ENABLEDMF_GRAYED菜单项以ID号来标识菜单项以位置来标识菜单
23、项有弹出式子菜单分隔线自画菜单项字符串标志设置菜单项的选中标记取消菜单项的选中标记禁用菜单项菜单项可用菜单项变灰菜单项资源ID菜单项的位置弹出式菜单句柄忽略忽略自画所需的数据字符串指针22返回返回注意:(1)当形参nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的位置,该位置为0时表示新菜单项插入到第一个菜单项,为1时表示新菜单项插入到第二个菜单项,当为-1时,表示新菜单项插入到菜单的末尾(2)在形参nFlags中,可以用按位或运算符“|”将某些取值组合起来,如:MF_CHECKED|MF_STRING等。但有些组合是不允许的,如:MF_DISABLED、MF_
24、ENABLED和MF_GRAYED等。(3)当利用以上函数向菜单中新增菜单后,不管菜单所在的窗口是否改变,都应调用CWnd类的成员函数CWnd:DrawMenuBar来更新菜单,函数DrawMenuBar的原型为:voidDrawMenuBar();23返回返回删除菜单项删除菜单项当要删除指定的菜单项时,可利用CMenu类的成员函数DeleteMenu来完成,该函数的原型为:BOOLDeleteMenu(UNITnPosition,UNITnFlags);其中:形参nPosition的值表示要删除的菜单项的位置,其值的选取要受到形参nFlags的取值的影响。当nFlags的取值为MF_BYCO
25、MMAND时,nPosition表示要删除的菜单项的ID号,而当nFlags的取值为MF_BYPOSITION时,nPosition表示要删除的菜单项的位置(第一个菜单项的位置为0,第二个菜单项的位置为1,)。注意:当调用DeleteMenu函数删除某个菜单项后,不管菜单所依附的窗口是否改变,也必须调用CWnd类的成员函数CWnd:DrawMenuBar来更新菜单。24返回返回获取菜单项获取菜单项可以利用CMenu类的以下三个成员函数分别获得菜单的项数、菜单项的ID号以及弹出式子菜单的句柄。(1)GetMenuItemCount函数该函数的原型为:UNITGetMenuItemCount()c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 菜单、工具栏和状态栏 菜单 工具栏 状态栏
限制150内