我有一些看起来如下的代码:
void MyClass::OnButtonClick()
{
int retVal = SomeDialog.DoModal();
if(retVal == MYCLASS_ERROR)
{
MessageBox("Error"...blah ...blah);
}
else if(retVal == IDOK) // IDOK is returned on clicking the 'OK' button
{
MessageBox("All is well"...blah ...blah);
}
}
SomeDialog
仅显示进度栏。遇到任何错误时,通过调用EndDialog(MYCLASS_ERROR)
会自动关闭进度条。仅在成功完成后,才允许用户在此处单击“确定”。 MYCLASS_ERROR
是enum
中的值,其中包含各种返回类型和状态。
我发现在
SomeDialog
中单击“确定”后,错误消息仍然显示!我更深入地挖掘,发现MYCLASS_ERROR
= IDOK
= 1。所以我的问题是,我应该如何定义所有这些返回状态,以使其不与任何其他实现的状态发生冲突?意思是,我的函数应返回和其他其他函数(或其他尽可能少的函数)未返回的值。
我想修改我的设计,使所有函数只返回TRUE或FALSE。但是,这并非在所有情况下都是可行的。我也搜索了很多答案,但到目前为止还没有找到答案。
感谢您的光临!
最佳答案
有多种方法可以解决此问题,但是它们有点丑陋。
最简洁的设计通常是避免与标准Win32习惯用法冲突的设计,在Win32的世界中,模式对话框返回ID
值之一来指示用户在关闭它们时单击的按钮(就像消息框一样)。严格来说,是nResult
参数传递给用来关闭模式对话框的EndDialog
函数。
我建议不要尝试用其他含义重载此返回值。尝试这样做只会给您带来麻烦(例如,您可能还没有注意到返回值-1意味着对话框创建失败)。
而是在对话框类中定义其他成员变量,并使用它来报告其他信息。成功后,您将从对话框中返回IDOK
。失败(任何类型的失败)时,返回类似IDCANCEL
的信息。然后,您在OnButtonClick
内的代码将检查返回值是IDOK
还是IDCANCEL
。如果是IDCANCEL
,那么您还需要查询添加到对话框中的成员变量的值以获取其他信息。
希望这是有道理的。如果没有,也许此代码示例将(假设m_errStatus
是您添加到CDialog
的子类中的成员变量):
void MyClass::OnButtonClick()
{
if (SomeDialog.DoModal() == IDOK)
{
// Success!
// The OK button was clicked, so IDOK was returned.
MessageBox("All is well"...blah ...blah);
}
else
{
// Failure!
// Some error occurred, so IDCANCEL (or any other value) was returned.
// Determine what to do now, based on additional information that the
// dialog set upon failure.
switch (SomeDialog.m_errStatus)
{
case MYCLASS_ERROR_1:
MessageBox("Error 1 occurred.");
break;
case MYCLASS_ERROR_2:
MessageBox("Error 2 occurred.");
break;
// etc.
}
}
}