zoukankan      html  css  js  c++  java
  • MFC中给控件添加变量,DoDataExchange中

    DoDataExchange函数其实是一项数据动态绑定技术。比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的。你要添加新的变量就要用到DoDataExchange函数。

    你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中。
     
    看下DDX_Check函数原型:void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value);
    可以看到m_Lesson并不是真的添加到IDC_CHECK1控件里了,注意这是int& value,只是一个值引用而已。
    差不多的意思就是这个变量被框架传递给控件了。控件只负责使用此变量 ,而不负责改写此变量。
     
    值得注意的一点是:MSDN后面附加了一句 Never call this function directly. It is called by the UpdateData member function. Call UpdateData to initialize a dialog box’s controls or retrieve data from a dialog box.就是说此函数永远不被直接调用,它只是呼叫UpdateData函数时才会被调用。
     
    UpdateData函数
    内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。
    调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。
     
    UpdateData(false)是将变量的值传到控件,表示对话框正在初始化.
    UpdateData(TRUE)是从控件中取值到关联的变量, 表示数据正在获取
    CWnd::DoDataExchange
     
     
    时间: 2016年7月

    调用由框架交换和验证对话框数据。

    语法
     
          virtual void DoDataExchange(
       CDataExchange* pDX 
    );
    
    参数
     
     
    pDX

    为 CDataExchange 对象的指针。

    备注
     

    不要直接调用此函数。 它由 UpdateData 成员函数调用。 调用 UpdateData 初始化对话框的控件或对话框中检索数据。

    当从 CDialog派生时应用程序特定的对话框选件类,则需要重写该成员函数,如果您希望使用结构的自动数据交换和验证。 添加变量向导将编写该成员函数的重写版本包含预期“数据映射”对话框的数据交换(ddx),并验证(DDV)全局函数调用。

    自动生成此成员函数的重写版本,请对话框编辑器首先创建对话框资源,然后派生应用程序特定的对话框选件类。 然后使用添加变量向导关联变量、数据和验证大小与在新的对话框的各种控件。 向导然后将被重写的 DoDataExchange,包含数据映射。 下面是示例DDX/DDV代码块生成由添加变量向导:

     
    void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX)
    {
       CDialog::DoDataExchange(pDX);
       DDX_Text(pDX, IDC_THINPENWIDTH, m_nThinWidth);
    	DDV_MinMaxInt(pDX, m_nThinWidth, 1, 20);
       DDX_Text(pDX, IDC_THICKPENWIDTH, m_nThickWidth);
       DDV_MinMaxInt(pDX, m_nThickWidth, 1, 20);
    }
    

    DoDataExchange 重写的成员函数必须在源文件中的宏语句。

    有关数据交换的对话框和验证的更多信息,请参见 显示和操作数据窗体 和 数据交换的对话框和验证。 有关添加变量向导生成的DDX_和DDV_宏的说明,请参见 技术说明26

    要求

    头文件位置: afxwin.h


    VC中的DoDataExchange

    怎么设置控件和变量关联呢?

    假如在对话框中加入一个picture控件的话

    1.导入图片

    2.拉picture控件到对话框上,设置属性,Type改为Bitmap,image选择导入的图片,ID一定要修改,不能为默认的IDC_Static,否则下面将做的Classwizard将不出现此控件ID。

    3.ClassWizard中选择member variable Category选择 Control加入相应的CStatic变量 。

    4.此时到DoDataExchange看,增加相应的数据交换语句,我的是DDX_Control(pDX, IDC_bt, m_bt);


    void CUserDialog::DoDataExchange(CDataExchange* pDX) 

        CDialog::DoDataExchange(pDX); 
        DDX_Text(pDX, IDC_USER_EDIT, m_username); 
        DDV_MaxChars(pDX,m_username,10); //将用户名的最大长度控件在10个字符

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

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


    总之,这个函数对理解MFC框架是很有用的。对于写控件也是很有用的。 


    UpdataData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。 

    UpdateData(FALSE)是将变量的值传到控件. 
    UpdateData(TRUE)是从控件中取值到关联的变量 

     

    DoDataExchange会被框架调用,用来改变和验证对话框的数据。在这个函数中一般是将控件和某些变量关联,当在其它地方改变量的值,通过UpdateData 进行双向交换。如: 

    UpdateData();//将控件的值传给变量 
    m_variable= "string";//分别为控件的变量赋值 
    UpdateData(FALSE);//将变量的值传给控件 
  • 相关阅读:
    DOM事件模型
    值类型和引用类型的区别
    CSS盒模型
    reflow和repaint
    CSS优化
    跨域的几种方法
    快速排序
    vs2017开发ActiveX(主讲OCX)(五)、事件
    vs2017开发ActiveX(主讲OCX)(四)、绘制ActiveX控件
    vs2017开发ActiveX(主讲OCX)(三)、MFC ActiveX控件向导中的控件设置
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/7554580.html
Copyright © 2011-2022 走看看