前面写过一篇关于模态和非模态对话框的文章,关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值 。文章末尾我遗留了一个问题,即当销毁非模态对话框后,需要置创建该非模态对话框的指针为NULL,但是具体是怎么操作呢?具体在哪里设置呢?
非模态对话框的销毁动作执行的是哪一个函数呢?即当点击窗口最右上角的关闭按钮后,执行了哪一个函数?
我的程序中是利用父窗口类的成员变量来创建的非模态子对话框,那么当关闭子对话框后需要使指针为NULL,当然其实大可不必这样,只需要在父类的析构函数中delete就行。但我的设计是点击创建的按钮可以显示,也可以隐藏,即如果没有创建子对话框,那么就创建子对话框,如果已经显示,再次点击就隐藏,再次点击就显示。里面涉及到if对指针PnewDlg的判断。那么就需要在子对话框关闭后使PnewDlg=NULL。
由于现在是回忆啊,所以写到有些问题可能记不清当时是为什么会那样了。比如当时我在网上找到的资料,关闭子对话框的时候需要重写PostNcDestroy函数和OnCancel函数。当时我记得我故意写了一个afxmessagebox测试了一下,结果关闭子对话框的时候并没有弹出提示信息,而是当我关闭父窗口后才弹出这个afxmessagebox对话框。至于具体原因,我现在也无法考证当时的情况。
那么如何重写这两个函数呢?
void CFTPCilentDlg::PostNcDestroy() //。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作
{
// TODO: 在此添加专用代码和/或调用基类
// isnull=TRUE;
// AfxMessageBox("ddddd");
CDialogEx::PostNcDestroy(); //先调用父类的
delete this; //添加这一句就可以
}<