如何在mfc中的两个对话框之间传递数据

vma*_*man 2 c++ mfc

我在mfc和主视图中有一个对话框.视图启动一个新对话框,它接受两个int值,我想将这些值返回到我的视图.我知道我必须用dodataexchange做一些事情,这是我对话框中的代码:

void MapCreator::DoDataExchange(CDataExchange* pDX){    

    CDialogEx::DoDataExchange(pDX);

    CString stringColumn; 
    CString stringRow; 

    CWnd* dialog = GetDlgItem(columns);
    dialog->GetWindowText(stringColumn);

    dialog = GetDlgItem(rows);
    dialog->GetWindowText(stringRow);

    int numColumn = _wtoi(stringColumn);
    int numRow = _wtoi(stringRow);

    DDX_Text(pDX, columns, numColumn);
    DDV_MinMaxInt(pDX, numColumn, 1, 50); 
    DDX_Text(pDX, rows, numRow);
    DDV_MinMaxInt(pDX, numRow, 1, 50); 

}
Run Code Online (Sandbox Code Playgroud)

现在我如何在视图中访问这些值?

par*_*mar 5

在MFC中同步数据和视图的方式是这样的:

假设您有一个资源ID为IDC_MY_EDITBOX的编辑框,并且您希望将其绑定到CString对象.对CString的更改应反映在编辑框中,对字符串对象的更改应更新您的UI.对于此示例,我们将您的CString对象称为成员变量 mEditBoxString

class MapCreator : public CDialog
{
//Everything else omitted for brevity
CString mEditBoxString; 
};
Run Code Online (Sandbox Code Playgroud)

你的DoDataExchange看起来应该是这样的

void MapCreator ::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_MY_EDITBOX, mEditBoxString);
}
Run Code Online (Sandbox Code Playgroud)

这已经建立了变量和视图之间的双向绑定(编辑框)

如果您在代码中更改mEditBoxString并希望它反映在UI中.不知何故需要调用DoDataExchange.你可以通过调用CWnd :: UpdateData来实现它,在你的情况下它将是一个基类方法.

如果您将FALSE传递给UpdateData,则意味着将使用您对mEditBoxString所做的任何更改来更新UI.

如果将TRUE传递给UpdateData,则意味着将从UI更新mEditBoxString变量.因此,如果用户确实编辑了该框,则新值将存储在mEditBoxString中

假设您在对话框中也有一个连接到此功能的按钮(例如LOAD)

void CMapCreatorDlg::OnLoadClicked()
{
    //Do you heavy loading stuff here
    mEditBoxString = "Load Complete";
    UpdateData(FALSE);
}
Run Code Online (Sandbox Code Playgroud)

之后,对话框将在编辑框中显示" 加载完成 ".