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

| 我想做的是,在创建一个带有
DoModal()
的对话框并在框中按OK退出后,返回一个自定义值。例如,用户将在对话框中输入几个字符串。     
已邀请:
您不能更改
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();

        // ...
    }
}
    
我一直在寻找答案,并同意在大多数情况下您不会更改对话框的标准行为。但是在某些情况下,如果您有多个按钮,并且想特别让用户选择顶部的“确定”而不是底部的“确定”,那么您可能想选择用户实际响应的内容。您了解指标。 或者说,如果对话框在运行函数时导致错误,是否希望得到略有不同的结果。返回一个不是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,Cancel,出现错误...)。这样做的方法是拥有公共成员或函数,对话框集和对话框的调用者可以访问这些成员或函数来了解值。 像这样:
CMyDialog dlg;

if(dlg.DoModal()==IDOK)
{
    CString str1 = dlg.m_String1;
    CString str2 = dlg.GetString2();
}
例如,这就是使用CFileDialog的方式。     

要回复问题请先登录注册