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;
}
それはうまくいきます!