2010-02-16 11 views
13

Qualcuno può dirmi come è possibile creare una finestra di dialogo non modale in Visual C++ 6.0 di MFC e mostrarla? Ho scritto questo codice:Come visualizzare un CDialog non modale?

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

ma blocca la mia applicazione di mostrare la finestra di dialogo. Non so se esiste un metodo o altro modo per farlo.

Grazie

risposta

2

è necessario chiamare CDialog::Create invece. Avrai bisogno di chiamare DestroyWindow quando hai finito con la finestra di dialogo. Potrebbe anche essere necessario passare messaggi di dialogo sull'oggetto ma non riesco a ricordare se MFC gestisce questo per te o meno.

4

Utilizzare CDialog :: Creare e quindi utilizzare CDialog :: ShowWindow. Ora hai una finestra di dialogo non modale.

2

DoModal sta bloccando. Devi creare la tua finestra di dialogo sull'heap o renderla membro della tua classe (questo è importante), chiama Crea quindi chiama 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

eliminare m_pDialog; potrebbe bloccare l'applicazione. puoi chiamare m_pDialog-> DestroyWindow(); per eliminare la finestra di dialogo. – bala

+1

La finestra di dialogo si cancellerà da sola se la chiudo? – Vinzenz

3

È possibile chiamare CDialog::Create e CWnd::ShowWindow come gli altri hanno suggerito.

Inoltre, tenere presente che la finestra di dialogo sarà distrutta subito dopo la sua creazione se è memorizzata in una variabile locale.

2

In questo caso trovo più comodo lasciarlo auto cancellarsi per gestire la pulizia.

Spesso è considerata una cattiva forma rendere la memoria "implicita" liberata da una classe e non da ciò che l'ha creata, ma di solito faccio delle eccezioni per le finestre di dialogo non modali.

Cioè;

Prefisso telefonico internazionale:

#include "MyDialog.h" 

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

codice Dialog:

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