2010-02-16 5 views
13

Quelqu'un peut-il me dire comment je pourrais créer une boîte de dialogue non modale dans Visual C++ 6.0 de MFC et l'afficher? J'ai écrit ce code:Comment afficher un CDialog non modal?

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

Mais il bloque ma demande de montrer la boîte de dialogue. Je ne sais pas s'il existe une méthode ou un autre moyen de le faire.

Merci

Répondre

2

Vous devez appeler CDialog::Create à la place. Vous devrez appeler le DestroyWindow lorsque vous avez terminé la boîte de dialogue. Vous pourriez également devoir passer des messages de dialogue sur l'objet mais je ne me souviens pas si MFC manipule ceci pour vous ou pas.

4

Utilisez CDialog :: Create, puis utilisez CDialog :: ShowWindow. Vous avez maintenant une boîte de dialogue non modale.

2

DoModal bloque. Vous devez créer votre boîte de dialogue sur le tas ou en faire un membre de votre classe (c'est important), appelez Create puis appelez 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

supprimer m_pDialog; il pourrait planter l'application. Vous pouvez appeler m_pDialog-> DestroyWindow(); pour supprimer le dialogue. – bala

+1

La boîte de dialogue va-t-elle être supprimée si je la ferme? – Vinzenz

3

Vous pouvez appeler CDialog::Create et CWnd::ShowWindow comme les autres l'ont suggéré.

De plus, gardez à l'esprit que votre boîte de dialogue sera détruite juste après sa création si elle est stockée dans une variable locale.

2

Dans ce cas, je trouve qu'il est plus pratique de le laisser s'auto-supprimer pour gérer le nettoyage.

Souvent, il est considéré comme une mauvaise forme de rendre la libération de mémoire "implicite" à l'intérieur d'une classe, et non par ce qu'elle a créé, mais je fais généralement des exceptions pour les boîtes de dialogue non modales.

C'est-à-dire;

Indicatif téléphonique:

#include "MyDialog.h" 

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

Code Dialog:

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