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

How to pass data between two dialogs in mfc

本文关键字:对话框 两个 之间 数据 mfc      更新时间:2023-10-16

我在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); 
}

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

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

假设你有一个资源id为IDC_MY_EDITBOX的编辑框,你想把它绑定到一个CString对象。对CString的更改应该反映在编辑框中,对字符串对象的更改应该更新您的UI。在本例中,我们将CString对象称为成员变量 mEditBoxString

class MapCreator : public CDialog
{
//Everything else omitted for brevity
CString mEditBoxString; 
};

你的DoDataExchange应该看起来像

void MapCreator ::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_MY_EDITBOX, mEditBoxString);
}

这在变量和视图之间建立了一个双向绑定(编辑框)

如果你在代码中改变了mEditBoxString,并希望它在UI中反映出来。需要以某种方式调用DoDataExchange。你可以通过调用CWnd::UpdateData来完成它,在你的情况下,它将是一个基类方法。

如果你将FALSE传递给UpdateData,这意味着UI将更新你对mEditBoxString所做的任何更改。

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

假设你在对话框中也有一个按钮(比如LOAD)它连接到这个函数

void CMapCreatorDlg::OnLoadClicked()
{
    //Do you heavy loading stuff here
    mEditBoxString = "Load Complete";
    UpdateData(FALSE);
}
之后,您的对话框将在编辑框中显示Load Complete