首页 文章

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

提问于
浏览
2

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

}

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

1 回答

  • 5

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

    这已经在变量和视图之间 Build 了双向绑定( The edit box

    如果您在代码中更改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);
    }
    

    之后,您的对话框将在编辑框中显示 Load Complete .

相关问题