VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:第六章菜单、工具栏和状态栏菜单、工具栏和状态栏是组成Windows图形界面的三个主要元素。其中菜单、工具栏提供了用户操作应用程序的命令界面;状态栏提供了一个输出区域,用来显示当前程序运行的状态和数据变化等等。本章将详细的介绍菜单、工具栏和状态栏的使用方法。6.1菜单大多数的Windows应用程序都提供菜单作为用户与应用程序之间传递命令的一个特殊的途径。利用菜单可以不用将大量的命令按钮摆放在窗口上。既节省空间又使用方便。本节将主要讲述菜单的种类,菜单的设计与创建,及菜单的消息处理等等。6.1.1菜单介绍在众多的应用程序当中,我们最常见到的菜单有下拉式菜单、级联菜单和快捷方式菜单。下拉式菜单一般出现在应用程序窗口的顶部,分类的类别排成一行,和某个类别相关的所有功能排在那个类别的下面,如果选中某个类别时,其下就会拉出菜单,该菜单中有一系列具有相关功能的菜单项可供选择。级联菜单是下拉菜单的一个扩展。如果某个菜单项的右边有一个向右的黑三角符号,那么这个菜单项其实就是一个级联菜单。级联菜单带有另一个子菜单,子菜单一般显示在所属菜单项的右边。这个子菜单和下拉式菜单相似,有一系列菜单项可供选择。需要注意的是,请读者一定要区别弹出式菜单和菜单项。一般来说,把单击后会出现下拉子菜单的菜单称为弹出式菜单,而把其他菜单叫菜单项。级联菜单也是弹出式菜单,它右边出现的子菜单中的各个小菜单也叫菜单项。第三种菜单风格是可以通过在应用程序区域中单击鼠标右键调出的一种很方便的菜单,叫快捷菜单或弹出式菜单。由于该菜单的菜单项内容依赖于被选中的对象或光标、鼠标在工作区域内所指的位置,因此该种菜单也称为上下文菜单。一般情况下,当我们新建好一个MFC应用程序时,AppWizard都会为我们生成一个常用的菜单。单文档应用程序会自动生成标识符为IDR_MAINFRAME的菜单资源,而多文档应用程序自动生成标识符为IDR_MAINFRAME和IDR_xxxTYPE的菜单资源,其中xxx为你的工程名。这些菜单资源在应用程序框架窗口创建时自动加载,我们可以修改这个菜单资源。对于一个单文档的工程来说,菜单是在CxxxApp的Initinstance中产生的(xxx为你的工程名字),产生代码如下:CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CxxxDoc),RUNTIME_CLASS(CMainFrame),//mainSDIframewindowRUNTIME_CLASS(CxxxView));AddDocTemplate(pDocTemplate);其中IDR_MAINFRAME是菜单的ID,我们在资源面板里可以看到,很多资源的ID都是IDR_MAINFRAME,包括菜单、工具栏、加速键、图标和字符串表,由此可知,一个ID可以标识多个资源。6.1.2创建一个菜单在应用程序中创建并使用一个菜单一般都遵循下面几个步骤:1.在工程中添加一个自定义的菜单资源。VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:用菜单编辑器设计菜单。3.将菜单加入到应用程序中。4.为每个菜单项添加消息映射。以上步骤是我们创建一个自定义菜单的常规步骤,读者也可以在菜单编辑器中或应用程序中修改、控制AppWizard生成的系统菜单及用户自定义菜单。6.1.2.1添加一个菜单资源以前的章节中我们讲过如何添加一个字符串资源和位图资源,其实,添加和修改菜单资源和添加前两个资源类似,所有的资源添加方法都是雷同的。首先,打开或新建一个MFC单文档的应用程序,若要建立一个新的菜单资源,可以通过两种方法,一种是从View菜单中选取Resource菜单项,弹出InsertResource对话框,如图6-00所示。在该对话框中选定Menu,然后单击对话框右边的New按钮即可。图6-00InsertResource对话框VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:选项,使其显示资源面板页面。在资源浏览窗口中,鼠标右击Menu,弹出如图6-01所示快捷方式菜单,在该菜单中可以有两个选择来添加菜单资源,通过选择Insert,那么同样会弹出如图6-00所示InsertResource对话框来进行添加;通过选择InsertMenu,可以省略调用InsertResource对话框这一步,直接在工作台Menu资源下面产生一个新的菜单资源。在执行上述操作之后,我们可以看到在工作台中多了一个ID号为IDR_MENU1的菜单资源。ID号IDR_MENU1是系统自动为我们生成的,我们可以保留这个ID号,也可以修改成我们自己想要的ID号。修改ID号的方法很简单,只要我们鼠标右键单击ID号IDR_MENU1,然后在如图6-02所示的快捷方式菜单中选择Properties,在如图6-03所示的MenuProperties对话框中的ID后面的文本框中输入我们想要修改的ID值,如IDR_MYMENU.图6-02修改菜单资源的ID图6-03MenuProperties对话框我们虽然添加了一个菜单资源,但它仅仅具有一个ID号,还没有任何内容,下面我们VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:号具有真正的菜单。6.1.2.2利用菜单编辑器编辑菜单资源我们双击工作台资源面板上ID号为IDR_MYMENU,我们新添加的菜单资源,在右边的菜单编辑器中只有一个空白的菜单项被高亮显示,如图6-04所示。图6-04一个空菜单接下来,我们可以给这个菜单资源加入菜单项了,假定我们要加一个弹出菜单“颜色”,它下面有两个菜单项“红色”和“蓝色”,加入菜单项的步骤如下:步骤1:在菜单编辑器窗口中,鼠标右键单击空白菜单项,在弹出的快捷方式菜单中选择Properties菜单项或者鼠标左键双击空白菜单项,弹出如图6-05所示的菜单项属性对话框,在Caption文本框中输入“颜色”,回车确认,顶层菜单中就多了一个“颜色”下拉菜单。系统默认的顶层菜单为弹出式菜单,因此在这个弹出式菜单的下面又多了一个空白的菜单项.图6-05添加顶层菜单在进行下一步之前,我们先来分析一下菜单项属性对话框的5组选项:1)ID(菜单项的ID)菜单的ID后面跟着一个组合框,其中列出了所有使用ID值,一般情况下,菜单的ID取值应遵循以下原则:VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:顶层菜单名_下一级菜单向名(_再下一级菜单项名...)这样做的好处是,当看到ID号时,就知道是哪个菜单项了,并且当应用程序菜单中有多个菜单项时不容易造成ID号重复.需要注意的是,弹出菜单不需要ID号,如“颜色”。2)Caption(菜单项的名称)菜单项的ID是代表它的身份并且需要在程序中引用,但是,将它显示在窗口上的时候,它还需要有个名字。Caption取名几可以是英文,也可以是中文,也可以包含数字、符号等等。我们还可以在Caption文本框中定义某个菜单项的快捷键。给菜单加上快捷键的操作很简单,只需在Caption文本框中,在菜单标题中响应的字母前键入“&”即可。如果菜单是中文,就必须用小括号把快捷键的说明括起来。如图6-06所示的“新建”菜单项的快捷键使用“(&N)”定义。图6-06“新建”菜单项属性Caption文本框中还有一串字符“\tCtrl+N”,这是用来表明该菜单项的加速键,加速键可以在不打开菜单的情况下直接执行菜单项。其中“\t”是制表符。3)一组复选框Separator(分隔线)复选框选中该复选框,则菜单项变成一个分隔线,而原有菜单项信息丢失。如果用户想在已添加的两个菜单项中间加一条分隔线,可以先用鼠标拖动空白菜单到需要分割线的位置,然后将这个空白菜单复选Separator复选框。Pop-up(弹出式)复选框选中此复选框,菜单项将成为弹出式菜单,即单击此菜单会弹出下一级子菜单。弹出式菜单不需要指定ID号,VisualC++默认顶层菜单为弹出式菜单,当然,我们也可以把它设为菜单项。非顶层菜单也可以作为弹出菜单(级联菜单),它的菜单项的右边显示一个三角符号。如果不选这个复选框,表示该菜单为菜单项。Inactive(不活动)复选框选中此复选框表明菜单项的初始状态为非活动状态。Checked(检查标记)复选框此复选框用来非菜单一个初始的检查标记,选中该复选框,会在菜单项的左边打上一个钩。Grayed(变灰)复选框选中此复选框,该菜单项将以灰色显示,表明菜单的初始状态为不可访问,如果该复选框被选中,那么菜单一定是不活动的,所以,此时Inactive复选框不VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:可用。Help(帮助形式)复选框选中此复选框,菜单会出现在菜单拦的右侧,如图6-07所示,我们将AppWizard为我们生成的标准菜单中的“帮助”菜单选定为help形式。图6-07帮助形式菜单4)Break(菜单项的分割)当一个菜单的菜单项太多时,放在一列当中会感觉很长很拥挤,这时,我们可以考虑把它分成两列来显示,Break就起到了这样的作用。Break选项对应一个组合框,有三种选择方式:None、Column和Bar。None:系统默认选项,表示不分割。Column:列分割,选中此项时,从选中的菜单项以下的菜单项将另起一行。如图6-08所示,我们将“文件”菜单中的“打印”菜单项选中此项的结果。图6-08Column分割形式Bar:和Column类似,也是列分割,只不过,与Column不同的是,两列之间有一条竖线将它们割开,图6-09所示。图6-09Bar分割形式5)Prompt(菜单项功能的提示)在Prompt后面的文本框中可以输入文本,程序运行时,当鼠标移到菜单项上时,在底部的状态栏将给出此菜单的功能的提示。VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:介绍完菜单项属性对话框,我们接着上面的第1步继续讲如何加入一个菜单项。步骤2:如图6-05所示,我们双击顶层菜单“颜色”下面的空白的菜单项,,再次调出菜单项属性对话框,在Caption后面的文本框中输入“红色”,设定其ID号为ID_COLOR_RED,最终结果如图6-10所示。回车确认,“红色”菜单项就添加好了。图6-10添加“红色”菜单项步骤3:再双击“红色”菜单项下面的空白菜单项,用相同的方法添加“蓝色”菜单项,在Caption后面的文本框中输入“蓝色”,设定其ID号为ID_COLOR_BLUE,结果如图6-11所示,回车之后,这个菜单就添加好了。图6-11添加“蓝色”菜单项经过上述3个步骤,带有“红色”和“蓝色”子菜单项的弹出式菜单“颜色”菜单创建好了,后面,我们将讲述如何将它加进应用程序中。6.1.2.3将菜单加入到应用程序中现在我们运行一下刚刚添加完“颜色”菜单的程序,发现窗口上显示的菜单依然是AppWizard为我们添加的标准菜单,我们自己的菜单没有显示出来,为什么呢?我们知道一个应用程序只能有一个菜单,在前面第一节中我们已经讲过,单文档应用程序会自动生成标识符为IDR_MAINFRAME的菜单资源,因此,在程序加载的时候,它只是加载了标识符为IDR_MAINFRAME的菜单,那么要想让我们的菜单显示出来,我们可以在框架类创建的时候,将我们自己的菜单加载进去。在CmainFrame类的OnCreate函数中编辑VC++培训教程草稿(2000年撰写)张孝祥、袁龙友著网址:http://