Как вывести немодальный CDialog? - PullRequest
13 голосов
/ 16 февраля 2010

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

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

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

Спасибо

Ответы [ 6 ]

17 голосов
/ 16 февраля 2010
/* 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;
4 голосов
/ 07 февраля 2013

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

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

4 голосов
/ 16 февраля 2010

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

3 голосов
/ 16 февраля 2015

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

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

То есть;

Телефонный код:

#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
}
2 голосов
/ 16 февраля 2010

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

2 голосов
/ 16 февраля 2010

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

...