我的程序是基于DIALOG模式 生成的程序。
在主Dlg 上有一个按钮1,单击1按钮后产生 非模态对话框1。在主Dlg中 单击按钮1的事件处理函数中添加如下函数:
CDlg1 * pdlg1= new CDlg1;
pdlg1->Create(IDD_DLG1);
pdlg1->ShowWindow(SW_SHOW);
其中,CDlg1 是对话框1 对应的基于CDialog产生的派生类,并且已经 将默认的两个按钮 Ok 和Cancel 给删除了,又添加了另外一个按钮 Return。我想实现的功能就是,在非模态对话框1 中点击Return 按钮,销毁本身,回到主Dlg中。目前,我采用的是直接在 CDlg1 的 Return按钮 单击事件中 添加代码:
DestroyWindow();
完成了销毁。(至少看起来是这样。)想请问各位大侠,这样是真的销毁了,还是只是隐藏了。因为,我看到论坛里各位讨论的情形,好像这样只是隐藏了,还必须将new出来的pdlg1 给delete掉,才算真正销毁了,而且这样不会造成内存泄漏。(我觉得这是正确的,因为,new 和delete应该是配对使用的。)
但是,问题又出来了,在主Dlg 中生成的pdlg1 如何在CDlg1这个类中使用?又不是全局变量,如何使用呢?问题比较杂,请大家仔细看看。谢谢各位。

解决方案 »

  1.   

    不是隐藏,是销毁了, 但是窗口对象你还是得delete掉;
    方法就是在OnNcDestroy里 delete this
      

  2.   

    谢谢 jasonshark(没暑假了...) 热情回复:)照您说的意思,就是说 DestroyWindow()这个函数确实将窗口 销毁了。那下次点击
    主Dlg 中的 按钮1时就是生成了一个 全新的 Dlg1了。是吗?
    如果只是隐藏,如何做呢? 谢谢!
    另外,
    delete this; 
    这句是 添加在 Dlg1的OnDestroy()函数中就可以解决内存泄漏的问题了吗?
    其中的 this 指针 此时指的 就是生成的Dlg1对应的 那个窗口对象指针,是吗?谢谢!
      

  3.   

    1. 是销毁了的,如果你只想隐藏的话,就要记录住这个指针,或可作为一个成员变量。点"Return"时,它只是把自己ShowWindow(SW_HIDE)掉, 下次点按钮1时再把该窗口Show出来2. 不是OnDestroy, 是在PostNcDestroy里delete this(不好意思上面说成OnNcDestroy了...)
      

  4.   

    谢谢 jasonshark(没暑假了...) 详细地解答。查看一下MSDN,
    CWnd::PostNcDestroy
    virtual void PostNcDestroy( );ResCalled by the default OnNcDestroy member function after the window has been destroyed. Derived classes can use this function for custom cleanup such as the deletion of the this pointer.原来 DestroyWindow();销毁了窗口,然后 MFC 自动调用了 OnNcDestroy()函数,而
    PostNcDestroy()被 OnNcDestroy()调用。真是应该仔细看看 MFC的内在机制了。那就是说,在 Dlg1 的 重载 函数PostNcDestroy()中 添加delete this;就可以解决
    问题了吧?谢谢了。另外,谢谢Pipi0714(老顽童) 提醒,回头仔细看看 技术内幕。