MFC中DoDataExchange函式以及在對話方塊之間傳遞資訊
阿新 • • 發佈:2019-02-03
在進行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();
}