如何使用do modal关闭对话框

How to close a dialog box using do modal

本文关键字:对话框 modal 何使用 do      更新时间:2023-10-16

好的,基本上我有一个MFC应用程序,有很多需要循环通过的对话框。基本上当你点击一个按钮去到另一个对话框,我希望前一个对话框关闭。现在,对话框只是在彼此的顶部显示。我如何让对话框关闭,一旦新的对话框打开?下面是一些示例代码:

void CMachine2Dlg::OnBnClickedNewmc()
{
    NameDlg Dlg;
    Dlg.DoModal()       
    }

你能做的是隐藏父对话框,当你DoModal()新的对话框,并在新的对话框结束后销毁它。我没有测试下面的ShowWindow(),但你知道的,如果它不隐藏对话框寻找另一个类似的功能。

void CMachine2Dlg::OnBnClickedNewmc()
{
   ShowWindow( SW_HIDE);
   NameDlg Dlg;
   Dlg.DoModal();
   EndDialog( 0 );
}

很难按照您提到的方式将这些对话框链接起来。Do模态通常意味着实现你正在经历的事情。例如:对话框会在前一个对话框上弹出。

一种方法是在调用第一个对话框的类中创建模态对话框序列,并使用前一个对话框的返回值来确定是否需要显示第二个对话框,等等。

例如:

// define a bunch of constants, any number would do,
// I would avoid 0 and 1 as they usually mean success/error
// This code can be returned in the EndDialog call in a method of your choice (say button click handler).
const int c_needNextDialog = 101; 

dialog1 dlg1;
if( dlg1.DoModal() == c_needNextDialog )
{
   dialog2 dlg2;
   if( dlg2.DoModal() == c_needNextDialog )
   {
      ... and so forth
   }
}

我相信你明白了…

在你的对话框中,你像这样返回(直接取自msf)

void dialog1::OnSomeAction()
{
   // Do something
   EndDialog(c_needNextDialog); // This value is returned by DoModal!
   // Do something
   return; // Dialog closed and DoModal returns only here!
}

我会远离非模态对话框,你最终会遇到另一个问题,比如如何控制对话框的流动,防止人们点击你的应用程序的主窗口。

您可以尝试调用

EndDialog(nResult);

OnOK(), OnCancel()EndDialog(nResult)将回答您的标题问题。

但是,就像@tenfour建议的那样,您应该使用属性表/向导。它也可以是一个带有几个子属性页窗口的对话框窗口,您可以根据希望看到的内容显示或隐藏这些子属性页窗口。

为此,您需要:

  • 1个对话框窗口,可能有上一步/下一步按钮
  • 1个图片框,框架样式,不可见,在对话框中,您希望子窗口出现
  • n属性页,子样式,无边框,放置所有控件。

为对话框和每个属性页创建一个类,向对话框添加每个属性页的成员变量,创建属性页并使用框架作为放置它们的引用。

您可以在对话框类中调用OnCancel()。如:this->OnCancel();

@tenfour提出了一个很好的可能的解决方案但如果这对你来说不可能您应该从一个基本的窗口/Dlg

创建对话框。
Mydialog  dlg1
if(dlg1.DoModal() )
{
   //do something
}
else
   // do something else
Mydialog  dlg2
if(dlg2.DoModal() )
{
   //do something
}
else
   // do something else

等....

这样你就不容易控制"发生了什么",你也不必弄乱不同的窗口,消息循环