📄 chap3_6.htm
字号:
<html>
<head>
<title>3.6 使用菜单</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></td>
</tr>
</table>
</center></div><p align="center"><font color="#3973DE" FACE="Times New Roman" size="4">3.6
</font><font color="#3973DE" size="4">使用菜单</font></p>
<font FACE="Times New Roman" SIZE="3"><p></font><span style="font-size: 9pt"> 现在我们要在主窗口中加入自己的菜单。菜单编程一般分三步:</span></p>
<p><span style="font-size: 9pt">1.编辑菜单资源,设置菜单属性(包括菜单名和ID);<br>
2.用ClassWizard自动映射菜单消息和成员函数;<br>
3.手工编辑成员函数,加入菜单消息处理代码。</span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">3.6.1 编辑菜单资源</font></span></p>
<p><span style="font-size: 9pt"> 仍然使用我们前面生成的Hello程序,编辑由AppWizard自动生成的菜单资源。要编辑菜单资源:</span></p>
<p><span style="font-size: 9pt">(1) 选择项目工作区的ResourceView标签,切换到资源视图。<br>
(2) 选择菜单资源类型。<br>
(3) 选定菜单资源IDR_MAINFRAME,双击该项或单击鼠标右键然后在弹出菜单中选择Open选项。Visual
Studio将弹出菜单编辑窗口,显示菜单资源IDR_MAINFRAME,其中IDR_MAINFRAME是由AppWizard在创建该程序时自动生成的。<br>
(4) 编辑当前菜单</span></p>
<p><span style="font-size: 9pt"> 要删除某个菜单项或弹出菜单,可用鼠标单击该菜单或用上下光标键来回选择,然后按Del键删除;要插入新菜单项,可选定窗口中的空白菜单框后按回车(或直接用鼠标双击该空白框),Visual
Studio弹出Properties(属性)对话框,如图3-11所示。属性对话框用于输入菜单项的标题、标识符、菜单项在状态栏上显示的提示(Prompt),并为该菜单提供属性调整。也可以在选择一个已有的菜单项时按Ins键,以在该菜单项上方插入一个空白菜单项,然后双击该菜单项进行编辑。要插入一个分隔线,只需将菜单项的Seperator属性打开即可。<br>
Visual Studio支持鼠标拖曳调整菜单项位置。要调整菜单项位置,只需要选中某菜单项并将其拖至适当位置即可。</span></p>
<p align="center"><span style="font-size: 9pt"><img src="T3_11.gif"
alt="T3_11.tif (250480 bytes)" WIDTH="548" HEIGHT="308"></span></p>
<p align="center"><span style="font-size: 9pt">图<small>3.11 </small>菜单编辑器和属性对话框</span></p>
<p><span style="font-size: 9pt"> 如上图,我们首先在Edit和View之间加入一个弹出菜单:用鼠标单击View菜单,按Ins键插入一个空白菜单项,双击该空白框弹出其属性对话框。在菜单属性栏输入“&Test”字样。然后在Test弹出菜单下加入以下四个菜单项,并在&Say
Hello菜单下加入一个分隔符。菜单项属性设置如下表:</span></p>
<div align="center"><center><table BORDER="1" CELLSPACING="2" BORDERCOLOR="#7F7F7F"
CELLPADDING="1" WIDTH="346" height="177">
<tr>
<td WIDTH="22%" height="35"><span style="font-size: 9pt">菜单名</span></td>
<td WIDTH="43%" height="35"><span style="font-size: 9pt">菜单ID</span></td>
<td WIDTH="35%" height="35"><span style="font-size: 9pt">菜单提示(Prompt)</span></td>
</tr>
<tr>
<td WIDTH="22%" height="38"><span style="font-size: 9pt">Say &Hello</span></td>
<td WIDTH="43%" height="38"><p align="left"><span style="font-size: 9pt">ID_SAY_HELLO</span></td>
<td WIDTH="35%" height="38"><span style="font-size: 9pt">Say hello to you!</span></td>
</tr>
<tr>
<td WIDTH="22%" height="17"><span style="font-size: 9pt">&Red</span></td>
<td WIDTH="43%" height="17"><span style="font-size: 9pt">ID_SELECT_RED</span></td>
<td WIDTH="35%" height="17"><span style="font-size: 9pt">The color is red.</span></td>
</tr>
<tr>
<td WIDTH="22%" height="19"><span style="font-size: 9pt">&Blue</span></td>
<td WIDTH="43%" height="19"><span style="font-size: 9pt">ID_SELECT_BLUE</span></td>
<td WIDTH="35%" height="19"><span style="font-size: 9pt">The color is blue.</span></td>
</tr>
<tr>
<td WIDTH="22%" height="38"><span style="font-size: 9pt">&Yellow</span></td>
<td WIDTH="43%" height="38"><span style="font-size: 9pt">ID_SELECT_YELLOW</span></td>
<td WIDTH="35%" height="38"><span style="font-size: 9pt">The color is yellow.</span></td>
</tr>
</table>
</center></div><p><span style="font-size: 9pt"> </span></p>
<b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0"
width="90%" bgcolor="#D0D0D0">
<tr>
<td width="100%"></b><span style="font-size: 9pt">提示:如果菜单中要使用中文,则除了在菜单名一项中输入中文外,还要将菜单资源的语言属性设置为中文。方法是:鼠标右键单击资源视图的菜单资源IDR_MAINFRAME,弹出快捷菜单,选择Properties,弹出整个菜单资源的属性对话框,如图3-12所示。在Languages下拉列表框中选择Chinese
(P.R.C.)。这样以后菜单就可以正确使用和显示中文了。如果其他资源如对话框或字符串要使用中文,也要将该资源的语言属性改为Chinese(P.R.C)。</span></td>
</tr>
</table>
</center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p align="center"><span style="font-size: 9pt"><img src="T3_12.gif"
alt="T3_12.tif (107259 bytes)" WIDTH="526" HEIGHT="186"></span></p>
<p align="center"><span style="font-size: 9pt">图<small>3.12 </small>设置菜单语言属性</span></p>
<p><span style="font-size: 9pt"> 现在关闭菜单编辑器窗口。我们要为Say
Hello菜单增加一个加速键CTRL+H。要编辑加速键,选择Accelerator资源类型,双击打开IDR_MAINFRAME加速键资源。要删除加速键,可以直接按Del键。要增加加速键,可以按Ins键,弹出加速键属性对话框。在ID下拉列表框中选择ID_SAY_HELLO,在Key一栏中输入H,完成加速键设置。关闭加速键编辑窗口。</span><b></p>
<p></b><span style="font-size: 9pt"><font color="#3973DE">3.6.2 用ClassWizard自动映射菜单消息和成员函数</font></span></p>
<p><span style="font-size: 9pt"> 现在我们用ClassWizard为上面创建的几个菜单生成和映射消息处理成员函数。在此之前我们首先介绍一下ClassWizard的用法。</span><b></p>
<p></b><span style="font-size: 9pt"><font color="#3973DE">用ClassWizard管理类和Windows消息</font></span></p>
<p><span style="font-size: 9pt"> ClassWizard有助于创建Windows消息和命令处理函数、创建和管理类、创建类成员变量、创建OLE
Automation的方法和属性、创建数据库类以及其他一些工作。<br>
ClassWizard也有助于覆盖MFC类中的虚函数。先选类,再选择需要覆盖的虚函数。该过程的其余部分与消息处理是类似的。</span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">启动ClassWizard应用程序</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 从View菜单或源程序编辑窗口右键菜单中选择ClassWizard(快捷键:Ctrl
+W),Developer Studio将弹出MFC ClassWizard对话框。该对话框包含几个标签页,提供以下选项:</span></p>
<blockquote>
<p><span style="font-size: 9pt">Message Maps:它管理消息和成员函数之间的映射关系。</span></p>
<p><span style="font-size: 9pt">Member Variables:它可以让用户加进一些数据成员,以便和各种控制进行数据交换。</span></p>
<p><span style="font-size: 9pt">Automations:它提供了各种特性支持OLE2.0,包括为OLE
Automation增加属性、方法以及处理事件。</span></p>
<p><span style="font-size: 9pt">ActiveX Events:为ActiveX控件增加属性、方法以及为ActiveX控件事件增加处理函数。</span></p>
<p><span style="font-size: 9pt">Class Info:它可以让用户创建新类,以便支持对话框和各种可视类(包括控制、窗口等)。还可以从类库文件导入类到当前工程中。</span></p>
</blockquote>
<p><span style="font-size: 9pt"> 在这一章里,我们只用到Message Maps这一页,因此我们在这里只介绍Message
Maps的使用。</span><b></p>
<p></b><span style="font-size: 9pt"><font color="#3973DE">Message Maps选项</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 可以让用户加入成员函数来处理消息,删除成员函数以及对成员函数进行编辑。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">Message Maps页包括如下控制选项:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<blockquote>
<b><p><span style="font-size: 9pt">Projects组合框</b>:允许用户选择当前工作区中包含的工程。</span></p>
<b><p><span style="font-size: 9pt">Class Name组合框</b>:允许用户选择当前工程中的类。</span></p>
<b><p><span style="font-size: 9pt">Objects IDs列表框</b>:列出当前选中的类名及相关的ID。对窗口和视来说,这些ID为菜单标识符;对对话框来说,这些ID为控制框的ID。</span></p>
<b><p><span style="font-size: 9pt">Messages列表框</b>:列出当前所选类的可重载的虚方法以及可接收到的消息。</span></p>
<b><p><span style="font-size: 9pt">Member Functions列表框</b>:列出ClassName组合框中当前所选的项中所包含的所有成员函数。用户可以增加、删除成员函数,也可以对成员函数进行编辑。</span></p>
<b><p><span style="font-size: 9pt">Add Class...按钮</b>:它允许用户往工程里添加新类。在按钮右边有一个向下的小箭头,表明按此按钮将弹出一个菜单。菜单包含两项:New...可以新建一个类;From
a type Lib用于从一个类库中导入类。</span></p>
<b><p><span style="font-size: 9pt">Add Function按钮</b>:它允许用户往Member
Functions列表框中加进一个新的消息处理成员函数,该新增成员函数被用来响应Message
Maps列表中当前所选中的消息。</span></p>
<b><p><span style="font-size: 9pt">Delete Function按钮</b>:用于删除Member
Functions列表框中所选中的项。</span></p>
<b><p><span style="font-size: 9pt">Edit Code按钮</b>:它允许用户对Member
Functions中所选中的项进行编辑,此时Visual Studio 将关闭MFC ClassWizard对话框,并打开相应文件,并将光标定位在函数定义的开头处。</span></p>
</blockquote>
<p align="center"><span style="font-size: 9pt"><img src="T3_13.gif"
alt="T3_13.tif (369325 bytes)" WIDTH="553" HEIGHT="362"></span></p>
<p align="center"><span style="font-size: 9pt">图<small>3-13 </small>用<small>ClassWizard</small>增加菜单消息成员函数映射</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 现在我们就利用ClassWizard为Hello程序增加菜单消息和成员函数的映射。在View菜单下选择ClassWizard,弹出MFC
ClassWizard对话框。选择Message Maps页,在Class Name下拉列表中选择CMainFrame类。在Object
IDs中选择ID_SAY_HELLO,在Messages栏中双击COMMAND,弹出Add Member Function对话框。对话框中给出缺省的成员函数OnSayHello,按OK接收缺省的成员函数名。此时OnSayHello
成员函数就出现在Member Functions列表框中,后面跟所映射的消息,如图3-13所示。列表框中开头的字母W表示窗口消息,V表示可重载的虚方法(Virtual
Method)。如此,依次为ID_SELECT_BLUE、ID_SELECT_RED、ID_SELECT_YELLOW增加消息处理成员函数OnSelectBlue、OnSelectRed、OnSelectYellow。然后双击Member
Functions列表中的OnSayHello,编辑OnSayHello成员函数。</span><b></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -