八、为对话框添加类、对象(变量)以及消息响应函数


1.   为对话框添加类:

       a. 四种方法:

            *1. 在对话框空白处右键→建立类向导;

            *2. 在对话框空白处双击(推荐使用!方便快捷);

            *3. 菜单栏→查看(View)→建立类向导;

            *4. 快捷键Ctrl + W;

        b. 如果该对话框还没建立过类,则会弹出添加类对话框(Adding a Class),直接选择OK即可;

        c. 在添加类过程中(即在New Class对话框中)我们需要为在图形界面下设计的对话框取一个类名,这里我们取CStudentDlg:

             i.   C表示Class,即类,系统会为我们自动生成.cpp文件,其名字会去掉C;

             ii.  Dlg就是Dialog的缩写;

        d. 在创建时可以看到Dialog ID系统已经自动填写了IDD_STUDENTMANAGEMENT,即已经自动将创建的类和我们所设计的对话框关联起来了;

        e. 修改.cpp文件名:

             i.   在文件名过长不方便时应该直接修改类名;

             ii.  在文件名和已存在工程中的文件名冲突时可以考虑修改.cpp文件名,选择Change按钮进入修改即可;


2.   小结——从图形到类对象的实质:

       a. 即图形只是一种抽象,但是到了程序里面必须是要以数据描述的;

       b. 因此要为图形对象建立类,完成从图形到数据描述(即代码描述)的过渡;

       c. 而在MFC中建立图形和类之间的联系的实质就是将类、变量等直接和图形的ID建立联系;

       d. 也就是说类名、变量名等是对数据的描述,而ID则是对图形的描述,即前者是数据的代号,而后者是图形的代号;

    

3.   为对话框中的控件添加成员变量:

       a. 在图形界面下控件是对话框的一部分,因此在数据描述中,空间就应该是对话框类的成员变量,即成员对象;

       b. 打开类向导后,选择刚建立的对话框类,即ID为IDD_STUDENTMANAGEMENT,类名为CStudentDlg,选择Member Variable选项卡;

       c. 里面已经直接列出了对话框中包含的控件的ID,但是添加的成员变量还是空白的;

       d. 为每个ID所代表的的控件添加成员变量(即将图形界面下的控件和数据层面上的成员变量建立联系),两种方法:

            *1. 用鼠标点击相应的ID号,然后点击Add Variable;

            *2. 直接双击目标ID号;

       e. 接着就是输入各个成员变量名即可,而对于类型,系统已经根据控件的类型为你自动选好了:

            i.   编辑框对应变量的类型可定是CString的,因为框中输入的肯定是字符串;

            ii.  单选框对应变量的类型是int型的,这样可以方便使用switch语句判断用户选择的是哪个单选框,规则是按照Tab顺序0, 1, 2递增;

            iii. 复选框对应变量的类型是BOOL型的,是typedef过的int,同样也定义了TRUE和FALSE宏,其值分别为int型的1和0;

            iv.  列表和组合框对应的变量类型是CString的,因为框中显示的内容都是字符串;

            v.  对于字符串变量,可以在Maximum Characters中填写字符串的最大长度;

       f.  编辑完成确定后就会自动在类代码中生成这些变量的定义声明,同时会自动生成CStudentDlg类的构造函数:

CStudentDlg::CStudentDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStudentDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CStudentDlg)
m_art = FALSE;
m_clanguage = FALSE;
m_duty = _T("");
m_english = FALSE;
m_grade = -1;
m_ID = _T("");
m_major = _T("");
m_math = FALSE;
m_name = _T("");
m_philosophy = FALSE;
m_physics = FALSE;
//}}AFX_DATA_INIT
}
             i.   可见默认构造函数是将所有的内容都初始化为空的;

             ii.  _T宏,表示字符串所用的字符集(以TCHAR *str = _T("abc")为例):

                  *1. 在ANSI模式下编译就是:char *str = "abc";

                  *2. 在UNICODE模式下编译就是:wchar_t *str = L"abc";

                        其中_t和L都表示UNICODE字符集;

       g. 自动生成数据交换函数DoDataExchage:

void CStudentDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStudentDlg)
DDX_Check(pDX, IDC_ART, m_art);
DDX_Check(pDX, IDC_CLANGUAGE, m_clanguage);
DDX_LBString(pDX, IDC_DUTY, m_duty);
DDX_Check(pDX, IDC_ENGLISH, m_english);
DDX_Radio(pDX, IDC_GRADE, m_grade);
DDX_Text(pDX, IDC_ID, m_ID);
DDX_CBString(pDX, IDC_MAJOR, m_major);
DDX_Check(pDX, IDC_MATH, m_math);
DDX_Text(pDX, IDC_NAME, m_name);
DDV_MaxChars(pDX, m_name, 50);
DDX_Check(pDX, IDC_PHILOSOPHY, m_philosophy);
DDX_Check(pDX, IDC_PHYSICS, m_physics);
//}}AFX_DATA_MAP
}
             i.   该函数将会在填写完对话框中的内容并点击OK退出对话框时调用;

             ii.  作用就是将对话框内填写的数据存入各个控件对象中以实现对用户数据的读取,专业地将就是实现后台和对话框的数据交换;

             iii. DDX_就是数据交换函数,即Do Data Exchange的缩写,从参数可以看出将指定ID号所代表的控件中的数据存入指定的成员变量中去;

             iv. 其还有一个功能,就是检验用户输入的数据是否合法,比如在为控件添加变量时如果设置过字符串的最大长度,则在这里则会以函数的形式体现出来,比如这里的DDV_MaxChars函数,用来检验交换而来的m_name变量中字符数是否超过50个;

             v.  所有数据检验函数都是以DDV_开头的;

             vi. DoDataExchange函数不是人为调用的,而是由UpdateData函数调用的,即对数据进行更新的一个函数,这很显然,当用户输入完对话框中的内容并按OK按钮退出时就应该调用UpdateData函数,其间接调用DoDataExchange函数实现用用户输入的数据对程序中的数据进行更新;


4.   为列表框和组合框添加初始化内容:

       a. 即当用户打开对话框时,对话框对象需要自动对列表框和组合框中的内容进行初始化,即提供选项供用户选择;

       b. 该项工作在OnInitDialog函数中完成,它同样也是一个消息相应函数,相应的消息是WM_INITDIALOG;

       c. 该消息一般会在打开对话框时发送给相应的对话框;

       d. 因此可以为相应对话框类添加相应该消息的函数,该函数理所当然是对话框类的成员函数;

       e. 在资源视图中CStudentDlg类上右键→Add Windows Message Handler..(即添加Windows消息响应);

       f.  然后在左侧双击WM_INITDIALOG将该消息响应添加到右侧存在的消息响应中,此时已经为该类添加了一个响应WM_INITDIALOG消息的函数了;

       g. 最后点击Edit Existing进入编辑该函数的代码区;

       h. OnInitDialog函数实现:

BOOL CStudentDlg::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here

//GetDlgItem函数的作用即使返回指定ID号的控件的指针
//由于该函数返回的指针类型是控件类的父类,即CStudentDlg类
//因此在这里需要进行强制类型转换(扩展转换,但是是安全的)
CListBox *pList = (CListBox *)GetDlgItem(IDC_DUTY);
pList->AddString("普通成员");//控件的通用成员函数,向列表框和组合框中添加新的字符串项目
pList->AddString("班长");
pList->AddString("副班长");
pList->AddString("学习委员");
pList->AddString("生活委员");

CComboBox *pCom = (CComboBox *)GetDlgItem(IDC_MAJOR);
pCom->AddString("通信工程");
pCom->AddString("计算机应用");
pCom->AddString("电子技术");
pCom->AddString("图书管理学");

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告