您的位置:首页 > 其它

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

2018-01-02 21:30 411 查看
在进行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)函数,然后就会发现内容被传递到控件上面了;



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

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 对话框 DoDataExch