是否可以从对话框的 DoModal 函数返回自定义值?

Can I return a custom value from a dialog box's DoModal function?

本文关键字:返回 函数 自定义 DoModal 对话框 是否      更新时间:2023-10-16

我想做的是,在用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,它通常用于知道用户退出对话框时做了什么(按"确定"、"取消",出现错误…)。方法是让对话框设置和对话框调用方可以访问的公共成员或函数知道值。像这样:

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

例如,这就是使用CFileDialog的方式。