【问题标题】:How to close a dialog box using do modal如何使用 do modal 关闭对话框
【发布时间】:2011-12-14 19:23:47
【问题描述】:

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

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

    }

【问题讨论】:

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


【解决方案1】:

你可以试试打电话

EndDialog(nResult);

【讨论】:

    【解决方案2】:

    IT 将很难按照您提到的方式链接这些对话。 Do modal 通常意味着准确地实现您正在经历的事情。即:对话框弹出前一个。

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

    例如:

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

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

    【讨论】:

      【解决方案3】:

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

      但是,就像@tenfour 建议的那样,您应该使用属性表/向导。它也可以是单个对话框窗口,其中包含多个子属性页窗口,您可以根据需要显示或隐藏这些子属性页窗口。

      为此,您需要:

      • 1 个对话窗口,可能带有 Prev/Next 按钮
      • 1 个图片框,框架样式,不可见,在您希望子窗口出现的对话框内
      • n 个属性页,子样式,无边框,您可以在其中放置所有控件。

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

      【讨论】:

        【解决方案4】:

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

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

        等等……

        这样你就不能轻松控制“正在发生的事情”,也不必搞乱不同的窗口、消息循环。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-10-29
              • 2011-09-15
              • 2019-08-13
              • 1970-01-01
              • 1970-01-01
              • 2011-02-25
              相关资源
              最近更新 更多