【上机练习8】:通过建立一个具有禁止和启用功能的菜单的应用程序来完成在单文档界面下对菜单项的操作。通过选择“启用/禁止”命令,完成对相应菜单项的启用和禁止功能的操作。
1. 运行程序,效果如下图
1. 选择“启用”菜单,效果如下图
2. 选择“禁止”菜单,效果如下图
4.要求按图示,在菜单中加一条分隔线。 操作步骤如下:
1.利用AppWizard向导,创建SDI应用程序。文件名为chap8。 2.在ResourceView的资源列表中,单击Menu(菜单)旁边的“+”,再双击IDR_MAINFRAME
选项。在右侧编辑区中将显示建立的菜单资源。
3.双击空白的虚框,打开菜单属性对话框,输入主菜单标题“禁止/启用(&J)”。
4.在已建立的菜单项下出现了新的空白虚框,选中空白虚框,输入“菜单项一”,ID号为ID_NO1。
5.按上面的方法输入“菜单项二”,ID号为ID_NO2。 6.增加一条分隔线。再建立新的菜单项“禁止”, ID号为ID_NO、“启用” ID号为ID_USE. 7.添加成员变量。在ClassView选项卡,并展开其选项,双击chap8选项。在CMainFrame选项上右击,在快捷菜单中选Add Member Variable(添加变量) 命令,打开“添加变量”对话框。在对话框中输入变量名—status、变量类——BOOL,选择变量属性——private。此时会看到在Cchap7Doc下面自动添加了一个变量status。变量status用来作为ID_NO1和ID_NO2的状态识别变量。 8.为“启用”菜单项添加成员函数OnUse()。在MFC Class Wizard对话框中,选Message Maps选项卡,进行如下设置:
选择Class name: CMainFrame Object IDs: ID_USE Messages:COMMAND 添加成员函数OnUse(), 代码如下: //TODO
status=TRUE;
9.为“禁止”菜单项添加成员函数OnNo()。设置同上。
Class name: CMainFrame Object IDs: ID_NO Messages:COMMAND 代码如下: //TODO
status=FALSE;
10.为“菜单项一”菜单项添加成员函数OnUpdateNo1()。设置同上。
Class name: CMainFrame Object IDs: ID_NO1 Messages:UPDATE_COMMAND_UI 代码如下: //TODO
switch(status)
{ case FALSE: //状态标识为“禁止”
pCmdUI->Enable(FALSE);//对应菜单为“禁止”状态
break;
case TRUE: //状态标识为启用
pCmdUI->Enable(TRUE);// 对应菜单为“启用”状态 break; }
11.同时为“菜单项二”菜单项添加成员函数。
Class name: CMainFrame Object IDs: ID_NO2 Messages:UPDATE_COMMAND_UI 代码如下: //TODO
switch(status)
{ case FALSE: //状态标识为“禁止”
pCmdUI->Enable(FALSE);//对应菜单为“禁止”状态
break;
case TRUE: //状态标识为启用
pCmdUI->Enable(TRUE);// 对应菜单为“启用”状态 break;
}
※ 本题并没有对“菜单项一”和“菜单项二”的功能进行具体设置。只是对菜单项状态进行了禁止和启用的设置。
第7章 对话框
对话框在Windows系统环境中应用很普遍,它通常作为应用程序与用户交互的场所,是用户向应用程序传递信息的工具。对话框是一个特殊类型的窗口,任何对窗口进行的操作,均可在对话框中进行操作。与Visual C++的其他窗口相比,对话框的最大优点还在于它更易于放置控件来和用户进行交互。 7.1对话框效果要求
对话框主要分为模式对话框和无模式对话框。模式对话框是指这种对话框出现时,它的父窗口将暂时失效,只有处理完对话框要求的工作后,才会将控制权交回给父窗口。无模式对话框不会使父窗口失效,因此,无模式对话框出现时,可以继续执行父窗口的操作。无模式对话框使用的很少,大部分使用的是模式对话框。
本例mydlg应用程序讲述对话框的开发过程。完成对模式对话框和无模式对话框的调用,同时完成对话框与应用程序的数据交换。
在mydlg应用程序中,要求建立如图7.1所示的应用程序界面,其具体设计要求如下: (1)在菜单栏中,增加“对话框”菜单项,及“模式对话框”和“无模式对话框”子菜单项。
(2)单击“模式对话框”菜单项,调出一个“人员情况”模式对话框,如图7.2所示。可以输入工作人员的姓名、年龄、性别、学历、联系电话、个人主要经历等信息。
(3)单击“无模式对话框”子菜单项,调出一个无模式对话框,如图7.3所示,可以在无模式对话框和父窗口间切换。当单击OK按钮时,无模式对话框显示“您正在使用无模式对话框!”,当用鼠标单击其父窗口时,无模式对话框显示“您已经离开无模式对话框!”。
7.2 程序实现过程
7.2.1 创建工程
按以下步骤建立Menu.exe程序的工程和框架文件:
(1)创建工程,选择AMFC AppWizard(exe)选项,输入文件名mydlg和保存位置。“确定”。
(2)进入MFC应用程序向导步骤1,选择“单个文档”。 (3)以下设置全部选择为默认。 (4)单击“完成”。 (5)单击“确定”。
AppWizard将完成应用程序的自动生成。 7.2.2 可视化设计 1.主窗口菜单栏的设计
在应用程序的菜单中,添加一个新的菜单项——“对话框”。 在ResourceView的资源列表中,单击Menu旁边的“+”,再双击IDR_MAINFRAME选项,如图7.5所示。打开菜单资源编辑器,显示如图7.6所示的默认菜单资源。双击该菜单的空菜单项,在弹出的对话框中按图7.7输入,增加一个“对话框”菜单项。
在“对话框”下拉菜单底部有一个空选项,双击它,定义两个新的菜单选项,如图7.8所示新添“模式对话框”和“无模式对话框”两个新的菜单选项。模式对话框的ID号为:ID_MODAL, “无模式对话框”的ID号为:ID_MODELESS。
设计了菜单栏后,还需要对新添加的菜单增加快捷键。在ResourceView的资源列表中,
单击Accelerator旁边的“+”,再双击IDR_MAINFRAME选项,打开快捷键资源编辑器,如图7.9所示。在快捷键资源编辑器的最下面一行右击,在弹出的菜单中选择New Accelerator(新建加速栏)选项,显示快捷键属性对话框,按如图7.10所示输入“模式对话框”和“无模式对话框” 菜单项所对应的快捷键的属性。“模式对话框”为Ctrl+M,“无模式对话框”为Ctrl+L。
创建对话框的方法有两种:
1)利用应用程序向导直接建立基本对话框。
2)在单文档或多文档的方式下,在资源中选项卡中添加对话框。 2.创建模式对话框资源
可以通过下面的步骤建立对话框,设计完成后如图7.11所示。
(1)在ResourceView的资源列表中,右击Dialog选项,弹出如图7.12所示的快捷菜单,在快捷菜单中选择InsertDialog选项,添加新的对话框如图7.13所示。
在对话框资源编辑器中,右击对话框,在弹出的快捷菜单中选择“属性”,设置对话框的属性,如图7.14所示,将对话框的ID项内容更改为IDD_MODAL,在“标题”项中填入“个人情况”,还可以设置字体等。
(2)在对话框中添加控件
控件是在系统内部定义的能够完成特定功能的控制程序单元。在应用程序中使用控件不仅简化了编程,还能完成常用的各种功能。为了更好地发挥控件的作用,用户应理解和掌握控件的属性、消息以及创建和使用的方法。关于控件工具栏,我们在第四章已经介绍过。
可以使用控件工具栏为对话框中添加控件。 ①使用静态文本控件
通常用来显示一段字符串。如“姓名”、“年龄”、“性别”、“联系电话”、“学历”、“主要经历”等,可以通过静态文本控件的属性中的标题来设置。 ②使用编辑控件
编辑控件通常让用户输入文字或数据、或进行修改等工作。使用编辑控件在对话框中添加“姓名”、“年龄”、“联系电话”、“主要经历”等的输入编辑框。利用编辑框的属性,在ID栏中输入一个有意义的新的ID号。其中“姓名”为IDC_NAME、“年龄”为IDC_AGE、“联系电话”为IDC_TEL、 “主要经历”为IDC_LIVE。如图7.17所示就是编辑控件的属性对话框。还可以在其中设置文本对齐方式、文本多行显示及口令输入方式等。对于“主要经历”应该设置文本多行显示。 ③使用分组框和单选按钮
分组框和单选按钮在前面我们已经使用过,单选按钮通常被放置在分组框内。任何将这些毫无关系的单选按钮组成一组呢?将一组第一个放置单选按钮的Group(组)属性设置为复选,就可以实现在一组单选按钮中,每次只能有一个按钮被选中。
需要添加“性别”分组,添加一个分组框,其属性如图7.18所示。在分组框中添加两个单选按钮,分别对应“男”和“女”,按照图7.19设置属性,其中“男”单选按钮的Group(组)属性设置为复选。 ④使用组合框控件