如何使用do modal关闭对话框

big*_*z34 0 c++ mfc modal-dialog visual-c++

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

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

    }
Run Code Online (Sandbox Code Playgroud)

zar*_*zar 6

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

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

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 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
   }
}
Run Code Online (Sandbox Code Playgroud)

我相信你明白了......

在你的对话框中,你会这样返回(直接从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!
}
Run Code Online (Sandbox Code Playgroud)

我会保持清晰的无模式对话框,你最终会遇到另一个问题,比如如何控制对话流并防止人们点击后面的应用程序主窗口.