再上一篇:15.6 CString类
上一篇:15.7 文本处理
主页
下一篇:附录A ASCII码表
再下一篇:附录B 常用的库函数
文章列表

15.8 菜单的制作

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

我们通过一个实例来说明菜单的制作过程。

例15.3 在菜单条上增加一个菜单项,并在弹出式子菜单中建立三个子菜单:复选、弹出菜单、禁用。而弹出菜单又包含三个子菜单项。图15-9给出了要产生菜单项结构。要求“复选”相当于开关,一次选择时打钩,再一次选择时去消打钩。菜单“禁用”通过一个成员变量来控制其变为灰色。

菜单

复选

弹出菜单

禁用 子菜单1

子菜单2

子菜单3 Alt+D

图15-9 新增菜单示图

(1) 在系统菜单条上增加一个菜单项

建立一个SDI工程文件Menues,单击工程窗口的资源标签,打开Menu文件夹,双击菜单资源ID_MAINFRAME,则系统打开菜单编辑器,将一个空的菜单项移到帮助菜单的左边。双击该空菜单项,则弹出图15-10所示的对话框。

图15-10 菜单项特性对话框

对话框中指定为Pop-up类型,并在Caption中输入“菜单”,关闭该对话框。双击这新菜单项“菜单”下面的“空菜单项”,弹出图15-11所示的对话框。

图15-11 菜单项特性对话框

在这对话框中,指定为Checked类型,并在Caption中输入“复选”,ID输入TEST_CHECK。Prompt中输入“测试复选”, 关闭该对话框。双击新菜单项下面的空菜单项,在弹出的菜单项特性对话框中,指定为Separator类型。

双击空菜单项,在弹出的对话框中选择Pop-up类型,并在Caption中输入“弹出菜单”。为其制作三个子菜单,其ID分别为“SUB_MENUE1”, SUB_MENUE2”, SUB_MENUE3”,Caption中分别输入“子菜单1”,“子菜单2”,“子菜单3”。

用同样的方法制作“禁用”子菜单项,其ID为“DISABLE_ME”。

下一步要为各个菜单项建立命令处理函数。先为“复选”菜单建立命令处理函数。进入类向导,选择“Message Maps”标签,类名指定为“CMenuesView”,对象 ID选择“TEST_CHECK”,在“Meassages”中分别双击COMMAND和UPDATE_ COMMAND _UI消息,MFC为该命令创建两个成员函数onCheck和onUpdateCheck。

为了标记“复选”菜单项的选中或没有选中的状态,要在视图类中增加一个新变量m_checked,即

class CMenuesView : public CView

{ ……

// Attributes

protected:

int m_checked;

……

};

在视图类的构造函数中将这个成员数据置初值为0,即

CMenuesView::CMenuesView()

{

// TODO: add construction code here

m_checked=0;

}

在打开该菜单时,产生一个消息,并调用onUpdateCheck成员函数,该函数根据m_checked的值来设置复选标记(值为1)或删除复选标记(值为0)。这可通过CCmdUI类的成员函数SetCheck来实现。将该函数改为:

void CMenuesView::OnUpdateCheck(CCmdUI* pCmdUI)

{

// TODO: Add your command update UI handler code here

pCmdUI->SetCheck(m_checked);

}

当参数m_checked的值为1或非0时,置复选标记,否则删除复选标记。

当用户选择“复选”菜单时,要切换复选标记,为此把函数onCheck修改为:

void CMenuesView::OnCheck()

{

// TODO: Add your command handler code here

m_checked= !m_checked;

}

下一步为“弹出菜单”的三个子菜单建立消息映射函数。

先为“子菜单3”建立一个加速键(Alt+D),选择工程窗口的“ResourceView”标签,先打开资源文件夹,再打开“Accelarator Editor”,双击资源“IDR_MAINFRAME”,按下Ins键(表示要插入一个加速键),弹出如图15-12所示的对话框。

图15-12 加速键对话框

在对话框ID中输入“SUB_MENUE3”,Key中输入D,选择Alt。然后关闭这个对话框。

并将“子菜单3”的标题改为“子菜单3\tAlt D”,其中\t将标题和加速键之间分开。改动已建菜单标题的方法是:选择工程窗口的“ResourceView”标签,先打开资源文件夹,再打开“Menu”文件夹,双击资源“IDR_MAINFRAME”,在编辑窗口中显示菜单条,单击“菜单”,再单击“弹出菜单”,双击“子菜单3”,弹出该菜单的特性对话框,将Caption中的“子菜单3” 改为“子菜单3\tAlt+D”,如图15-13所示。

图15-13 修改子菜单3的标题

利用类向导分别为三个子菜单增加相应的消息处理函数。进入类向导,类名指定为“CMenuesView”,对象 ID分别选择 SUB_MENE1、SUB_MENE2 和 SUB_MENE3 在“Meassages”中双击COMMAND消息,分别创建三个消息处理函数onMenue1、onMenue2和onMenue3。

修改这三个消息处理函数,分别使它们显示一个表明已选了命令的对话框。

void CMenuesView::OnMenue1()

{

// TODO: Add your command handler code here

MessageBox("选择了第一个子菜单!");

}

void CMenuesView::OnMenue2()

{

// TODO: Add your command handler code here

MessageBox("选择了第二个子菜单!");

}

void CMenuesView::OnMenue3()

{

// TODO: Add your command handler code here

MessageBox("选择了第三个子菜单!");

}

函数MessageBox产生一个提示信息对话框,在所产生的对话框中输出由参数给出的字符串。命令消息处理函数的作用由应用程序需求而定,本例仅说明如何在菜单命令与命令消息处理函数之间建立映射关系。

下一步处理“禁用”菜单。利用类向导,以相同的方法,在视图类上为菜单消息DISABLE_ME分别建立COMMAND和UPDATE_ COMMAND _UI消息处理函数,函数名分别为onMe,onUpdateMe。

在视图类的定义中增加一个保护成员:

int m_disabled;

并在视图类的构造函数中将其初值置为1:

m_disabled = 1;

修改消息处理函数onMe,onUpdateMe:

void CMenuesView::OnMe()

{

// TODO: Add your command handler code here

m_disabled = !m_disabled;

}

void CMenuesView::OnUpdateMe(CCmdUI* pCmdUI)

{

// TODO: Add your command update UI handler code here

pCmdUI->Enable(m_disabled);

}

编译连接程序,第一次进入菜单时,“禁用”子菜单可用,当单击禁用后,该菜单变为灰色,成为不可使用。可将函数OnUpdateMe改为:

void CMenuesView::OnUpdateMe(CCmdUI* pCmdUI)

{

// TODO: Add your command update UI handler code here

m_disabled = !m_disabled;

pCmdUI->Enable(m_disabled);

}

注意,只要打开菜单条上新建的菜单项“菜单”,系统立即产生消息 UPDATE_COMMAND _UI,由该消息驱动消息处理函数OnUpdateMe,即调用该函数。在单击“禁用”菜单命令时,系统产生消息COMMAND,该消息驱动消息处理函数OnMe。

上机比较以上二者的不同。