第5章菜单、工具栏和状态栏.ppt

上传人:s****8 文档编号:66866723 上传时间:2022-12-21 格式:PPT 页数:66 大小:590KB
返回 下载 相关 举报
第5章菜单、工具栏和状态栏.ppt_第1页
第1页 / 共66页
第5章菜单、工具栏和状态栏.ppt_第2页
第2页 / 共66页
点击查看更多>>
资源描述

《第5章菜单、工具栏和状态栏.ppt》由会员分享,可在线阅读,更多相关《第5章菜单、工具栏和状态栏.ppt(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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为程序添加更

26、新用户界面的消息处理函数,使得用户在选为程序添加更新用户界面的消息处理函数,使得用户在选择某一菜单项后,为此菜单项添加复选标记,同时设置为择某一菜单项后,为此菜单项添加复选标记,同时设置为无效状态,表示不可再选此项。无效状态,表示不可再选此项。n记录用户当前选择的菜单项记录用户当前选择的菜单项在在CMainFrame类中添加一个成员变量类中添加一个成员变量inttype;在类的初始化函数中赋初值为在类的初始化函数中赋初值为0,即,即type=0;在在OnLine()函数中将其设置为函数中将其设置为1,即,即type=1;在在OnRectangle()函数中将其设置为函数中将其设置为2,即,即t

27、ype=2;n建立菜单的建立菜单的ON_UPDATA_COMMAND_UI消息映射消息映射30n为菜单的消息处理函数添加代码为菜单的消息处理函数添加代码voidCMainFrame:OnUpdateLine(CCmdUI*pCmdUI)pCmdUI-SetCheck(0);if(type=1)pCmdUI-SetCheck(1);pCmdUI-Enable(FALSE);31n运行程序,选择矩形菜单,点击了弹出对话框的运行程序,选择矩形菜单,点击了弹出对话框的“确定确定”按钮,再单击按钮,再单击“画图画图”菜单项的状态菜单项的状态32n我我们们平平时时在在使使用用程程序序时时,经经常常会会用用

28、到到单单击击鼠鼠标标右右键键显显示示的的快快捷捷菜菜单,也称为上下文菜单,或右键菜单。单,也称为上下文菜单,或右键菜单。n显示快捷菜单需要使用显示快捷菜单需要使用CMenu:TrackPopupMenu()函数函数CMenu:TrackPopupMenu函数的原型为:函数的原型为:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);n该该函函数数的的功功能能是是显显示示一一个个右右键键快快捷捷菜菜单单。其其中中,nflags表表示示屏屏幕幕位位置置标标志志。x、y分分别别表表示示菜菜单单的的水水平平坐坐标标

29、和和顶顶端端的的垂垂直直坐坐标标;pWnd表表示示弹弹出出菜菜单单的的窗窗口口,包包括括全全部部的的WM_COMMAND消消息息;lpRect表示一个矩形域,当单击这个矩形域时菜单不消失。表示一个矩形域,当单击这个矩形域时菜单不消失。3334参数参数nflags的含义的含义n为程序添加一个快捷菜单,显示为程序添加一个快捷菜单,显示“画图画图”菜单对应的菜单对应的弹出菜单弹出菜单n添加菜单资源添加菜单资源在项目工作区窗口中选择在项目工作区窗口中选择“资源视图资源视图”,在,在“Menu”项目上单击鼠标右键,选择项目上单击鼠标右键,选择“插入插入Menu”,向应用,向应用程序添加一个新的菜单资源,

30、缺省的程序添加一个新的菜单资源,缺省的ID号为号为IDR_MENU1,编辑菜单。,编辑菜单。为该菜单资源中的顶层为该菜单资源中的顶层菜单的第一项加一任意标题菜单的第一项加一任意标题(实际上该标题无用实际上该标题无用),在此菜单项下依次添加菜单项设置在此菜单项下依次添加菜单项设置“直线直线”和和“矩矩形形”菜单项的菜单项的ID与与IDR_MAINFRAME中相应的菜中相应的菜单相同,也可以在单相同,也可以在ID的下拉列表框中,分别选择的下拉列表框中,分别选择“ID_LINE”和和“ID_RECTANGLE”。35n建立消息映射,编辑响应函数建立消息映射,编辑响应函数快捷菜单通常都不涉及这样的操作

31、,因为快捷菜单中快捷菜单通常都不涉及这样的操作,因为快捷菜单中显示的菜单项在程序的主菜单中都可以找到,只要显示的菜单项在程序的主菜单中都可以找到,只要在第一步中,将快捷菜单中菜单项的在第一步中,将快捷菜单中菜单项的ID选为主菜单选为主菜单中相应菜单项的中相应菜单项的ID即可,这样就将快捷菜单中的菜即可,这样就将快捷菜单中的菜单项就与主菜单中相应的菜单项关联到同一响应函单项就与主菜单中相应的菜单项关联到同一响应函数了。数了。n在在CVIEW类中加入类中加入WM_CONTEXTMENU消息的处消息的处理函数理函数选择选择“Cview”类的类的“消息窗口消息窗口”,建立,建立“WM_CONTEXTM

32、ENU”消息的响应函数消息的响应函数“OnContextMenu”。36编辑编辑WM_CONTEXTMENU消息处理函数消息处理函数编辑编辑OnContextMenu函数如下,因为函数中要用到函数如下,因为函数中要用到参数参数point,故要去掉其注释:,故要去掉其注释:CMenumenu;menu.LoadMenuW(IDR_MENU1);menu.GetSubMenu(0)-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd();3738运行程序,界面如下运行程序,界面如下编程方法给系统编程方

33、法给系统菜单添加一个菜单项菜单添加一个菜单项例 向应用系统菜单中添加一个菜单项。(1)打开一个单文档应用程序项目,若没有可按前面提及的方法进行创建。(2)选择资源中的StringTable。(3)单击New,在Name框中,可以指定一个用于菜单项的ID号,输入“ID_NEW_MENUITEM”。在Value框中,可以定义该ID的值,选择默认的ID值101,单击OK按钮,caption 输入“新建菜单项”。nStringTable也称为串表,也称为串表,用于实现对字符串资源的用于实现对字符串资源的ID和和Caption等的设置。等的设置。40(4)在CMainFrame:OnCreate函数体(

34、或自定义的函数)中加入代码:.CMenu*pSysMenu=GetMenu();/获得主菜单句柄CMenu*pSubMenu=pSysMenu-GetSubMenu(1);/获得第二个子菜单的句柄CString StrMenuItem(新的菜单项);pSubMenu-AppendMenu(MF_SEPARATOR);/增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/允许使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜单项m_bAutoMenuEnable=FALSE;/使添加的菜单处

35、于允 许状态,默认为灰显 pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);DrawMenuBar();/更新菜单return 0;(5)使用ClassWizard处理OnCommand消息并检测用户菜单的nID参数。(在虚函数中找)BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam)/wParam的低字节表示菜单、控件、加速键的命令ID if(LOWORD(wParam)=ID_NEW_MENUITEM)MessageBox(_T(你选中了新的菜单项“);r

36、eturn true;CFrameWnd:OnCommand(wParam,lParam);n从第四章可知,利用从第四章可知,利用MFC向导可以生成基于对话框的向导可以生成基于对话框的应用程序,利用向导生成的对话框应用程序是没有菜应用程序,利用向导生成的对话框应用程序是没有菜单的,虽然我们也可以为应用程序添加菜单资源,但单的,虽然我们也可以为应用程序添加菜单资源,但编辑好的菜单资源在程序运行时并不显示。这时只要编辑好的菜单资源在程序运行时并不显示。这时只要打开该对话框的打开该对话框的“属性属性”页,将页,将“Menu”属性值设置属性值设置为所添加的菜单资源的为所添加的菜单资源的ID即可。即可。

37、43n通常步骤:通常步骤:n在在资资源源视视图图中中,右右键键点点击击.rc文文件件(资资源源文文件件),选选择择AddResource,选择,选择Menu新建一个菜单。新建一个菜单。n添加相关的菜单项及属性设置。添加相关的菜单项及属性设置。n在在主主对对话话框框属属性性中中Menu属属性性中中添添加加新新建建的的菜菜单单ID。n为菜单项添加在主对话框类的消息响应函数。为菜单项添加在主对话框类的消息响应函数。44n例建立一个基于对话框的应用程序,为程序的对话框例建立一个基于对话框的应用程序,为程序的对话框添加菜单资源,所添加的菜单是在前面练习过的有两添加菜单资源,所添加的菜单是在前面练习过的有

38、两个菜单项的个菜单项的“画图画图”菜单,每个菜单项的功能也同前。菜单,每个菜单项的功能也同前。n建立基于对话框的应用程序建立基于对话框的应用程序MyDialogMenun编辑菜单资源编辑菜单资源IDM_MENU1n将菜单与对话框相关联将菜单与对话框相关联45添加菜单IDn建立菜单项的消息映射建立菜单项的消息映射n编辑消息处理函数编辑消息处理函数46工具栏工具栏在在MFC中中,工工具具栏栏的的功功能能由由类类CToolBar实实现现。工工具具栏栏资资源源和和工工具具栏栏类类CToolBar是是工工具具栏栏的的两两个个要要素素。创创建建工工具具栏的方法有两种:栏的方法有两种:n使用使用Resour

39、ceView视图中自带的工具栏进行创建。视图中自带的工具栏进行创建。n添加自定添加自定义义工具工具栏栏47工具栏概述工具栏概述n系统默认生成的工具栏资源为系统默认生成的工具栏资源为IDR_MAINFRAME_256,可以在此基础上设计自己,可以在此基础上设计自己的工具栏,删除或添加一些按钮。需要为工具栏按钮的工具栏,删除或添加一些按钮。需要为工具栏按钮提供提供ID号,一般取某个菜单项的号,一般取某个菜单项的ID。n编程时,菜单、快捷键、工具栏资源往往配合使用。编程时,菜单、快捷键、工具栏资源往往配合使用。具有相同具有相同ID号的菜单项、工具栏按钮、快捷键被用户号的菜单项、工具栏按钮、快捷键被用

40、户操作后,会产生相同的命令消息,只需要进行一次消操作后,会产生相同的命令消息,只需要进行一次消息映射。息映射。工具栏的基本操作工具栏的基本操作添加按钮添加按钮双击工具条上的空白按钮或单击空白按钮后,绘制新的双击工具条上的空白按钮或单击空白按钮后,绘制新的按钮。按钮。删除按钮删除按钮将按钮拖出工具栏外,即可删除该按钮。将按钮拖出工具栏外,即可删除该按钮。移动按钮移动按钮鼠标选中按钮,按住鼠标不动,移动到指定位置上,松开鼠标选中按钮,按住鼠标不动,移动到指定位置上,松开鼠标。鼠标。需要注意的是,按需要注意的是,按Delete键并不能删除该按钮,只是将键并不能删除该按钮,只是将其中的图形以背景色填充

41、。其中的图形以背景色填充。在工具栏中插入空格在工具栏中插入空格49n工具栏按钮属性的设置。工具栏按钮属性的设置。50项目含义IDID工具栏按钮的标识符,可以从工具栏按钮的标识符,可以从IDID框的下拉列表中选区框的下拉列表中选区标识符名称标识符名称WidthWidth工具栏按钮的像素宽度工具栏按钮的像素宽度HeightHeight 工具栏按钮的像素高度工具栏按钮的像素高度PromptPrompt 工具栏按钮提示信息。若为工具栏按钮提示信息。若为“建立新文档建立新文档nn新建新建”,则表示当鼠标指向该按钮时,在状态栏中显示则表示当鼠标指向该按钮时,在状态栏中显示“建立建立新文档新文档”,而在弹出

42、的提示信息中出现,而在弹出的提示信息中出现“新建新建”n例打开单文档应用程序例打开单文档应用程序MyMenu,为其添加工具栏按钮。,为其添加工具栏按钮。具体步骤如下:具体步骤如下:n打开单文档应用程序打开单文档应用程序MyMenun编辑工具栏资源编辑工具栏资源编辑编辑“直线直线”和和“矩形矩形”菜单项对应的工具栏按钮,将菜单项对应的工具栏按钮,将工具栏按钮的工具栏按钮的ID与菜单项的与菜单项的ID分别对应。分别对应。51工具栏的操作工具栏的操作52编辑工具栏编辑工具栏 使使用用工工具具栏栏编编辑辑器器来来编编辑辑工工具具栏栏资资源源。双双击击ResourceView视视图图中中的的Toolba

43、r工具栏资源,即可打开工具栏编辑器。工具栏资源,即可打开工具栏编辑器。绘图编辑器颜色选择属性状态栏状态栏n状状态态栏栏实实际际上上是是一一个个窗窗口口,一一般般分分为为几几个个窗窗格格,每每个个窗格显示不同的信息。窗格显示不同的信息。n状状态态栏栏可可以以分分为为两两部部分分,其其中中左左边边最最长长的的那那部部分分称称为为提提示示行行,当当我我们们把把鼠鼠标标移移动动到到某某个个菜菜单单项项或或工工具具按按钮钮上时,该部分将显示相应的提示信息。上时,该部分将显示相应的提示信息。53用用AppWizard创建的创建的SDI或或MDI应用程序框架中,有一应用程序框架中,有一个静态的个静态的ind

44、icator数组,它是在数组,它是在MainFrm.cpp文件中文件中定义的,被定义的,被MFC用作状态栏的定义。用作状态栏的定义。Static UINT indicators=ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,状态栏状态栏的常用操作的常用操作增加增加和减少窗格和减少窗格状态栏状态栏中的窗格可以分为信息行窗格和指示器窗格两中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需在类。若在状态栏中增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个数组

45、中的适当位置中增加一个ID_SEPARATOR标识;若在状态栏中增加一个用户指示标识;若在状态栏中增加一个用户指示器窗格,则在器窗格,则在indicators数组中的适当位置增加一个在字数组中的适当位置增加一个在字符串表中定义过的资源符串表中定义过的资源ID,其字符串的长度表示用户指,其字符串的长度表示用户指示器窗格的大小。若状态栏减少一个窗格,其操作与增加示器窗格的大小。若状态栏减少一个窗格,其操作与增加相类似,只需减少相类似,只需减少indicators数组元素。数组元素。在状态栏上显示文本在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:有三种办法可以在状态栏窗格显示文本信息:(

46、1)调用调用CWnd:SetWindowText更新信息行窗格更新信息行窗格(或窗或窗格格0)中的文本。由于状态栏也是一种窗口,故在使用时可中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为直接调用。若状态栏变量为m_wndStatusBar,则,则m_wndStatusBar.SetWindowText(“消息消息”)语句将语句将在信息行窗格在信息行窗格(或窗格或窗格0)内显示内显示“消息消息”字样。字样。(2)手动处理状态栏的手动处理状态栏的ON_UPDATE_COMMAND_UI更更新消息,并在处理函数中调用新消息,并在处理函数中调用CCmdUI:SetText函数。

47、函数。(3)调用调用CStatusBar:SetPaneText函数更新任何窗格函数更新任何窗格(包括信息行窗格包括信息行窗格)中的文本。此函数原型描述如下:中的文本。此函数原型描述如下:BOOLSetPaneText(intnIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE);例在状态栏的最右边两个窗格中显示出当前鼠标在窗口客例在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。户区的位置。(1)将前面的单文档应用程序打开或重新创建;将前面的单文档应用程序打开或重新创建;(2)将项目工作区窗口切换到将项目工作区窗口切换到ResourceView页

48、面,双击页面,双击“StringTable”项的项的“StringTable”图标。在字符串列图标。在字符串列表的最后一行空项上双击鼠标左键,如图:表的最后一行空项上双击鼠标左键,如图:(3)该对话框中,可以指定相应的该对话框中,可以指定相应的ID和字符串值,这里加入和字符串值,这里加入两个字符串资源两个字符串资源ID_LEFT和和ID_RIGHT,其字符的多少决,其字符的多少决定窗格的大小。如图:定窗格的大小。如图:添加的字符串图图6.18添加的字符串资源添加的字符串资源(4)打开打开MainFrm.cpp文件,将原先的文件,将原先的indicators数组修改如数组修改如下:下:stati

49、cUINTindicators=ID_SEPARATOR,/第一个信息行窗格第一个信息行窗格ID_SEPARATOR,/第二个信息行窗格第二个信息行窗格ID_LEFT,/第三个窗格第三个窗格ID_RIGHT,/第四个窗格第四个窗格;(5)必须手工添加消息处理函数原型。打开必须手工添加消息处理函数原型。打开mymenuView.h文文件,在件,在AFX_MSG内增加消息处理语句,内增加消息处理语句,ClassWizard以后允许以后允许访问和编辑该代码。访问和编辑该代码。protected:/AFX_MSG(CEx_SdiView)afx_msgvoidOnUpdateXY(CCmdUI*pCm

50、dUI);/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)增加修改状态栏指示器的消息映射函数代码,状态栏的窗增加修改状态栏指示器的消息映射函数代码,状态栏的窗

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁