您的位置:首页 > 其它

MFC学习笔记——CDialog(创建对话框类和添加控件变量)

2016-07-15 16:46 330 查看
转自 http://www.jizhuomi.com/school/c/157.html

用过VC++6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDialogEx类。

创建对话框类

1.在ResourceView的【Dialog】节点上右键,然后在右键菜单中选择【Insert Dialog】创建一个新的对话框模板,ID就使用默认的IDD_DIALOG1。

2.在中间区域会显示新建的对话框模板,然后选中此对话框模板,点右键,在右键菜单中选择【Add Class】。

3.选择“Add Class”后会弹出一个对话框,在对话框中“Class name”下的编辑框中写入自定义的类名就可以了,例如CMyDialog。

4.最后点“Finish”完成。

最终你就可以在中【类视图】和【解决方案视图】看到新生成的对话框类CMyDialog了。CMyDialog类同样派生于CDialogEx类。

!注意,一般类名都以C打头,又比如,CTestDlg。但有时也只是在类名最后加上Dialog,如RunCashDialog。

为对话框中的控件添加变量

-静态文本框只是为了说明意义,它们是不会变的,我们就不为它们添加变量了。

-按钮控件是用来操作的,这里也不为它们添加变量。

-编辑框中的数据可能会经常变化,有必要为它们每个控件关联一个变量。

!根据需要添加变量,不是每个控件都需要添加变量的。有些即使需要读取,也可以直接使用GetDlgItem(ID)来获取它的句柄,从而对它进行操作,但显然这样做要麻烦一些。

下面介绍添加变量的过程:

1.在想要为其添加变量的控件上点右键,在右键菜单中选择“Add Variable”。弹出添加成员变量的向导对话框。

2.- -若想添加的是控件变量,则选中“控件变量(o)【Control Variable】”。此时变量类型是不可变的。



- -若想添加的是值变量,则不选中“控件变量(o)【Control Variable】”。此时变量类型可以更改。



3.在“Variable name”中写入自定义的变量。

4.点击“完成”。

添加变量之后,在之前生成的对话框的类中,会自动生成一个该变量,并自动生成在类的构造函数中初始化的代码。

对话框类的数据交换和检验

原因:

在程序运行界面中,用户往往会改变控件的属性,例如,在编辑框中输入字符串,或者改变组合框的选中项,又或者改变复选框的选中状态等。

实现:

控件的属性改变后MFC会相应修改控件关联变量的值。这种同步的改变是通过MFC为对话框类自动生成的成员函数DoDataExchange()来实现的,这也叫做对话框的数据交换和检验机制

PS:被转载的的原文中,使用的是VS2010,而我使用的VS2013,不知是否为版本原因,我添加了控件变量后,DoDataExchange()函数中并没有自动增加DDX_Text语句。当然,也有可能是由于添加的变量类型不同的原因,这个后面遇到了会再补充。

我们为三个编辑框添加了变量以后,在AdditionDlg.cpp中CAdditionDlg的DoDataExchange()函数的函数体中多了三条DDX_Text调用语句。

void CAdditionDlg::DoDataExchange(CDataExchange* pDX)
{
// 处理MFC默认的数据交换
CDialogEx::DoDataExchange(pDX);
// 处理控件IDC_SUMMAND_EDIT和变量m_editSummand之间的数据交换
DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand);
// 处理控件IDC_ADDEND_EDIT和变量m_editAddend之间的数据交换
DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend);
// 处理控件IDC_SUM_EDIT和变量m_editSum之间的数据交换
DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);
}


Addition程序为例简单说下数据交换机制。如果我们在程序运行界面中输入被加数,则通过CAddition的DoDataExchange()函数可以将输入的值保存到m_editSummand变量中,反之如果程序运行中修改了变量m_editSummand的值,则通过CAddition的DoDataExchange()函数也可以将新的变量值显示到被加数的编辑框中。

但是这种数据交换机制中,DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。

但是这种数据交换机制中,DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。

CDialogEx::UpdateData()函数

原型为:BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

参数:bSaveAndValidate用于指示数据传输的方向,TRUE表示从控件传给变量,FALSE表示从变量传给控件。默认值是TRUE,即从控件传给变量。

返回值:CDialogEx::UpdateData()函数的返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE。

另外:

DDX:Dialog Data Exchange 表示对话框数据交换

DDV:Dialog Data Valid 表示对话框数据有效性

DoDataExchange函数

void CRegisterDialog::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CRegisterDialog)

DDX_Control(pDX, IDC_INCOME, m_ctrlIncome);

DDX_LBString(pDX, IDC_INCOME, m_strIncome);

DDX_CBString(pDX, IDC_KIND, m_strKind);

DDX_Check(pDX, IDC_MARRIED, m_bMarried);

DDX_Text(pDX, IDC_NAME, m_strName);

DDX_Radio(pDX, IDC_SEX, m_nSex);

DDX_Text(pDX, IDC_UNIT, m_strUnit);

DDX_Radio(pDX, IDC_WORK, m_nWork);

DDX_Text(pDX, IDC_AGE, m_nAge);

DDV_MinMaxUInt(pDX, m_nAge, 16, 65);

//}}AFX_DATA_MAP

}


DoDataExchange只有一个参数,即一个CDataExchange对象的指针pDX。

在该函数中调用了DDX函数来完成数据交换,调用DDV函数来进行数据有效检查。

在缺省的CDialog::OnInitDialog中调用了UpdateData(FALSE),这样,在对话框创建时,数据成员的初值就会反映到相应的控件上。若用户是按了OK(确定)按钮退出对话框,则对话框认为输入有效,就会调用UpdataData(TRUE)将控件中的数据传给数据成员。图5.9描绘了对话框的这种数据交换机制。



属性页DoDataExchange函数

使程序员得以将属性页值与控件中的实际属性值链接。若要建立链接,必须将适当的属性页字段映射到它们各自的控件属性。

使用属性页DDP_函数实现这些映射。DDP_函数的运行与标准MFC对话框中使用的 DDX_函数相似,但有一处例外。除对成员变量的引用外,DDP_函数还使用控件属性的名称。下面是属性页的DoDataExchange函数中的一个典型项。

DDP_Text(pDX,IDC_CAPTION,m_caption,_T(“Caption”));

此函数使用DDP_Text函数将属性页的m_caption成员变量与Caption相关联。

插入属性页控件后,需要使用DDP_Text函数在属性页控件IDC_CAPTION与实际控件属性Caption之间建立链接(如前所述)。

其他对话框控件类型(如复选框、单选按钮和列表框)也可以使用DDP函数。表6-4列出了完整的属性页DDP_函数集及各函数的作用。



http://book.51cto.com/art/200708/54961.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: