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
}
SO:
删除指向无模式对话框的指针的正确方法是什么?
谢谢你的帮助!
DONE:
http://tech.groups.yahoo.com/group/wtl/message/4444
OnFinalMessage是WTL相当于MFC的PostNCDestroy,你可以 安全地让你的框架窗口“自杀”在那里:)
void CSetRecordInfoDlg::OnFinalMessage( HWND /*hWnd*/ )
{
delete this;
}
有效!
答案 0 :(得分:4)
OnFinalMessage是WTL相当于MFC的PostNCDestroy,你可以 安全地让你的框架窗口&#34;自杀&#34;在那里。
答案 1 :(得分:0)
根据MSDN文档:
&#34;默认处理程序调用EndDialog成员函数来关闭 对话窗口。您也可以从自己的代码中调用EndDialog ...
&#34;要安排关闭和删除无模式对话框,请覆盖 PostNcDestroy并在this指针上调用delete运算符。&#34;