VC++的DDXDDV机制

    技术2022-05-20  43

    C++的MFC类库中为用户提供了在对话框控件和数据变量间交换数据的        DDX/DDV(数据交换/数据验证)机制,而在此之前,用户只能通过调用        GetDlgItemInt或etDlgItemText等函数这样麻烦的过程来达到同样的目的。        当你要为控制增加DDX/DDV支持时,APP WIZARD和CLASS WIZARD将为你完成        大部分工作。你只需要在CLASS WIZARD中为你的控制ID添加一个数据变量,        然后在程序中适当的地方调用UpdateData函数。            UpdateData接一个BOOL值的参数,为TRUE时将控制中的数据传到变量中,        FAULSE表示把变量中的数据传到控制中。但UpdateData并不直接完成有关        DDX/DDV机制的有关操作,它通过调用一个DoDataExchange函数实现。        DoDataExchange将调用实际完成对话框所要求的所有DDX和DDV操作有关的        DDX和DDV函数。             当你为控制创建一个数据变量时,CLASS WIZARD将自动为你生成三块        代码:它们被用来定义和初始化与控制结合在一起的变量。一旦在应用程        序执行过程中发出了一个DDX或DDV消息,应用程序将使用这三块代码中的        信息来定位,然后执行指定的代码。                            1 AFX_DATA代码块              AFX_DATA代码块是CLASS WIZARD用来说明与控制结合在一起的变量        的代码块。在相应的头(*.H)中,它出现在类的说明中。如:        //DIALOG DATA                //{{AFX_DATA(CAPPDIALOG)                enum{IDD=IDD_DIALOG1};                CButton   m_btnCopy;                CString  m_editName;                CString  m_showName;                //}AFX_DATA                               2 AFX_DATA_INIT代码块               AFX_DATA_INIT代码块对与控制结合在一起的变量进行初始化。在        相应的*.CPP文件中,它出现在类的构造函数中。如:        CAPPDIALOG::CAPPDIALOG(CWnd *nParent /*=NULL*/)                        :CDialog(CAPPDIALOG::IDD,pParent)        {                //{{AFX_DATA_INIT(CAPPDIALOG)                        m_editName=" ";                        m_showName=" ";                //}AFX_DATA_INIT        }              上例中,与m_editName和m_showName变量结合在一起的编辑框将被        初始化为空的文本字符串。你也可以对其修改而轻松的以其他方式对其        进行初始化。                                3 AFX_DATA_MAP代码块               AFX数据映像通常出现在DoDataExchange函数中,它是一个CWnd成员        函数,通常会被替换掉。比如在头文件中声明了:        virtual void DoDataExchange(CDataExchange * pDX);        则在CPP文件中如下实现:        void CAPPDIALOG::DoDataExchange(CDataExchange * pDX)                {                CDialog:: DoDataExchange( pDX);                //{{AFX_DATA_MAP(CAPPDIALOG)                DDX_Control(pDX,IDC_COPY,m_btnCopy):                    DDX_Text(pDX,IDC_EDIT_NAME,m_editName);                DDV_MaxChars(pDX,m_editName,28);                DDX_Text(pdx,IDC_SHOW_NAME,m_showName);                //}}AFX_DATA_MAP                }                如例子所示,这个DoDataExchange函数公进行了四次DDX/DDV调用,        它们是由MFC库提供的。参数pDX是一个指向数据交换对象的指针--数据交换        对象是一个属于CDataExchange类的MFC对象。在这里,你可以编写专门的DDX        和DDV函数,来以某种特殊的方式处理数据交换或数据验证。                这三块程序段实现了DDX/DDV机制和应用程序的接口,应用程序循着        UpdateData函数--DoDataExchange函数--DDX/DDV函数的顺序实现了控制和        数据变量的数据交换。


    最新回复(0)