我可以从对话框的DoModal函数返回一个自定义值吗?

我想要做的是,用DoModal()创build一个对话框并在框中按OK退出它,以返回一个自定义值。 例如,用户可以在对话框中input几个string。

Solutions Collecting From Web of "我可以从对话框的DoModal函数返回一个自定义值吗?"

您不能更改DoModal()函数的返回值,即使可以,我也不会推荐它。 这不是这样做的惯用方法,如果将其返回值更改为字符串类型,则会失去查看用户何时取消对话的能力(在这种情况下,返回的字符串值应该被忽略)。

相反,向对话框类添加另一个函数(或多个),如GetUserName()GetUserPassword ,然后在DoModal返回IDOK后查询这些函数的值。

例如,显示对话框并处理用户输入的函数可能如下所示:

 void CMainWindow::OnLogin() { // Construct the dialog box passing the ID of the dialog template resource CLoginDialog loginDlg(IDD_LOGINDLG); // Create and show the dialog box INT_PTR nRet = -1; nRet = loginDlg.DoModal(); // Check the return value of DoModal if (nRet == IDOK) { // Process the user's input CString userName = loginDlg.GetUserName(); CString password = loginDlg.GetUserPassword(); // ... } } 

我正在寻找答案,并同意在大多数情况下,你不会改变对话的标准行为。 但是如果你有几个按钮,你可能会想要选择用户实际上正在响应的内容,并且特别要求他们选择顶部的OK和底部的OK。 你知道的指标。

或者说,如果在运行你的函数时,如果对话框导致错误,你是否想要稍有不同的结果。 返回一个不是IDOK的值,但可能还有其他的值。

我发现Dialog::EndDialog()的细节和用法的例子在这里: MSDN:Dialog :: EndDialog

 #include "ANewDialog.h" void CMyWnd::ShowDialog() { CMyDialog myDlg; int nRet = myDlg.DoModal(); if ( nRet == 18 ) AfxMessageBox("Dialog closed. But there was a problem."); } /* MyDialog.cpp */ void CMyDialog::OnSomeButtonAction() { int nRet = 0; // Run your function with return value; nRet = YourReallyFunFunction(); EndDialog(nRet); // Set the return value returned by DoModal! return; // The dialog closes and DoModal returns here! } 

我不认为这是可能的(或合理的)。 DoModal返回一个INT_PTR,通常用于了解用户做了什么来退出对话框(按OK,取消,出现错误…)。 做到这一点的方法是让对话框和调用者可以访问的公共成员或函数来获取值。 像这样:

 CMyDialog dlg; if(dlg.DoModal()==IDOK) { CString str1 = dlg.m_String1; CString str2 = dlg.GetString2(); } 

例如,您将使用CFileDialog。