Сбой при выполнении GetParent(). Закрытие немодального диалогового окна

Я создаю немодальное диалоговое окно. Диалоговое окно вызывается из пункта меню главного окна.

mainfrm.h

CModeless* modeless;    
bool modelessDlgOpen;     

MainFrm.cpp

void CMainFrame::OnDatabaseMLdlg()     
{     
    // TODO: Add your command handler code here     
    if (modelessDlgOpen == TRUE)      
        return;     

    modelessDlgOpen = TRUE;     

    modeless = new CModeless(this);     

    //modeless->Create(IDD_MLDLG, GetDesktopWindow());     
    modeless->Create(IDD_MLDLG, this);     
    mbPoll->ShowWindow(SW_SHOW);     
}     

При нажатии на пункт меню вызывается функция OnDatabaseMLdlg() и появляется немодальное диалоговое окно с идентификатором ресурса IDD_MLDLG.

Проблема при закрытии немодального диалогового окна.

Я не могу найти правильный метод для чистого закрытия / уничтожения этого немодального диалогового окна. При нажатии на крестик в правом верхнем углу, какое сообщение генерируется?

Мой текущий код, который я попробовал, выглядит следующим образом. (создание кода, связанного только с закрытием диалогового окна)

MLDLG.h

#pragma once     

#define WM_MLDLG_CLOSED (WM_USER + 555)     
// CModeless dialog     

class CModeless : public CDialog     
{     
    DECLARE_DYNAMIC(CModeless)     

public:     
    CModeless(CWnd* pParent = NULL);   // standard constructor     
    virtual ~CModeless();      

// Dialog Data     
    enum { IDD = IDD_MLDLG };      

protected:     
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support      

    DECLARE_MESSAGE_MAP()     
public:     
    virtual BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);     
    afx_msg void OnNcDestroy();     
    virtual void PostNcDestroy();     
    CWnd* mParent;     
    afx_msg void OnBnClickedCancel();     
};     

MLDLG.cpp

void CModeless::OnNcDestroy()     
{     
    CDialog::OnNcDestroy();     

    // TODO: Add your message handler code here     
}     

void CModeless::PostNcDestroy()      
{        
    CDialog::PostNcDestroy();     
    GetParent()->PostMessage(WM_MLDLG_CLOSED,0,0);     // **CRASHES HERE**
    delete this;     
}     

void CModeless::OnBnClickedCancel()     
{     
    // TODO: Add your control notification handler code here     
    //CDialog::OnCancel();     
    DestroyWindow();         
}     

Не в состоянии понять, что я делаю неправильно или чего мне не хватает?

Я могу предоставить дополнительную информацию в случае необходимости.

Заранее спасибо.

EDIT-20130612: Дополнительная информация:

Мой конструктор выглядит следующим образом:

CModeless::CModeless(CWnd* pParent /*=NULL*/)    
    : CDialog(CModeless::IDD, pParent)    
{    
    mParent = pParent;    
    if (mParent == NULL)    
    {    
        MessageBox(L"mParent is NULL");   
    }    
    else    
    {    
        MessageBox(L"mParent is not NULL");    
    }    
}    

Здесь я проверил, что mParent не равен NULL.

1 ответ

PostNCDestroy() вызывается ОЧЕНЬ поздно, и большая часть полезного состояния окна MFC в этот момент недопустима. GetParent() вероятно, возвращает NULL, что вызовет сбой, как вы его используете.

Попробуйте переместить PostMessage позвонить OnDestroy() перед вызовом реализации базового класса там.

Другой вариант - кэшировать hWnd родителя и вызвать ::PostMessage() на этом пути;

Другие вопросы по тегам