2010-02-16 14 views
13

¿Puede alguien decirme cómo podría crear un diálogo no modal en Visual C++ 6.0 de MFC y mostrarlo? escribí este código:¿Cómo mostrar un CDialog no modal?

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

Pero bloquea mi solicitud de mostrar el cuadro de diálogo. No sé si existe algún método u otra forma de hacerlo.

Gracias

Respuesta

2

es necesario llamar a CDialog::Create lugar. Tendrá que llamar al DestroyWindow cuando haya terminado con el diálogo. Es posible que también deba pasar mensajes de diálogo al objeto, pero no puedo recordar si MFC maneja esto para usted o no.

4

Utilice CDialog :: Create y luego use CDialog :: ShowWindow. Ahora tiene un cuadro de diálogo no modal.

2

DoModal está bloqueando. Debe crear su cuadro de diálogo en el montón o convertirlo en miembro de su clase (esto es importante), llamar a Crear y llamar a ShowWindow.

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; 
+0

eliminar m_pDialog; podría bloquear la aplicación. puede llamar a m_pDialog-> DestroyWindow(); para borrar el diálogo – bala

+1

¿Se eliminará el cuadro de diálogo si lo cierro? – Vinzenz

3

Puede llamar CDialog::Create y CWnd::ShowWindow como los otros han sugerido.

Además, tenga en cuenta que su cuadro de diálogo será destruido inmediatamente después de su creación si está almacenado en una variable local.

2

En este caso, me parece más conveniente dejar que se elimine automáticamente para gestionar la limpieza.

A menudo se considera mala forma de hacer que la memoria "implícita" se libere dentro de una clase, y no según lo que la creó, pero generalmente hago excepciones para los cuadros de diálogo no modal.

Eso es;

Código de llamada:

#include "MyDialog.h" 

void CMyApp::OpenDialog() 
{ 
    CMyDialog* pDlg = new CMyDialog(this); 
    if (pDlg->Create(IDD_MYDIALOG, this)) 
     pDlg->ShowWindow(SW_SHOWNORMAL); 
    else 
     delete pDlg; 
} 

el código de diálogo:

void CMapBasicDlg::OnDestroy() 
{ 
    CDialog::OnDestroy(); 
    delete this; // Shown as non-modal, we'll clean up ourselves 
} 
Cuestiones relacionadas