Как отобразить немодальный 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
}