2015-09-16 3 views
1

Я хочу использовать один и тот же класс CTestDialog для модальногоВыделяют безрежимные против диалога модального

CTestDialog dlg; 
dlg.DoModal(); 

и немодального Dialog

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 и т. д.

[Отредактировано ответить на комментарий]

Это отличается от первоначального вопроса. В OK/Отмена обработчика, вы можете проверить:

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 прочее \t \t CDialogEx :: OnOK(); } –

+1

Не могли бы вы добавить код OnOK и методов OnCancel в свой начальный пост? – demonplus

1

Я отказался от поиска решения, если сама MFC Dialog может 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(); 
} 
Смежные вопросы