【问题标题】:How to display a non-modal CDialog?如何显示非模态 CDialog?
【发布时间】:2011-01-17 07:51:35
【问题描述】:

谁能告诉我如何在 MFC 的 Visual c++ 6.0 中创建一个非模态对话框并显示它? 我写了这段代码:

CDialog dialog;
if (dialog.init(initialization values...))
   dialog.DoModal();

但它阻止我的应用程序显示对话框。我不知道是否有任何方法或其他方法可以做到这一点。

谢谢

【问题讨论】:

    标签: c++ mfc visual-c++ cdialog


    【解决方案1】:
    /* CChildDialog class is inherited from CDialog */
    CChildDialog *m_pDialog = NULL;
    
    // Invoking the Dialog
    m_pDialog = new CChildDialog();
    
    if (m_pDialog != NULL)
    {
          BOOL ret = m_pDialog->Create(IDD_CHILDDIALOG, this);
    
          if (!ret)   //Create failed.
          {
             AfxMessageBox(_T("Error creating Dialog"));
          }    
          m_pDialog->ShowWindow(SW_SHOW);
    }
    
    // Delete the dialog once done
    delete m_pDialog;
    

    【讨论】:

    • 删除 m_pDialog;它可能会使应用程序崩溃。你可以调用 m_pDialog->DestroyWindow();删除对话框。
    • 如果我关闭它,对话框会自动删除吗?
    • 根据 MSFT,对话框不是为自动清理而设计的。但只要你没有对内存或处理分配做任何花哨的事情,它就可以正常工作。 docs.microsoft.com/en-us/cpp/mfc/…
    【解决方案2】:

    使用 CDialog::Create 然后使用 CDialog::ShowWindow。您现在有一个无模式对话框。

    【讨论】:

      【解决方案3】:

      您可以像其他人建议的那样致电CDialog::CreateCWnd::ShowWindow

      另外,请记住,如果您的对话框存储在局部变量中,它会在创建后立即销毁

      【讨论】:

        【解决方案4】:

        在这种情况下,我发现让它自行删除以处理清理最方便。

        从一个类中释放“隐式”内存通常被认为是不好的形式,而不是它创建它的原因,但我通常会为无模式对话框设置例外。

        那是;

        调用代码:

        #include "MyDialog.h"
        
        void CMyApp::OpenDialog()
        {
            CMyDialog* pDlg = new CMyDialog(this);
            if (pDlg->Create(IDD_MYDIALOG, this))
                pDlg->ShowWindow(SW_SHOWNORMAL);
            else
                delete pDlg;
        }
        

        对话框代码:

        void CMapBasicDlg::OnDestroy()
        {
            CDialog::OnDestroy();
            delete this; // Shown as non-modal, we'll clean up ourselves
        }
        

        【讨论】:

        • 这比当前的最佳答案更接近正确,但实际上应该在 OnNcDestroy 中完成删除。 WM_DESTROY 标记销毁序列的开始,WM_NCDESTROY 标记结束。您想等到后者(它将收到的最后一条消息)删除 MFC 对话框。
        【解决方案5】:

        您需要改为致电CDialog::Create。完成对话后,您需要致电DestroyWindow。您可能还需要将对话框消息传递给对象,但我不记得 MFC 是否为您处理。

        【讨论】:

          【解决方案6】:

          DoModal 正在阻塞。您必须在堆上创建对话框或使其成为您的类的成员(这很重要),调用 Create 然后调用 ShowWindow。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多