4

MainDlg関数で

LRESULT CMainDlg::OnDo(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{

    CMyDlg* dlg = new CMyDlg;// it could be CMainDlg member var
    //dlg.pMain = this; // i want to SendMessage(pMain.m_hWnd...) in CMyDlg...but it don't     
    //  work...
    dlg->Create(m_hWnd);
    dlg->ShowWindow(SW_SHOW);
    return 0;

}

CMyDlgで

 class CMyDlg : public CDialogImpl<CMyDlg>, public CUpdateUI<CMyDlg>,
public CMessageFilter, public CIdleHandler, 
public CWinDataExchange<CMyDlg>,
public CDialogResize<CMyDlg>


LRESULT CMyDlg::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL&   /*bHandled*/)
{
    DestroyWindow();

 }

したがって、CMyDlg * dlgポインタは失われます...(メモリリーク)

モデルダイアログをグーグルで検索します。msdn.comのメッセージに注意してください。

http://msdn.microsoft.com/en-us/library/zhk0y9cw(VS.80).aspx

注:このサンプルは非常に単純なメカニズムを使用しています。PostNcDestroyでこれを削除します—ボックスの非クライアント領域が破棄された後に呼び出される関数です。

しかし、それはMFCにあります。私はそれをWTLに使用します。これを削除するとき; にアサートされます

virtual ~CWindowImplRoot()
{
  #ifdef _DEBUG
    if(m_hWnd != NULL)  // should be cleared in WindowProc
    {
        ATLTRACE(atlTraceWindowing, 0, _T("ERROR - Object deleted before window was destroyed\n"));
        ATLASSERT(FALSE);
    }
  #endif //_DEBUG
}

それで:

モードレスダイアログへのポインタを削除する正しい方法は何ですか?

あなたの助けに感謝します!

終わり:

http://tech.groups.yahoo.com/group/wtl/message/4444

OnFinalMessageはWTLのMFCのPostNCDestroyに相当し、フレームウィンドウを安全に「自殺」させることができます:)

void CSetRecordInfoDlg::OnFinalMessage( HWND /*hWnd*/ )
{
    delete this;
 }

それはうまくいきます!

4

2 に答える 2

4

OnFinalMessage は、MFC の PostNCDestroy に相当する WTL であり、フレーム ウィンドウを安全に「自殺」させることができます。

参照: http://tech.groups.yahoo.com/group/wtl/message/4444

于 2012-07-05T01:52:23.527 に答える
0

MSDN ドキュメントによると:

「デフォルトのハンドラーは、EndDialog メンバー関数を呼び出して、ダイアログ ウィンドウを閉じます。独自のコードから EndDialog を呼び出すこともできます...

「モードレス ダイアログ ボックスを閉じて削除するには、PostNcDestroy をオーバーライドし、this ポインターで削除演算子を呼び出します。」

于 2012-07-05T01:40:26.520 に答える