是否可以从对话框的 DoModal 函数返回自定义值?
Can I return a custom value from a dialog box's DoModal function?
我想做的是,在用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的方式。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数