组合框包含编辑控件和列表框,是控件中比较复杂的一个。使用组合框完成对“学历”情况的输入。在组合框控件“属性”中,“学历”的号ID为IDC_DEGREE。在Data属性中添加学历列表(使用Ctrl+Enter结束当前项输入并换行),将Styles标签中是Sort(分类)选项删除,如图7.20所示。
※在使用组合框控件时,一定要在编辑时将组合框控件拉出来,(单击▼按钮可以向下拉动)。否则在运行时不能做下拉演示。
(3)控件位置调整
在VC++工具栏上右击,弹出如图7.21所示的工具栏快捷菜单,选择Dislog选项,在VC++工具栏中增加一个“编排”工具栏如图7.22所示,利用此工具栏就可以对对话框进行调整,调整后的对话框如图7.23所示。 (4)设定Tab键切换顺序
当对话框弹出的时候,每一种操作都有键盘焦点,只有具有焦点的控件才能从键盘获得输入,可以通过键盘上的Tab键来切换输入焦点。
控件总是按照一定的顺序被选择,这个顺序是可以被改变的。在VC++的菜单栏上“布局”菜单项的下拉菜单中选择“Tab 顺序”选项,此时在对话框中每个控件的左上角都会出现一个数字,这个数字就是次序号,如图7.24所示。按照需要的顺序单击控件,按Enter键结束。
(5)测试对话框设计完后,需要先测试一下,看它是否满足要求。在VC++的菜单栏上“布局”菜单项的下拉菜单中选择Test”测试”选项,VC++会将设计好的对话框显示出来,以供测试,按Esc键结束。 (6)创建对话框类
对已经设计完成的对话框资源,为了在应用程序中调用该对话框,还需要为其创建相应的对话框类。(对话框的基类为CDialog,用户为程序增加了一个对话框,就要创建一个派生新子类,对应这个对话框)。双击对话框,显示如图7.25所示的Adding a Class对话框,可以为对话框添加新类。单击OK按钮,显示如图7.26所示的New Class对话框,按图7.26输入所需内容,为对话框创建Cdialog的派生类Cmymodal类。
对话框的派生新子类 3.创建无模式对话框资源
创建无模式对话框资源和创建模式对话框资源的步骤一样,利用上述的方法创建如图7.27所示的无模式对话框,ID号为IDD_MODELESS并创建无模式对话框类Cmymodeless。 至此,已完成主窗口界面的设计,可以编译和执行程序。下面应该为应用程序添加相应对话框的基类 对话框的ID号 的程序代码。
7.2.3 代码编写
1.模式对话框的代码编写 (1)增加数据成员变量
从“查看”菜单选“建立类向导”,出现MFC Class Wizard对话框,选择Member Variables标签,如图7.28所示,确认Project列表框中的内容为mydlg,Class name列表框中的内容为CMYMODAL,在Control IDs列表框中选中“年龄”控件的ID号,并单击Add Variables按钮,弹出如图7.29所示的Add Member Variables对话框,按照图7.29所示输入相应的输入项,为“年龄”控件增加m_age数据成员变量。按照以上的方法为“人员情况”对话框中的各控件增加相应的数据成员变量。对于单选按钮控件,在Control IDs列表框中只给出一个ID号,即IDC_SEX,对话框类使用一个成员变量控制一组单选按钮控件,该组单选按钮控件对应变量的值为0、1、2、??。
MFC Class Wizard自动在(FileView选项卡,展开Header File,在)mymodal.h文件中自动增加成员变量的声明,如下所示: Public:
CMYMODAL(CWnd* pParent=NULL); // enum{IDD=IDD_MODAL}; int m_age; //年龄
Cstring m_degree; // 学历 Cstring m_live; //主要经历 Cstring m_name; //姓名 int m_sex; //性别 Cstring m_tel; //电话
同时自动在(Source File 选项卡中)mymodal.cpp文件中产生一些初始化对话框中控件的代码,其中包含控件的初始化代码,并定义了空间与数据成员变量的对应关系。Class Wizard自动生成的代码如下:
Cmymodal::Cmymodal(CWnd* pParent /*=NULL*/) : CDialog(Cmymodal::IDD, pParent) { {{AFX_DATA_INIT(Cmymodal) m_age = 30; m_degree = _T(\大本\ m_live = _T(\ m_name = _T(\张旭\ m_sex = -1; m_tel = _T(\ //}}AFX_DATA_INIT }
void Cmymodal::DoDataExchange(CDataExchange* pDX)
{ //DoDataExchange()函数定义了控件与数据成员变量的对应关系,用于实现对对话框中的内容进行数据交换和数据校验的功能。这部分是系统自动建立的。
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(Cmymodal) DDX_Text(pDX, IDC_AGE, m_age); DDX_CBString(pDX, IDC_DEGREE, m_degree);
DDX_Text(pDX, IDC_LIVE, m_live); DDX_Text(pDX, IDC_NAME, m_name); DDX_Radio(pDX, IDC_SEX, m_sex); DDX_Text(pDX, IDC_TEL, m_tel); //}}AFX_DATA_MAP }
????(见151-152页)
在(ClassView选项卡,找到)构造函数CMYMODAL∷CMYMODAL()中可以完成对成员变量的初始化工作,在此应用程序中,对各成员变量的赋值如下:(当然,不做初始化也可以)
m_age=30;
m_degree=_T(“大本”); m_live=_T(“ ”);
m_name=_T(“张旭”); m_sex=1;
m_tel=_T(“13912345678 ”);
DoDataExchange()函数定义了控件与数据成员变量的对应关系,用于实现对对话框中的内容进行数据交换和数据校验的功能。 (2)增加OnInitDialog()函数
从“查看”菜单选“建立类向导”,出现MFC Class Wizard对话框,选择Member Maps标签,确认Project列表框中的内容为mydlg,Class name列表框中的内容为CMYMODAL。然后在Object IDs列表框中选CMYMODAL选项,在Messages列表框中选择WM_INITDIALOG消息,如图7.30所示,单击Add Function按钮,为WM_INITDIALOG消息增加消息响应函数OnInitDialog(),单击Edit Code按钮,在函数中添加如下代码:
CComboBox *cmb=(CComboBox *)GetDlgItem(IDC_DEGREE); cmb->InsertString(-1,”高中”); cmb->InsertString(-1,”中专”);
向“学历”组合框中再添加两个数据项——”高中”和”中专”。 GetDlgItem()函数用于得到一个指向所需控件的指针,其函数原型如下:
CWnd* GetDlgItem(int nID) const;
通过CcomboBox类成员函数InserString(),向组合框中添加新的数据项,其函数原型如下:
int InsertString(int nIndex, LPCTSTR lpszString); 其中int nIndex指明插入组合框中数据列表的位置,当nIndex为-1时,在数据列表的最后插入,LPCTSTR lpszString为要插入的字符串。 2.模式对话框的调用
(1)增加菜单的消息响应函数
从“查看”菜单选“建立类向导”,出现MFC Class Wizard对话框,选择Member Maps标签,确认Project列表框中的内容为mydlg,Class name列表框中的内容为CMydlgView。然后在Object IDs列表框中选ID_MODAL选项,在Messages列表框中选择COMMAND消息,单击Add Function按钮,为COMMAND消息增加消息响应函数OnModal(),如图7.31所示,单击Edit Code按钮,在函数中添加如下代码:
Cmymodal mymodal; //为对话框创建一个对象,相当于添加对话框变量。 if(mymodal.DoModal()==IDOK)
{
mymodal.MessageBox(“输入信息正确吗?”, “个人情况”,MB_YESNO); }
对于对话框的调用分成两步,首先要构造一个对话框对象——CMYMODAL mymodal,然后调用对话框对象的成员函数DoModal()来装载对话框资源,显示对话框,并管理与对话框对象的交互,直到单击对话框中的OK或Cancel按钮结束。调用MessageBox()函数弹出消息框,用于确认输入信息的正确性。
(2)添加mymodal.h的说明(这里正确添加头文件很重要,这个添加如果不做,前一步操作后编译就会出错)
在mydlgView.cpp中用到了COMYMODAL类,因此需要将COMYMODAL类的头文件的说明加入到(FileView选项卡Source File下面的)mydlgView.cpp中: #include “mymodal.h”
编译并执行程序,单击“对话框”菜单中的“模式对话框”子菜单时,弹出“人员情况” 对话框,在其中输入所需信息后,单击OK按钮,弹出如如图7.32所示的消息框,确认输入正确后,单击“是”按钮。6/3
建立模式对话框的步骤:
1. 建立Menu.exe程序的工程和框架文件。 2. 添加一个新的菜单项——“对话框”。 3. 添加的菜单快捷键。 4. 添加新的对话框。 5. 在对话框中添加控件。 6. 设定Tab键切换顺序。
7. 创建对话框类。如果是在单文档中调用对话框则需要创建对话框类。如果是单独使
用对话框则不需要创建对话框类。 8. 为控件增加数据成员变量。 9. 完成对成员变量的初始化工作。
10. 增加OnInitDialog()函数。完成对话框的初始化。 11.添加对话框变量。模式对话框的调用,增加菜单的消息响应函数,激活模式对话框。 12. 添加mymodal.h的说明 1. 无模式对话框的代码编写和调用
调用无模式对话框,需要在子对话框类中编写自己的公有构造函数。在调用时,通过调用该构造函数构造对话框对象。然后调用对话框对象的Create()成员函数加载对话框资源,如果对话框资源具有WS_VISIBLE属性,那么对话框立即显示,否则需要调用ShowWindow()函数显示该无模式对话框。对于无模式对话框的关闭,需要调用DestroyWindow()函数删除该对话框。
(1)无模式对话框函数代码的编写
在mydig的Workspace窗口的Class View的资源列表中,右击Cmymodeless,弹出如图7.33所示的快捷菜单,在菜单中选择Add Member Variable选项,出现Add Member Variable对话框,按照图7.34所示添加数据成员变量m_parent,用于存放产生无模式对话框的父窗口。在构造函数中对进行初始化,其代码如下: m_parent=pParent;
错误“error C2582: ' CSomeClass ' : 'operator =' function is unavailable”是指在程序中出现了CSomeClass类对象的赋值操作,但类中却没有“=operator”操作的声明和实现,如“sc = class_list.GetPrev(pos);”。