一个月学会VC++2010 5.对话框的数据交换
对于正常的应用项目开发来说,入门显然有两块比较重要的:如何方便的设计界面,业务对象如果与界面交互数据。只有解决这两个问题,你才能真正开始动手。很显然,完全动态的用代码来一个个的在View中写控件这种方式,明显的属于高手范畴,很多人号称完全用记事本就能写程序。不过,从工业角度来说,这种炫耀的方式,显然是很奇怪的,为什么不能用最简单的办法?
VC里我们唯一能够看到的可视化设计器,是对话框设计器。老实说,Ribbon设计器仿佛也不错,但你总不可能将所有界面都放到Ribbon工具栏里吧?虽然这并不是不可行的,你可以想象一下,整个应用就由Ribbon工具栏组成----微软曾经有例子在Ribbon工具栏实现一个计算器,作为一个反面的例子,来说明“不能这样使用Ribbon”,因为整体看起来确实会显得太奇怪。
所以对每一项主要的功能,对话框还是无法绕过的,我目前所知,用于操纵对话框的类,包括:CDialogEx,CFormView,CMFCPropertyPage几种,最直观的当然是对话框类。
所以这一节我们讲解对话框的数据交换:我们怎样在对话框类中创建我们的对象与实际的对话框控件联系起来,从而获取对话框控件的值或者为对话框控件设置相应的值。只有两种方法,一种是DDX数据交换机制,一种是GetDlgItem方式。
前者实际上是建立一个数据交换机制,当你执行UpDateDate()的时候,所有控件都使用当前用户的输入,更新你绑定的变量。而执行UpdateData(false)的时候,则反过来,你所有绑定的变量值都将传递给控件。这里“正反”记忆的方式:updateData的意思是控件更新你的数据,这是其基本功能,带false参数自然是反向操作。
后者,则是直接获取或者设置某个对话框控件的值,这个需要带控件的ID参数。
如何选择呢?实际上,DDX机制我们多可以通过类向导简便的完成,不需要考虑太多,只要记得及时或者需要的时候UpdateData就行了,我们当然选择这种方式,另一种方式我们就无需理会了,节约脑力。
那么我们考虑先看看导入日线对话框的外观:
用户在编辑浏览控件中,选中文件,那么我们需要一个变量绑定这个控件的值。选中这个控件,右键,添加变量,会出现下面的选项窗体:
请注意“类别”有“Value”和”Control”两种选择,前者表示我们只关心这个控件的值,无论是字符串或其他类型,此刻是一个CString对象;后者则是要求替我们创建一个完整的对象,对应这个控件,将是一个CMfcEditBrow的实例。同时也注意生成的变量名称命名风格,成员以m_开始。
完成之后,看看代码有什么变化:
1、首先,头文件中对话框类增加了一个成员:
CString m_FilePath;
2、其次,源文件中,构造方法对这个成员初始化
CQuoteDialog::CQuoteDialog(CWnd* pParent /*=NULL*/)
: CDialogEx(CQuoteDialog::IDD, pParent)
, m_FilePath(_T(""))
, m_Info(_T(""))
, m_lastday(_T(""))
{
}
3、源文件中,在DoDataExchange里面自动添加了相应的映射,这个方法显然是在UpdateDate时会运行的。
void CQuoteDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_MFCEDITBROWSE_QUOTE, m_FilePath);
DDX_Text(pDX, IDC_STATIC_INFO, m_Info);
DDX_Control(pDX, IDC_PROGRESS_QUOTE, ProgressBar);
DDX_Text(pDX, IDC_STATIC_LASTDAY, m_lastday);
}
当然,不需要我们做其他的事情,我们仅仅需要理解这些简单的操作,一个变量的值和我们对话框类的一个成员就绑定起来,不过需要你手工使用UpdateData来双向的交换。对于这些代码的阅读,我们仍然和针对消息映射的处理一样,仅从字面上理解:
DDX_Text:在控件和这个成员变量,交换值。
DDX_Control:完整的复制控件内容和到相应的控件对象。
很明显,这样的方法都包括控件ID和类成员两个参数,事实上是建立双方的映射关系。不要继续探究,那样很费脑力且对你的工作、思考、理解帮助不大。
那么我们看看怎样使用这个变量
1、获取:任何时候,我们只要下面两行语句就可以获取最新的值:
UpdateDate()
然后使用m_FilePath
2、设置:
m_FilePath=“C:\sample.dad”;
UpdateData(false);
这样,我们在使用对话框编程的时候,最基本的问题就解决了:这是一种老式的、手工的、简单的数据绑定方式,但它能够正常工作。
我们小结一下,在界面开发模式方面,最终的选择:
1、我们使用单文档结构创建项目。
2、我们使用Ribbon在各项功能间导航
3、我们让视图类、文档类无事可做,通过在视图中切换显示子对话框,来实现不同功能的界面切换,所有界面开发基于对话框。
4、在资源视图中设计对话框,实际上是保留了对话框的位置、大小、颜色等信息,其中包括的各个控件,以及这些控件的属性,和代码无关,是纯粹的数据文件。
5、由于对话框的布局方式比较原始,因此我们默认让多数对话框居中显示,少数需要适应主窗口大小的对话框,使用EasySize解决。
6、我们使用DDX数据交换机制,绑定类成员和实际的控件。
这种模式,已经能做出比较专业的界面,同时也最充分的利用了VS提供的各类工具,比如Ribbon设计器、对话框设计器、类向导。
另外,遇到一些简单的问题,没有必要“冰天雪地裸体旋转三百六十度跪求各位大大”,或者扮作娘们“小女子有个弱弱的问题有请各位大哥……”,稍稍动点脑筋,在MSDN里基本上都能解决:
1、VC的示例:
http://archive.msdn.microsoft.com/vcsamplesmfc
2、VC帮助:
http://msdn.microsoft.com/library/60k1461a(VS.100).aspx
作者 玄歌
补充:软件开发 , Vc ,