15

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

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

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

谢谢

4

6 回答 6

18
/* 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;
于 2010-02-16T09:53:38.343 回答
5

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

于 2010-02-16T09:46:01.490 回答
5

你可以打电话CDialog::CreateCWnd::ShowWindow就像其他人建议的那样。

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

于 2013-02-07T16:46:50.683 回答
5

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

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

那是;

调用代码:

#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
}
于 2015-02-16T13:15:45.707 回答
3

你需要打电话CDialog::CreateDestroyWindow完成对话后,您需要致电。您可能还需要将对话消息传递到对象上,但我不记得 MFC 是否为您处理此问题。

于 2010-02-16T09:45:47.557 回答
3

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

于 2010-02-16T09:47:12.030 回答