MFC中DoDataExchange函数以及在对话框之间传递信息

在进行MFC编程的时候常常看到利用wizard生成的文件中含有DoDataExchange函数,但是从来没有关心过其作用或者原因。
同时,以前也想过两个对话框之间要怎么传递数据与信息,包括在培训的时候也讲述过这个应用的实现方法。

通过查询相关资料和MSDN上面的说明,可以知道,通过在DoDataExchange函数中,绑定变量和空间,能够实现控件内容和变量之间的数据传递。

首先,在弹出的对话框类(CPopDlg)中创建变量;

private:
    CString m_usname;
    CString m_pswd;
public:
    void setUSNM(CString usnm);
    void setPSWD(CString pswd);
    CString getUSNM(void);
    CString getPSWD(void);

其次,在该类的DoDataExchange函数中,绑定控件和变量;

///注意此处在弹出的对话框类中进行绑定,其实也可以在主窗口中绑定,但是可能无法在子窗口中控制
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    //// 可以认为这是一个绑定的过程
    DDX_Text(pDX, IDC_EDIT_USNM, m_usname);
    DDX_Text(pDX, IDC_EDIT_PSWD, m_pswd);
}

然后可以编写对应的set方法和get方法。在主对话框中需要弹出对话框的地方设置变量的值;

////模态对话框和非模态对话框的都可以
void CtestDoDataExchangeDlg::OnBnClickedPop()
{
    pcld = new CLoginDlg();

    pcld->setUSNM("admin");
    pcld->setPSWD("password");

    //pcld->Create(IDD_DlgLogin, this);////该函数必须在UpdateData之前调用?

    //pcld->UpdateData(FALSE);
    //pcld->ShowWindow(SW_SHOWNORMAL);
    ///////// 这个地方,在使用domodal的时候,还是比较需要注意的
    ///////// 因为,貌似不能在这里使用updatedata。可能是因为domodal中
    ///////// 集成了updatedata的相关操作吧
    //pcld->UpdateData(FALSE);
    pcld->DoModal();

    // TODO: Add your control notification handler code here
}

上面讲到模态对话框和非模态对话框都可以,但是模态对话框不需要updateData函数,原因暂时未知,可能实在domodal函数中具有此函数。而非模态则比较简单,但是一定要在create函数之后再调用。

调用CPopDlg对象的updateData(FALSE)函数,然后就会发现内容被传递到控件上面了;
MFC中DoDataExchange函数以及在对话框之间传递信息_第1张图片

如果在子对话框CPopDlg中更改了空间上面的内容,还想要把结果传递回来,只需要在离开CPopDlg的时候调用updateData(TRUE)就可以由控件传递到变量上面。

void CLoginDlg::OnBnClickedOk()
{
    UpdateData(TRUE);
    // TODO: Add your control notification handler code here
    CDialogEx::OnOK();
}

MFC中DoDataExchange函数以及在对话框之间传递信息_第2张图片

你可能感兴趣的:(工作上的学习)