菜单工具栏和状态栏.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

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

1 / 66
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功