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 中执行 delete this——一个在盒子的非客户区被销毁后调用的函数。

但那是在 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 相当于 WTL 的 MFC 的 PostNCDestroy,你可以放心地让你的框架窗口“自杀”在那里。

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

于 2012-07-05T01:52:23.527 回答
0

根据 MSDN 文档:

“默认处理程序调用 EndDialog 成员函数来关闭对话窗口。您也可以从自己的代码中调用 EndDialog...

“要安排关闭和删除无模式对话框,请覆盖 PostNcDestroy 并在 this 指针上调用 delete 运算符。”

于 2012-07-05T01:40:26.520 回答