0

モードレス ダイアログ ボックスを作成しています。このダイアログ ボックスは、メイン フレーム ウィンドウのメニュー項目から呼び出されます。

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() 関数が呼び出され、リソース ID 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 でないことを確認しました。

4

1 に答える 1

0

PostNCDestroy()非常に遅く呼び出され、MFC ウィンドウの有用な状態のほとんどはその時点では有効ではありません。 GetParent()はおそらく NULL を返しているため、使用している方法でクラッシュが発生します。

そこで基本クラスの実装を呼び出す前に、PostMessage呼び出しを移動してみてください。OnDestroy()

もう 1 つのオプションは、親の hWnd をキャッシュし、::PostMessage()その hWnd を呼び出すことです。

于 2013-06-11T21:17:20.570 に答える