第5章菜单、工具栏和状态栏.ppt
《第5章菜单、工具栏和状态栏.ppt》由会员分享,可在线阅读,更多相关《第5章菜单、工具栏和状态栏.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章菜单、工具栏和状态栏主讲:吕骏主讲:吕骏2菜单菜单n菜单是应用程序中常用的用于交互操作的界面工具菜单是应用程序中常用的用于交互操作的界面工具之一,它能够将一个应用程序的功能有效地按类组之一,它能够将一个应用程序的功能有效地按类组织,并以列表的方式显示出来,方便用户操作。织,并以列表的方式显示出来,方便用户操作。n常见的菜单可分为三类:主菜单、弹出菜单和快捷常见的菜单可分为三类:主菜单、弹出菜单和快捷菜单菜单1.主菜单主菜单指出现在应用程序主窗口或最上层窗口的菜单。通指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。常对应有一个弹出菜单作为它的子菜单。主菜单的
2、主菜单的PopUp属性为属性为True,主菜单只有显示弹出,主菜单只有显示弹出菜单的能力,没有执行的能力(没有菜单的能力,没有执行的能力(没有ID,不能添加,不能添加事件处理函数)事件处理函数)2.弹出菜单弹出菜单指选择主菜单或一个菜单项时弹出的子菜单。指选择主菜单或一个菜单项时弹出的子菜单。3.快捷菜单快捷菜单当当右右击击某某个个界界面面对对象象时时,通通常常会会弹弹出出快快捷捷菜菜单单,它它出出现现在在鼠鼠标标箭箭头头的的位位置置,快快速速展展示示当当前前对对象象可可用用的的命命令功能。令功能。34主菜单弹出菜单快捷菜单菜单项对于菜单的显示都遵循下列一些规则:对于菜单的显示都遵循下列一些规
3、则:若点击某菜单项会弹出一对话框,那么在该菜单项文本后有若点击某菜单项会弹出一对话框,那么在该菜单项文本后有“”。若某项菜单有子菜单,那么在该菜单项文本后有若某项菜单有子菜单,那么在该菜单项文本后有“”。菜单项需要助记符,用括号将带下划线的字母括起来。助记菜单项需要助记符,用括号将带下划线的字母括起来。助记符与符与Alt构成一个组合键,当按住构成一个组合键,当按住“Alt”键不放,再敲击该键不放,再敲击该字母时,对应的菜单项就会被选中。字母时,对应的菜单项就会被选中。若某项菜单需要快捷键的支持,则一般将其列在相应菜单项若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。任何时候按下快
4、捷键,相应的菜单命令都会被执文本之后。任何时候按下快捷键,相应的菜单命令都会被执行。行。n创建菜单创建菜单n在系统自动生成的菜单资源中添加一个主菜在系统自动生成的菜单资源中添加一个主菜单命令单命令nIDR_MAINFRAME菜单是菜单是MFCAppWizard的的单文档应用程序自动创建的一个默认的主菜单。单文档应用程序自动创建的一个默认的主菜单。n双击该菜单资源名称,可以打开菜单编辑器。双击该菜单资源名称,可以打开菜单编辑器。n在菜单编辑器中,为程序添加自己的菜单命令在菜单编辑器中,为程序添加自己的菜单命令7菜单属性菜单属性标题标题是否被选中是否被选中是否为灰色是否为灰色是否可选是否可选是否弹
5、出子菜单是否弹出子菜单ID标号标号提示信息提示信息是否为分割线是否为分割线ID(菜单命令的菜单命令的ID)ID_顶层菜单名顶层菜单名_下一级菜单名下一级菜单名(_再下一级菜单名再下一级菜单名)Caption(菜单命令的名称菜单命令的名称)快捷键设置快捷键设置在菜单标题中相应的字母前输入在菜单标题中相应的字母前输入“&”即可。还可以加上菜单项的加速键即可。还可以加上菜单项的加速键“tCtrl+C”,可以再不打开菜单的情况下直接执行菜单命令,可以再不打开菜单的情况下直接执行菜单命令,“t”为制表符。为制表符。Separator(分隔线分隔线):该项值为:该项值为True,则菜单命令变成,则菜单命令
6、变成一个分隔线,而原有菜单命令信息丢失。如想对菜单命一个分隔线,而原有菜单命令信息丢失。如想对菜单命令分组,可以使用分隔线。令分组,可以使用分隔线。Popup(弹出式弹出式)。该项值为。该项值为True,菜单命令将成为弹出式菜单,菜单命令将成为弹出式菜单,即单击次菜单会掏出下一级菜单。弹出式菜单不需要制定即单击次菜单会掏出下一级菜单。弹出式菜单不需要制定ID号。号。VS2010默认顶层菜单为弹出式菜单。默认顶层菜单为弹出式菜单。Inactive(不活动不活动)。该项值为。该项值为True表明菜单命令的初始状态为表明菜单命令的初始状态为非活动状态。非活动状态。Checked(检查标记检查标记)。
7、该项用来给菜单一个初始的检查标记,。该项用来给菜单一个初始的检查标记,其值为其值为True,则会在菜单命令的左侧打上一个勾。,则会在菜单命令的左侧打上一个勾。Grayed(变灰变灰)。该项值为。该项值为True,则该菜单命令将以灰色显示,则该菜单命令将以灰色显示,表明菜单的初始状态为不可访问。如果该项值为表明菜单的初始状态为不可访问。如果该项值为True,那么菜,那么菜单一定不是活动的,此时单一定不是活动的,此时“Inactive”项不可用。项不可用。Help(帮助形式帮助形式)。该项值为。该项值为True,则该菜单会显示在菜单,则该菜单会显示在菜单栏的有侧。栏的有侧。Break(菜单命令的分
8、隔菜单命令的分隔)。当一个菜单的菜单命令太多时,。当一个菜单的菜单命令太多时,放在一列中会感觉很长,很拥挤,这时可以考虑把它分成两放在一列中会感觉很长,很拥挤,这时可以考虑把它分成两列来显示。有三种选择方式:列来显示。有三种选择方式:None,Column,BarPrompt(菜单命令功能的提示菜单命令功能的提示)。程序运行时,当鼠标指针。程序运行时,当鼠标指针移到菜单命令上时,在底部的状态栏会给出此菜单的功能提移到菜单命令上时,在底部的状态栏会给出此菜单的功能提示示n编辑菜单过程中所涉及的操作编辑菜单过程中所涉及的操作n插入菜单项插入菜单项选中空白区域,输入菜单项标题,并设置属性。选中空白区
9、域,输入菜单项标题,并设置属性。n调整菜单项位置调整菜单项位置选中某菜单项将其拖至适当位置。选中某菜单项将其拖至适当位置。n删除菜单项删除菜单项用用鼠鼠标标单单击击菜菜单单项项,然然后后单单击击Cut按按钮钮或或按按Del键键删除。删除。11n菜单设计一般需要经过下面两步:菜单设计一般需要经过下面两步:n使用菜单编辑器编辑菜单资源;使用菜单编辑器编辑菜单资源;n右键点击菜单项右键点击菜单项-添加事件处理函数。添加事件处理函数。n【例例】在一个单文档应用程序中添加一个在一个单文档应用程序中添加一个“画图画图”主主菜单,为其添加具有菜单,为其添加具有“直线直线”和和“矩形矩形”两个菜单项两个菜单项
10、弹出菜单。弹出菜单。n建单文档应用程序建单文档应用程序MyMenun打开菜单编辑器,编辑菜单项打开菜单编辑器,编辑菜单项打开打开“资源视图资源视图”中中“Menu”文件夹,双击文件夹,双击IDR_MAINFRAME打开菜单编辑器。打开菜单编辑器。n运行程序运行程序13菜单的响应和消息路由菜单的响应和消息路由n菜菜单单命命令令也也是是一一种种消消息息,在在Windows中中,消消息息分分为为三三类类:标准消息、命令消息和通告消息。标准消息、命令消息和通告消息。n标准消息是除标准消息是除WM_COMMAND之外,所有以之外,所有以WM_开开头的消息。从头的消息。从CWnd派生的类都可以接收到这类消
11、息。派生的类都可以接收到这类消息。n命令消息是来自菜单、加速键或工具栏按钮的消息。这命令消息是来自菜单、加速键或工具栏按钮的消息。这类消息都以类消息都以WM_COMMAND形式呈现。在程序中,通形式呈现。在程序中,通过资源的标识(过资源的标识(ID)来区分来自资源的命令消息。从)来区分来自资源的命令消息。从CCmdTarget派生的类,都可以接收到这类消息。派生的类,都可以接收到这类消息。n通告消息是由控件产生的消息,例如按钮的单击、列表通告消息是由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框
12、)通知事件的发生。这类消息也是以(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现的。从形式呈现的。从CCmdTarget派生的派生的类,都可以接收到这类消息。类,都可以接收到这类消息。14n为为添添加加的的菜菜单单添添加加消消息息响响应应,并并编编辑辑处处理理函函数数,使使用用户在选择每个菜单项时,弹出不同的提示对话框。户在选择每个菜单项时,弹出不同的提示对话框。n在在上上例例中中仅仅添添加加了了菜菜单单,并并没没有有实实现现菜菜单单的的功功能能,即即没没有有对对应应的的命命令令处处理理函函数数与与菜菜单单项项对对应应,因因此此,添加的菜单项是灰色的,即处于当前不可用
13、状态。添加的菜单项是灰色的,即处于当前不可用状态。n添添加加新新的的菜菜单单项项后后,还还应应该该为为菜菜单单项项指指定定一一个个处处理理函数,添加一个消息处理函数。函数,添加一个消息处理函数。15n步骤如下:步骤如下:n打开打开MyMenu应用程序应用程序n建立建立WM_COMMAND命令消息映射命令消息映射1.在在“直线直线”菜单项上单击鼠标右键,选择菜单项上单击鼠标右键,选择“添加事件添加事件处理程序处理程序”,弹出,弹出“事件处理程序向导事件处理程序向导”对话框。对话框。2.在在“类列表类列表”中选择要添加响应函数的类中选择要添加响应函数的类“CMainFrame”,在,在“消息类型消
14、息类型”中选择中选择“COMMAND”,单击,单击“添加编辑添加编辑”按钮,即为按钮,即为“直线直线”菜单项在菜单项在“CMainFrame”类中添加了一个类中添加了一个WM_COMMAND类类型的消息处理函数型的消息处理函数“OnLine”。n编辑消息处理函数。编辑消息处理函数。在在voidCMainFrame:OnLine()函数中添加代码函数中添加代码MessageBox(_T(您选择了画直线的操作!您选择了画直线的操作!);16n同样的方法可以添加矩形的消息响应函数。同样的方法可以添加矩形的消息响应函数。n运行界面如下:运行界面如下:17n消息映射从代码上来看,对应着消息映射从代码上来
15、看,对应着3个部分的代码:个部分的代码:n在响应这个菜单命令的类的声明中添加一个响应函数的声在响应这个菜单命令的类的声明中添加一个响应函数的声明明afx_msgvoidOnLine();n在该类的实现文件中,在这个类的消息映射表中添加这个在该类的实现文件中,在这个类的消息映射表中添加这个菜单的映射宏菜单的映射宏ON_COMMAND(ID_LINE,&CMainFrame:OnLine)n在该类的实现文件中,为响应函数添加实际的响应代在该类的实现文件中,为响应函数添加实际的响应代voidCMainFrame:OnLine()MessageBox(_T(您选择了画直线的操作!您选择了画直线的操作!
16、);n因此,也可以不使用类向导,自己添加上述三部分代码,完因此,也可以不使用类向导,自己添加上述三部分代码,完成同样的功能。成同样的功能。18加速键加速键n用于实现对快捷键的设置。用于实现对快捷键的设置。19n为程序为程序MyMenu中添加的两个菜单项添加加速键。中添加的两个菜单项添加加速键。n打开加速键列表打开加速键列表在在“资源视图资源视图”中双击中双击“Accelerator”文件夹下的文件夹下的“IDR_MAINFRAME”,打开加速键列表。,打开加速键列表。n编辑加速键资源编辑加速键资源三个菜单的加速键资源如图所示。三个菜单的加速键资源如图所示。当按下键盘上的当按下键盘上的“Alt+
17、Shift+L”和和“Alt+Shift+R”时,时,就相当于选择了就相当于选择了“画图画图”子菜单下的子菜单下的“直线直线”和和“矩矩形形”菜单项。菜单项。n这与在编辑菜单项名称时所写的这与在编辑菜单项名称时所写的“&+字母字母”是不同的,是不同的,它代表的含义是,当这个弹出菜单显示时,按下它代表的含义是,当这个弹出菜单显示时,按下“Alt+字母字母”,即选中该菜单项,当这个弹出菜单没,即选中该菜单项,当这个弹出菜单没有显示时,按这个组合键是无效的,这样的组合键通有显示时,按这个组合键是无效的,这样的组合键通常被称为热键。常被称为热键。21nMFC中的中的CMenu类封装了类封装了Windo
18、ws的菜单功能,提供了的菜单功能,提供了对菜单和菜单项的多种操作。对菜单和菜单项的多种操作。n与与CMenu类相关的主要函数如下:类相关的主要函数如下:1.获取菜单指针获取菜单指针CMenu*CWnd:GetMenu()const;功能:得到主菜单的指针功能:得到主菜单的指针CMenu*CMenu:GetSubMenu(intnPos)const;nPos:指定菜单项的位置,:指定菜单项的位置,第一个菜单项为第一个菜单项为0,第二个,第二个菜单项为菜单项为1,以此类推。,以此类推。功能:得到第功能:得到第nPos+1个菜单项的弹出菜单的指针。个菜单项的弹出菜单的指针。2.添加菜单项添加菜单项获
19、取了菜单指针后,可以调用获取了菜单指针后,可以调用AppendMenu或或InsertMenu函数在程序运行时添加菜单项。函数在程序运行时添加菜单项。BOOLCMenu:AppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLCMenu:InsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);nFlags常用的两种风格为:常用的两种风格为:MF_POPUP(添加主菜单添加主菜单项项)和和MF_STRING(添加弹出菜
20、单项)。(添加弹出菜单项)。注意:当菜单项增加后,应调用注意:当菜单项增加后,应调用CWnd:DrawMenuBar()来更新菜单。来更新菜单。233.删除菜单项删除菜单项BOOLCMenu:DeleteMenu(UINTnPosition,UINTnFlags);nPosition:标识要删除的菜单项;:标识要删除的菜单项;24注意事项:当删除菜单项后,应调用注意事项:当删除菜单项后,应调用CWnd:DrawMenuBar()来更新菜单。来更新菜单。符号含义nPosition值MF_BYCOMMAND菜单项以ID号来标识菜单项资源IDMF_BYPOSITION菜单项以位置来标识菜单项位置De
21、deteMenu的的nFlags标志及其对其他值的影响标志及其对其他值的影响 4.获取菜单项数目获取菜单项数目UINTCMenu:GetMenuItemCount()const;获取菜单项数目失败时,函数返回值为获取菜单项数目失败时,函数返回值为-1。5.获取菜单获取菜单ID号号UINTCmenu:GetMenuItemID(intnPos)const;GetMenuItemID()方法根据菜单项的位置返回菜单方法根据菜单项的位置返回菜单ID,如果该菜单项对应一个弹出菜单,则返回值为,如果该菜单项对应一个弹出菜单,则返回值为-1,如果该菜单项是一个分隔条,则返回值为,如果该菜单项是一个分隔条,
22、则返回值为0。nPos:标识菜单项的位置,第一个菜单项为:标识菜单项的位置,第一个菜单项为0。256.对菜单项属性的修改对菜单项属性的修改voidCCmdUI:SetCheck(intnCheck1=1);设定菜单项是否被选中,设定菜单项是否被选中,nCheck1=1为选中,为选中,0为未为未选中。选中。voidCCmdUI:Enable(BOOLbOn=TRUE);设定菜单项是否可选,设定菜单项是否可选,bOn=1为可选,为可选,0为不可选为不可选(呈灰色)(呈灰色)267.显示快捷菜单显示快捷菜单BOOLCMenu:TrackPopupMenu(UINTnFlags,intx,inty,C
23、Wnd*pWnd,LPCRECTlpRect=NULL);nFlags:表示菜单在屏幕显示的位置以及鼠标按钮标志:表示菜单在屏幕显示的位置以及鼠标按钮标志.x:菜单的水平坐标;:菜单的水平坐标;y:菜单的垂直坐标;:菜单的垂直坐标;pWnd:标识显示快捷菜单的窗口,此窗口将收到此快捷:标识显示快捷菜单的窗口,此窗口将收到此快捷菜单全部的菜单全部的WM_COMMAND消息;消息;lpRect:一个:一个RECT结构或结构或CRect对象指针,表示一个矩对象指针,表示一个矩形区域,用户单击这个区域时,快捷菜单不消失。当形区域,用户单击这个区域时,快捷菜单不消失。当lpRect为为NULL时,表示用
24、户单击在菜单外面时,菜单时,表示用户单击在菜单外面时,菜单会立即消失。会立即消失。n一般情况下,菜单项都不止一种状态。一般情况下,菜单项都不止一种状态。例例如如,在在没没有有选选择择任任何何内内容容时时,EditEdit菜菜单单下下的的CopyCopy、CutCut等等菜菜单单项项是是无无效效的的(灰灰色色显显示示)。有有时时,我我们们还还会会看看到到,在在菜菜单单项项旁旁边边可可能能还还会会有有检检查查标标记记,表表示示它是选中的还是不选中的。它是选中的还是不选中的。nMFC通通过过消消息息映映射射机机制制和和CCmdUI类类更更新新菜菜单单项项的的显显示。示。28n为为菜菜单单项项添添加加
25、消消息息响响应应函函数数时时,如如果果选选择择一一个个菜菜单单IDID,在,在MessagesMessages列表框中就会出现以下两项:列表框中就会出现以下两项:nCOMMANDCOMMANDnUPDATE_COMMAND_UIUPDATE_COMMAND_UI其中其中UPDATE_COMMAND_UIUPDATE_COMMAND_UI是更新命令用户接口消息,是更新命令用户接口消息,专门用于处理菜单项和专门用于处理菜单项和工具条按钮的更新。工具条按钮的更新。nCCmdUI的成员的成员函数:函数:29成员函数功能Enable()设置菜单项是否有效SetCheck()增加或清除”标记n为程序添加更
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 菜单 工具栏 状态栏
限制150内