我有一些看起来如下的代码:

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_ERRORenum中的值,其中包含各种
    返回类型和状态。

  • 我发现在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.
            }
        }
    }
    

    10-07 14:42