2015-09-16 31 views
1

我想使用相同的類CTestDialog一個模式對話框區分無模式VS模式對話框

CTestDialog dlg; 
dlg.DoModal(); 

和一個無模式對話框

m_pDlg = new CTestDialog; 
m_pDlg->Create(CTestDialog::IDD,this); 
m_pDlg->ShowWindow(SW_SHOW); 

我的問題是,在PostNcDestroy中去做(..)它崩潰,如果它被構造爲模態對話框:

void CTestDialog::PostNcDestroy() 
{ 
    CDialog::PostNcDestroy(); 
    delete this;     // <= need for modeless, but Crash! if constructed as modal Dialog 
} 

如何確定,在一個簡單的方式,如果該類被構建爲無模式或模態對話?

+2

是的,我想避免,如果對話被構造爲模態對話框(在堆棧中)刪除。 通常無模式對話框對象在堆上的某處創建並在PostNcDestroy()中銷燬自己 –

+0

您是否嘗試檢查[DS_MODALFRAME](https://msdn.microsoft.com/en-us/library/windows/desktop/ff729172 (v = vs.85).aspx)風格? – rrirower

+2

你需要離開刪除這個;因爲否則你會有內存泄漏 – demonplus

回答

2

檢查對話框的m_nModalResult。如果它是-1 - 對話框是無模式的;否則它將是IDOK,IDCANCEL等代碼之一。

[編輯回答評論]

這是從原來的問題不同。 在確定/取消處理程序,可以測試:

if (m_nFlags & WF_MODALLOOP) 
+0

幾乎接近解決方案。是的,m_nModalResult在OnNcDestroy()中給出正確的結果。 但我不能在OnOk()和OnCancel()中使用這個變量。 :( 空隙CTestDialog ::的OnOK() { \t如果(的UpdateData(TRUE)) \t { \t \t如果(m_bModeless) \t \t \t的DestroyWindow(); \t \t \t的DestroyWindow(); \t \t別的 \t \t \t CDialogEx ::的OnOK(); \t} } 空隙CTestDialog :: OnCancel() { \t如果(m_bModeless) \t \t的DestroyWindow(); \t else \t \t CDialogEx :: OnOK(); } –

+1

您可以將OnOK和OnCancel方法的代碼添加到您的初始文章中嗎? – demonplus

1

我已經放棄了尋找一個解決方案,如果MFC對話框本身可以VS模態對話框非模態之間distingish。

此變通辦法適用於我。 我已經擴展了構造函數來判斷它是無模式還是模態。

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/, BOOL bModeless /*=false*/) 
: CDialogEx(CTestDialog::IDD, pParent) 
, m_bModeless(bModeless) 
{ 
} 

void CTestDialog::PostNcDestroy() 
{ 
    CDialogEx::PostNcDestroy(); 
    if (m_bModeless) 
     delete this; 
} 

void CTestDialog::OnOK() 
{ 
    if (UpdateData(TRUE)) 
    { 
    if (m_bModeless) 
     DestroyWindow(); 
    else 
     CDialogEx::OnOK(); 
    } 

void CTestDialog::OnCancel() 
{ 
    if (m_bModeless) 
     DestroyWindow(); 
    else 
     CDialogEx::OnOK(); 
}