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

问题描述:

我想要做的是在创建一个对话框DoModal()并按下框中的确定退出之后,返回一个自定义值。例如,用户可以在对话框中输入几个字符串。我可以从对话框的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(); 

     // ... 
    } 
} 
+0

THX了很多,这真的帮助 – Karudi 2011-05-24 14:34:25

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

CMyDialog dlg; 

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

这是你会用的CFileDialog,例如道路。

我在寻找答案,并同意在大多数情况下,您不会更改对话框的标准行为。但是,如果您有几个按钮,并且希望特定地选择顶部的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! 
}