CDialog::DoDataExchange(pDX);这句在下面一段程序中的作用是什么?

jylyxin 2009-07-01 06:12:18
void CWriteTableDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWriteTableDlg)
DDX_Text(pDX, IDC_IMEI1, m_imei1);
DDX_Text(pDX, IDC_IMEI2, m_imei2);
DDX_Text(pDX, IDC_IMEI3, m_imei3);
DDX_Text(pDX, IDC_BTADDR1, m_btaddr1);
DDX_Text(pDX, IDC_BTADDR2, m_btaddr2);
DDX_Text(pDX, IDC_BTADDR3, m_btaddr3);
DDX_Text(pDX, IDC_PRODUCT, m_strProduct);
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
上面一段程序中CDialog::DoDataExchange(pDX);是什么作用?为什么这里还要调用基类中的DoDataExchange函数?
...全文
2333 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangkele8 2012-03-08
  • 打赏
  • 举报
回复
一直不知道是干什么的,学习了。
xxuuyyoonngg 2011-09-06
  • 打赏
  • 举报
回复
学习学习。。。
xiaokong301 2010-09-18
  • 打赏
  • 举报
回复
俺是菜鸟,来学习了
Teresa_F 2010-08-22
  • 打赏
  • 举报
回复
呵呵~~ 学习了~~ 谢谢~~~
ymyuanye 2010-07-22
  • 打赏
  • 举报
回复
学习了。。谢谢!
杂货铺X1 2009-07-16
  • 打赏
  • 举报
回复
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

}

可以看出,该函数中的代码是由ClassWizard自动加入的。DoDataExchange只有一个参数,即一个CDataExchange对象的指针pDX。在该函数中调用了DDX函数来完成数据交换,调用DDV函数来进行数据有效检查。

当程序需要交换数据时,不要直接调用DoDataExchange函数,而应该调用CWnd::UpdateData。UpdataData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。

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

文章出处:http://www.diybl.com/course/3_program/vc/vc_js/2008422/110902.html
zxfwizard 2009-07-02
  • 打赏
  • 举报
回复
1楼正解,话不多但是经典
softist 2009-07-01
  • 打赏
  • 举报
回复
严重同意楼上。
xshydy 2009-07-01
  • 打赏
  • 举报
回复
用class wizard来重载DoDataExchange函数时,自动地会把CDialog::DoDataExchange(pDX)加进来,理由应该如softist所讲
当然,用class wizard重载任何函数时,总会调用基类的对应函数,删掉好像对程序没什么影响
请达人出场解释一下
softist 2009-07-01
  • 打赏
  • 举报
回复
>>上面一段程序中CDialog::DoDataExchange(pDX);是什么作用?为什么这里还要调用基类中的DoDataExchange函数?

DoDataExchange(pDX)是控件与变量之间交换数据的函数。供UpdateData()等函数调用。

CDialog的DoDataExchange函数没有实装内容,调用不调用都一样。既然调用不调用都一样,为什么这里还要调用基类中的DoDataExchange函数呢?我想大概是处于这样的考虑。
假如 CDialog的派生类CDialog1, CDialog1的派生类CDialog2。CDialog1和CDialog2里都有数据交换。
那么,在CDialog2的DoDataExchange函数里应该调用一下CDialog1的DoDataExchange函数。
CDialog::DoDataExchange被调用,是class wizard把CDialog和CDialog的派生类们一同对待的原因。
当然也是微软的一种偷懒的做法。

hurryboylqs 2009-07-01
  • 打赏
  • 举报
回复
DDX 数据交换宏
FireBirdCN 2009-07-01
  • 打赏
  • 举报
回复
DataExchange
顾名思义
数据交换
  • 打赏
  • 举报
回复
实现控件和变量之间的值传递。
比如你绑定一个CString到一个Edit控件,DoDataExchange可以实现读取Edit的内容到CString中,也可以实现把CString的内容写入Edit,通过UpdateData(TRUE/FALSE)
flyskytoday 2009-07-01
  • 打赏
  • 举报
回复
标签为IDC_IMEI1--->ID为IDC_IMEI1
flyskytoday 2009-07-01
  • 打赏
  • 举报
回复
这一句是定义,你自己添加的控件的 变量
如第一个:
DDX_Text(pDX, IDC_IMEI1, m_imei1);
--------
就是定义标签为IDC_IMEI1与m_imei1变量相关联
Base.Dlg.cpp 程序 : #include "stdafx.h" #include "MyPos.h" #include "BaseDlg.h" #include "MaterielDlg.h" #include "ClassDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBaseDlg dialog CBaseDlg::CBaseDlg(CWnd* pParent /*=NULL*/) : CDialog(CBaseDlg::IDD, pParent) { //{{AFX_DATA_INIT(CBaseDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CBaseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBaseDlg) DDX_Control(pDX, IDC_TAB_BASE, m_oTabBase); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CBaseDlg, CDialog) //{{AFX_MSG_MAP(CBaseDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CBaseDlg message handlers BOOL CBaseDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_oTabBase.AddPage(" 商品类别 ", &m_oClassdlg, IDD_DIALOG_CLASS); m_oTabBase.AddPage(" 商品资料 ", &m_oMaterieldlg, IDD_DIALOG_MA TERIEL); m_oTabBase.AddPage(" 付款方式 ", &m_oPaymodedlg, IDD_DIALOG_PAYMODE); m_oTabBase.Show(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } CallDlg.cpp 程序: #include "stdafx.h" #include "MyPos.h" #include "CallDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCallDlg dialog extern CMyPosApp theApp; CCallDlg::CCallDlg(CWnd* pParent /*=NULL*/) : CDialog(CCallDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCallDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CCallDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCallDlg) DDX_Control(pDX, IDC_STATIC_CALL, m_oCallstatic); DDX_Control(pDX, IDC_EDIT_CALLBILLID, m_oCallbillid); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCallDlg, CDialog) //{{AFX_MSG_MAP(CCallDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCallDlg message handlers void CCallDlg::OnOK() { if(dowhat=="imhappy") { theApp.scallid=""; m_oCallbillid.GetWindowText(theApp.scallid); } if(dowhat=="pleased") m_oCallbillid.GetWindowText(dowhat); CDialog::OnOK(); } BOOL CCallDlg::OnInitDialog() { CDialog::OnInitDialog(); if(dowhat=="pleased") m_oCallstatic.SetWindowText(" 请输入桌号: "); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } CheckDlg.cpp 程序: #include "stdafx.h" #include "MyPos.h" #include "CheckDlg.h" #include "PosDlg.h"

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧