我在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);
}
现在我如何在视图中访问这些值?
答案 0 :(得分: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);
}
这已在变量和视图之间建立了双向绑定(编辑框)
如果在代码中更改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);
}
之后,您的对话框将在编辑框中显示加载完成。