问题描述
|
我想做的是,在创建一个带有
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的方式。