如何使用do modal关闭对话框

时间:2011-10-25 09:51:52

标签: c++ visual-c++ mfc modal-dialog

好的,基本上我有一个MFC应用程序,其中包含许多需要循环的对话框。基本上,当您单击一个按钮转到另一个对话框时,我希望关闭上一个对话框。现在,对话框只显示在彼此的顶部。打开新对话框后,如何关闭对话框?以下是一些示例代码:

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

    }

6 个答案:

答案 0 :(得分:6)

您可以做的是在DoModal()新对话框时隐藏父对话框,并在新对话框结束后将其销毁。我没有测试过下面的ShowWindow()但是你明白了,如果它没有隐藏对话框,那就找另一个类似的函数了。

void CMachine2Dlg::OnBnClickedNewmc()
{
   ShowWindow( SW_HIDE);

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}

答案 1 :(得分:5)

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

执行此操作的一种方法是在类中创建模式对话框序列,该类调用第一个对话框并使用上一个对话框的返回值来确定是否需要显示第二个对话框,依此类推。

例如:

// 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!
}

我会忽略无模式对话框,你最终会遇到另一个问题,例如如何控制对话框的流程,并阻止人们点击后面的应用程序的主窗口。

答案 2 :(得分:2)

您可以尝试拨打

EndDialog(nResult);

答案 3 :(得分:2)

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

但是,就像@tenfour建议的那样,你应该使用属性表/向导。它也可以是一个单独的对话框窗口,其中显示或隐藏了几个子属性页面窗口,具体取决于您希望看到的内容。

为此,您需要:

  • 1个对话窗口,可能带有上一个/下一个按钮
  • 在您想要显示子窗口的对话框中的1个图片框,框架样式,不可见
  • n属性页,子样式,无边框,放置所有控件。

为对话框和每个属性页创建一个类,将每个属性页的成员变量添加到对话框,创建属性页并使用框作为参考来放置它们。在按钮上单击只显示/隐藏必要的页面。

答案 4 :(得分:1)

@tenfour建议一个很好的解决方案 但如果它不适合你 你应该从一个基本的windows / Dlg

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

Mydialog  dlg2
if(dlg2.DoModal() )
{
   //do something
}
else
   // do something else

依旧......

通过这种方式,您无法轻松控制“发生了什么”,并且您不必使用不同的窗口,消息循环。

答案 5 :(得分:1)

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