03界面编程1-菜单(8)

2020-04-03 13:02

? “函数处理程序名称”栏中初始为默认的处理函数名,它是可以被修改的(一般不

必改)。命令消息的处理函数的默认名称,是通过改写菜单项的ID符号常量字符串而得到的。具体做法是:ID改为On,去掉下划线,将下划线后的首字母大写,其余字母小写。例如“成绩\\数学”菜单项的标识符为ID_SCORE_MATH,则对应的默认处理函数名就是OnScoreMath。对于更新消息的响应函数,还在命令消息处理函数名的基础上,在On后增加了“Update”,例如OnUpdateScoreMath。又如,“姓名\\张三”菜单项(ID_NAME_ZS)的命令和更新消息响应函数名分别为:OnNameZs和OnUpdateNameZs。

4) 按对话框底部的“添加编辑”钮,VS系统就会自动添加对应的消息处理程序,并

打开对应的CPP代码文件,定位于该函数的头部,使你可以开始编辑该函数。以后可以通过选中项目工作区的“类视图”页的“项目名\\视图类名”,然后在下部的成员函数列表中,再双击该菜单项事件处理函数,就可以打开对应的代码文件并定位于响应函数的头部,便于查看、编辑和修改它。

2.利用属性窗口

还可以利用属性窗口来为菜单项添加响应函数,具体步骤如下:

1) 在项目工作区类视图页中选中应用程序的视图类(如Student例为CStudentView)。 2) 在属性窗口中单击其工具条上的闪电形事件页按钮,切换到事件页。

3) 滚动ID列表寻找到指定菜单项所对应的ID,单击该ID左端的+号框。在展开的选

项列表中,有命令“COMMAND”和更新命令用户界面“UPDATE_COMMAND_UI”选项。

4) 单击其中想要的一个选项的右栏,在出现的下拉式列表,选其中唯一的选项,即可

添加对应的消息响应函数。例如,选Student例中的“姓名\\李四”菜单项所对应的ID(ID_NAME_LS),则出现的选项为 “ OnNamerLs”或“ OnUpdateNameLs”,参见图3-26 a) 和b)。

MFC在自动添加事件处理程序后,会自动定位于响应函数的头部,以便于程序员进行处理代码的编写。以后也可以通过属性窗口中菜单项ID下的“COMMAND”和“UPDATE_COMMAND_UI”项右栏,选中其下拉式列表中的“”选项来打开对应的代码文件(图3-26 c)),并定位于响应函数的头部,便于查看、编辑和修改它。

31

a)

b)

c)

图3-26 利用属性窗口为菜单项添加事件处理程序

3.3.3 自动生成工作

在使用上面的方法为菜单项添加事件处理程序时,MFC会在指定类的头文件和代码文件中自动生成函数原型、消息映射宏和空函数体。在MFC中,还可以一次性同时自动删除(注释掉)这三个部分。

1.生成

MFC在自动生成事件处理程序或消息响应函数框架时,做了如下三件工作: 1) 在类的头文件中添加了函数原型,如:

public:

afx_msg void OnNameLs();

2) 在类的代码文件开始处的消息映射部分中,添加了消息映射宏,如:

BEGIN_MESSAGE_MAP(CStudentView, CView)

……

ON_COMMAND(ID_NAME_LS, &CStudentView::OnNameLs) ……

END_MESSAGE_MAP()

32

3) 在类的代码文件的末尾处添加了空函数体,如:

void CStudentView::OnNameLs() { }

你也可以不借助于事件处理程序向导对话框和属性窗口来进行自动生成,而是自己用手工来创建菜单项和鼠标的消息响应函数,这时就需要自己来做上面的这三项工作。

// TODO: 在此添加命令处理程序代码

2.修改

为了修改某一菜单项对应的响应函数的名称或参数等内容,必须手工同时修改对应的原型、映射宏和函数体三个部分,以使它们保持一致,不然可能会造成一些莫名其妙的编译和运行错误。在MFC中,没有提供自动同步修改事件处理函数的功能。

3.删除

在MFC中,可以利用相关类所对应属性窗口来自动删除事件处理程序。具体做法是:单击对应菜单项ID栏中的“COMMAND”或 “UPDATE_COMMAND_UI”子项右部的事件处理函数名,在出现的下拉式列表中,选“On?”项(参见图3-26 c)),就可以一次性同时自动删除(其实是注释掉)响应函数的三个部分。

当然,你也可以(但不提倡)自己手工一个一个部分地删除事件处理程序的三个组成部分,不过需全部一起删除,不然也可能会造成一些莫名其妙的编译运行错误或意想不到的运行结果。

3.3.4 添加响应代码(显示消息框)

作为示例,我们在各个新生成的空消息响应函数中,添加一些简单的响应代码。例如可在对应的函数体中加入显示消息框的语句:

MessageBox(L\李四\姓名\

如:

void CStudentView::OnNameLs() {

33

}

// TODO: 在此添加命令处理程序代码 MessageBox(L\李四\姓名\

类似的消息框的语句如:

MessageBox(L\数学:80分\成绩\MessageBox(L\顶层菜单项\测试\

运行结果如图3-27所示。

图3-27 消息框

3.3.5 响应用户界面更新消息(选中/禁用)

在“事件处理程序向导”对话框中,菜单项的消息有两种: ? 命令消息COMMAND:在用户选中该菜单命令时发送。

? 用户界面更新命令消息UPDATE_COMMAND_UI:在显示菜单项之前发送。 可用与添加COMMAND消息响应类似的方法,用事件处理程序向导来为菜单项添加对用户界面更新消息的响应处理。如对“姓名”菜单的“李四”项,该消息响应的原型、消息映射宏和函数体分别为:

afx_msg void OnUpdateNameLs(CCmdUI* pCmdUI); ON_UPDATE_COMMAND_UI(ID_NAME_LS, OnUpdateNameLs) void CStudentView::OnUpdateNameLs(CCmdUI* pCmdUI) { }

函数体中的2个语句,分别是禁用和选中该菜单项。(独立的)CCmdUI类的常用成员函数有:

virtual void Enable( BOOL bOn = TRUE ); // 启用/禁用,默认为启用 virtual void SetCheck( int nCheck = 1 ); // 已选中/未选中,默认为选中

pCmdUI->Enable(FALSE); pCmdUI->SetCheck(1);

34

virtual void SetText( LPCTSTR lpszText ); // 动态设置菜单项的标题文本串 在前面3.2.2的“3.常用菜单属性”中已经说明过,在MFC应用程序中,菜单项的Enabled(启用)属性在属性窗口中设置是无效的,必须在这里的用户界面更新命令消息的响应函数中设置才有效。

菜单项的Checked(选中)属性虽然可以在属性窗口中设置,但是如果需要在程序运行时动态设置,也只能在用户界面更新的响应函数中进行。注意,SetCheck函数中的nCheck取值只能为0(未选中)、1(已选中)或2(不确定),不能使用其他非零值,不然会造成程序运行时的系统错误。因为Win32 API中的BOOL类型变量的取值FALSE = 0和TRUE = 1,标准C++中的bool类型变量的取值在VC中的实现也相当于false = 0和true = 1,所以在程序中可用布尔变量来表示nCheck的值。

3.4 快捷菜单

快捷菜单(shortcut menu)是指用户按鼠标右键时,在当前光标处弹出的浮动式菜单。由于快捷菜单的内容,可与鼠标所处的窗口及其当前内容、光标的当前位置等上下文相关,所以也被称为上下文菜单(context menu)。

3.4.1 创建快捷菜单

创建快捷菜单的步骤如下:

1.添加空菜单资源

? 在项目工作区资源视图页中资源列表的Menu项上按鼠标右键,在弹出菜单中选

“插入Menu”菜单项,参见图3-28。

? 或选“编辑\\添加资源”菜单项,在弹出的“添加资源”对话框的“资源类型”栏

的列表中,选中“Menu”项后,按右边最上面的“新建”钮,参见图3-29。

35


03界面编程1-菜单(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:华中科技大学C语言实验与课程设计上机实验报告汇总(1~8全部)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: