1. 程式人生 > >MFC中DoDataExchange函式以及在對話方塊之間傳遞資訊

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)函式,然後就會發現內容被傳遞到控制元件上面了;
這裡寫圖片描述

如果在子對話方塊CPopDlg中更改了空間上面的內容,還想要把結果傳遞回來,只需要在離開CPopDlg的時候呼叫updateData(TRUE)就可以由控制元件傳遞到變數上面。

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

這裡寫圖片描述