如何在 WTL 中删除指向无模式对话框的指针

faz*_*ang 5 c++ windows user-interface wtl

在MainDlg函数中

\n\n
LRESULT CMainDlg::OnDo(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)\n{\n\n    CMyDlg* dlg = new CMyDlg;// it could be CMainDlg member var\n    //dlg.pMain = this; // i want to SendMessage(pMain.m_hWnd...) in CMyDlg...but it don\'t     \n    //  work...\n    dlg->Create(m_hWnd);\n    dlg->ShowWindow(SW_SHOW);\n    return 0;\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在CMyDlg中

\n\n
 class CMyDlg : public CDialogImpl<CMyDlg>, public CUpdateUI<CMyDlg>,\npublic CMessageFilter, public CIdleHandler, \npublic CWinDataExchange<CMyDlg>,\npublic CDialogResize<CMyDlg>\n\n\nLRESULT CMyDlg::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL&   /*bHandled*/)\n{\n    DestroyWindow();\n\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以 CMyDlg* dlg 指针将会丢失...(内存泄漏)

\n\n

我在 google 上搜索模型对话框。请注意 msdn.com 中的该消息

\n\n

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

\n\n

注意:这个示例使用了一个非常简单的机制:它在 PostNcDestroy \xe2\x80\x94 中执行删除,这是一个在盒子的非客户区域被销毁后调用的函数。

\n\n

但这是在 MFC 中。我将它用于 WTL 。什么时候删除这个;它将被断言

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

所以:

\n\n

删除指向无模式对话框的指针的正确方法是什么?

\n\n

谢谢你的帮助!

\n\n

完毕:

\n\n

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

\n\n

OnFinalMessage 相当于 WTL 的 MFC PostNCDestroy,你可以\n安全地让你的框架窗口“自杀”在那里:)

\n\n
void CSetRecordInfoDlg::OnFinalMessage( HWND /*hWnd*/ )\n{\n    delete this;\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样可行!

\n

小智 4

OnFinalMessage 相当于 WTL 中 MFC 的 PostNCDestroy,你可以安全地让你的框架窗口“自杀”在那里。

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