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

时间:2011-05-24 14:14:37

标签: c++ windows winapi mfc return-value

我希望做的是,在创建一个带有DoModal()的对话框并在框中按OK退出后,返回自定义值。例如,用户将在对话框中输入的几个字符串。

3 个答案:

答案 0 :(得分:8)

您无法更改DoModal()功能的返回值,即使可以,也不会推荐它。这不是执行此操作的惯用方法,如果您将其返回值更改为字符串类型,您将无法查看用户取消对话框的时间(在这种情况下,返回的字符串值)应该完全忽略。)

相反,在对话框类中添加另一个函数(或多个函数),例如GetUserName()GetUserPassword,然后在DoModal返回{{1}之后查询这些函数的值}}

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

IDOK

答案 1 :(得分:1)

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

或者说,如果在运行函数时对话框导致错误,您是否希望略有不同的结果。返回一个不是IDOK但可能是其他值的值会很好。

我在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! } 的详细信息和使用示例:MSDN: Dialog::EndDialog

{{1}}

答案 2 :(得分:0)

我认为不可能(或合理)。 DoModal返回一个INT_PTR,它通常用于知道用户退出对话框的操作(按OK,取消,出现错误......)。执行此操作的方法是使用对话框设置的公共成员或函数以及对话框的调用者可以访问以了解值。 像这样:

CMyDialog dlg;

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

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