MFC-对话框与数据交换

本文介绍了MFC中对话框的创建过程,包括如何通过CMFCTest2Dlg类和DoModal()显示对话框。重点讲解了MFC的数据交换机制,通过CDataExchange和DDX_系列函数实现控件与数据类型的关联,简化了对话框控件的操作。同时,通过DDX_Control实现了控件与控件类的关联,允许自定义控件类处理额外的消息。
摘要由CSDN通过智能技术生成

       对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快速开发的感觉,尽管比真正的快速开发弱得多;其次,对话框提供一种叫数据交换的方法,让控件与某种数据类型关联起来,比如Edit控件与CString变量关联,对CString变量的操作间接映射到Edit控件,这种方便性是不言而喻的。

对话框的创建

对话框如何创建,它是对SDK的对话框资源的封装,说得简单一点,就是对CreateDlgIndirect的封装。

对话框的显示几乎是MFC最简单的窗体创建,用下面两句代码就可以做到:

CMFCTest2Dlg dlg;

dlg.DoModal();

       对话框资源对应一个资源ID,这个ID在对话框类构造时保存:

CMFCTest2Dlg::CMFCTest2Dlg(CWnd* pParent /*=NULL*/)

    : CDialog(CMFCTest2Dlg::IDD, pParent)

{

    ... ...

}

       DoModal只是利用这个ID创建对话框窗口,不过它还要做几件事情,让对话框融入MFC框架,总体上可以描述如下:

1.         根据资源ID从程序的资源段中读出对话框资源。

2.         将对话框的Owner窗口置为Disable

3.         调用AfxHookWindowCreate监视对话框的创建,让对话框可以进行消息映射。

4.         调用CreateDlgIndirect创建对话框。

5.         调用RunModalLoop进入消息循环。

整个过程就是这样,创建之后与其他窗体类型没有什么区别,只是要操作对话框的控件会有些麻烦,好在MFC提供了数据交换。

数据交换

       由于MFC的对话框直接封装自CreateDlgIndirect,因此对话框里面的控件并没有转换成相应的控件类,我们只能通过GetDlgItem取得控件句柄,然后使用API来操作这些控件,这又回到SDK时代了。

       为了简化对话框控件的操作,MFC提出了数据交换。这里的数据交换分两种,一种是控件与数据类型的关联;另一种是控件与控件类的关联。   

控件与数据类型怎么关联起来的呢?全靠CWnd::UpdateData(BOOL bSaveAndValidate)这个成员函数,如果bSaveAndValidateTrue,数据从控件赋给类型变量;反之,数据从类型变量赋给控件。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值