2010-02-16 8 views
13

Kann mir jemand sagen, wie ich einen nicht modalen Dialog in MFC Visual C++ 6.0 erstellen und es zeigen könnte? Ich schrieb diesen Code:Wie man einen nicht-modalen CDialog anzeigt?

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

Aber es blockiert meine Anwendung aus dem Dialog zeigt. Ich weiß nicht, ob es eine Methode oder eine andere Möglichkeit gibt, es zu tun.

Dank

Antwort

2

Sie müssen stattdessen CDialog::Create nennen. Sie müssen DestroyWindow aufrufen, wenn Sie mit dem Dialog fertig sind. Möglicherweise müssen Sie auch Dialognachrichten an das Objekt übergeben, aber ich kann mich nicht erinnern, ob MFC dies für Sie erledigt oder nicht.

4

Verwenden Sie CDialog :: Erstellen Sie und verwenden Sie dann CDialog :: ShowWindow. Sie haben jetzt ein nicht modales Dialogfeld.

2

DoModal blockiert. Sie müssen Ihren Dialog auf dem Heap erstellen oder ihn zu einem Mitglied Ihrer Klasse machen (das ist wichtig), rufen Sie Create auf und rufen Sie dann ShowWindow auf.

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

m_pDialog löschen; Es könnte die Anwendung zum Absturz bringen. können Sie m_pDialog-> DestroyWindow(); um den Dialog zu löschen. – bala

+1

Wird der Dialog gelöscht, wenn ich ihn schließe? – Vinzenz

3

können Sie rufen CDialog::Create und CWnd::ShowWindow wie die anderen vorgeschlagen haben.

Denken Sie auch daran, dass Ihr Dialog direkt nach seiner Erstellung zerstört wird, wenn es in einer lokalen Variablen gespeichert ist.

2

In diesem Fall finde ich es am bequemsten, es sich selbst zu löschen, um die Bereinigung zu behandeln.

Oft wird es als schlechte Form angesehen, "implizite" Speicherbefreiungen innerhalb einer Klasse vorzunehmen und nicht nach dem, was sie erzeugt hat, aber normalerweise mache ich Ausnahmen für nicht modale Dialogfelder.

Das ist;

Telefonvorwahl:

#include "MyDialog.h" 

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

Dialog Code:

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