如何显示非模态CDialog?

时间:2010-02-16 09:42:56

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

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

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

但它会阻止我的应用程序显示对话框。我不知道是否存在任何方法或其他方法。

由于

6 个答案:

答案 0 :(得分:17)

/* 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;

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

另外,请记住,如果对话框存储在本地变量中,会在创建后立即销毁

答案 3 :(得分:3)

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

通常它被认为是糟糕的形式,以及#34;隐含的"内存从类中释放,而不是从它创建的内容中释放出来,但我通常会对无模式对话框进行例外处理。

那是;

致电代码:

#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
}

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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