我的程序是基于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这个类中使用?又不是全局变量,如何使用呢?问题比较杂,请大家仔细看看。谢谢各位。
在主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这个类中使用?又不是全局变量,如何使用呢?问题比较杂,请大家仔细看看。谢谢各位。
方法就是在OnNcDestroy里 delete this
主Dlg 中的 按钮1时就是生成了一个 全新的 Dlg1了。是吗?
如果只是隐藏,如何做呢? 谢谢!
另外,
delete this;
这句是 添加在 Dlg1的OnDestroy()函数中就可以解决内存泄漏的问题了吗?
其中的 this 指针 此时指的 就是生成的Dlg1对应的 那个窗口对象指针,是吗?谢谢!
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(老顽童) 提醒,回头仔细看看 技术内幕。