Как отобразить немодальный CDialog?

Может ли кто-нибудь сказать мне, как я могу создать немодный диалог в MFC Visual С++ 6.0 и показать его? Я написал этот код:

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

Но он запрещает моему приложению показывать диалог. Я не знаю, существует ли какой-либо метод или другой способ сделать это.

Спасибо

Ответы

Ответ 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;

Ответ 2

Использовать CDialog:: Создать, а затем использовать CDialog:: ShowWindow. Теперь у вас есть немодальное диалоговое окно.

Ответ 3

Вы можете вызвать CDialog::Create и CWnd::ShowWindow как и другие.

Также помните, что ваш диалог будет уничтожен сразу после его создания, если он хранится в локальной переменной.

Ответ 4

Вместо этого вам нужно позвонить CDialog::Create. Вам нужно будет позвонить DestroyWindow, когда вы закончите диалог. Вам также может потребоваться передать диалоговые сообщения на объект, но я не могу вспомнить, поддерживает ли MFC это для вас или нет.

Ответ 5

DoModal блокирует. Вы должны создать свое диалоговое окно в куче или сделать его членом вашего класса (это важно), вызвать Create, а затем вызвать ShowWindow.

Ответ 6

В этом случае я считаю наиболее удобным позволить себе самоиспользовать себя для обработки очистки.

Часто он считал, что плохая форма делает "неявную" память освобождающейся внутри класса, а не тем, что она создала, но я обычно делаю исключения для немодальных диалоговых окон.

То есть:

Код вызова:

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