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

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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是面向Windows操作系统的C++应用程序框架,它提供了大量的库和函数,简化了程序开发过程,提高了开发效率。其中,基于对话框的程序开发是MFC应用程序开发中的一种常见方式,本文将介绍基于对话框的MFC程序开发经验以及常用函数。 一、对话框的创建 1. 创建对话框资源文件 在Visual Studio中创建MFC项目时,可以选择“对话框”模板,这样会自动生成一个对话框资源文件。如果需要手动创建,可以在资源视图中右键单击“对话框”文件夹,选择“添加”->“对话框”,然后在弹出的对话框中设置对话框的属性,如对话框标题、大小等。 2. 创建对话框 要在程序中使用对话框,需要创建对话框。在资源视图中双击对话框资源文件,Visual Studio会自动生成一个对话框,一般以CDlg开头。在对话框中可以添加响应对话框消息的函数,如OnInitDialog()、OnOK()等。 3. 显示对话框 要显示对话框,可以在程序中创建对话框对象,并调用DoModal()函数。例如: ``` CDlgDemo dlg; dlg.DoModal(); ``` 这样就会显示一个名为“DlgDemo”的对话框。 二、常用控件 在对话框中可以添加各种控件,如按钮、文本框、列表框等。以下是MFC中常用的控件及其名: 1.按钮:CButton 2.文本框:CEdit 3.单选按钮:CRadioButton 4.多选框:CCheckBox 5.列表框:CListBox 6.组合框:CComboBox 7.进度条:CProgressCtrl 8.滚动条:CScrollBar 9.静态文本:CStatic 三、常用函数 1.获取控件对象对话框中,可以使用GetDlgItem()函数获取对应控件的指针。例如: ``` CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1); ``` 这样就可以获取ID为IDC_BUTTON1的按钮控件的指针。 2.设置控件文本 可以使用控件对象的SetWindowText()函数设置控件的文本。例如: ``` pBtn->SetWindowText(_T("Click Me")); ``` 这样就会将按钮的文本设置为“Click Me”。 3.获取控件文本 可以使用控件对象的GetWindowText()函数获取控件的文本。例如: ``` CString strText; pBtn->GetWindowText(strText); ``` 这样就可以获取按钮的文本并存储在strText变量中。 4.控件消息响应 在对话框中可以添加响应控件消息的函数,例如OnClickButton1()。在函数中可以使用控件对象的GetCheck()、SetCheck()等函数获取或设置控件的状态。例如: ``` void CDlgDemo::OnClickButton1() { CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1); BOOL bChecked = pBtn->GetCheck(); pBtn->SetCheck(!bChecked); } ``` 这样就可以实现点击按钮时切换按钮的选中状态。 总之,基于对话框的MFC程序开发是一种简单易用的方式,可以通过添加各种控件和响应函数来实现各种功能。以上介绍的是基本的开发经验和常用函数,更深入的内容需要更多的学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值