2010-02-16 41 views
13

有人能告訴我如何在MFC的Visual C++ 6.0中創建非模態對話框並顯示它嗎?我寫了這個代碼:如何顯示非模態CDialog?

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

但它阻止我的應用程序顯示對話框。我不知道是否有任何方法或其他方式來做到這一點。

謝謝

回答

2

您需要改爲撥打CDialog::Create。完成對話後,您需要撥打DestroyWindow。您可能還需要將對話框消息傳遞到對象上,但我不記得MFC是否會爲您處理這個問題。

4

使用CDialog ::創建,然後使用CDialog :: ShowWindow。您現在有一個無模式對話框。

2

DoModal正在阻止。你必須在堆上創建對話框或將其設置爲類的成員(這很重要),調用Create然後調用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

刪除m_pDialog;它可能會使應用程序崩潰。 你可以調用m_pDialog-> DestroyWindow();刪除對話框。 – bala 2014-09-17 06:11:45

+1

如果關閉它,對話框會自動刪除嗎? – Vinzenz 2014-11-07 10:30:55

3

您可以撥打CDialog::CreateCWnd::ShowWindow像其他人所建議的。

另外,請記住您的對話框將在其創建後立即銷燬如果它存儲在局部變量中。

2

在這種情況下,我發現最方便的方法是讓它自己刪除自己來處理清理。

通常認爲這是一種糟糕的形式,可以讓「隱式」內存從類中釋放出來,而不是由它創建的內容釋放,但是我通常會爲非模態對話框設置例外。

即,

調用代碼:

#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 
}