非模态窗口结束流程
1.对于非模态需要注意的比模态的多
创建模态窗口资源和添加类
1.创建一个新对话框资源和右键添加类
2.使得对话框资源和类绑定
3.非模态不是堵塞 最好用NEW对象或者一个全局变量
if (pCDialog非模态 == NULL)
pCDialog非模态 = new CDialog非模态();
pCDialog非模态->Create(IDD_DIALOG2,this);
pCDialog非模态->ShowWindow(SW_SHOW);
3种关闭流程
第一种:点X
OnClose()->OnCancel()->DestroyWindow()->OnDestroy()
第二种:按回车
OnOK()->DestroyWindow()–>OnDestroy()
第三种:按ESC
OnCancel()->DestroyWindow()–>OnDestroy()
说明:
1.OnCancel()内部调用的是EndDialog() 这个函数是模态窗口销毁窗口用的 会触发WM_DESTROY 也就是会调用OnDestroy()这个函数
2.OnOK()内部也调用了EndDialog()这个函数 同是还调用了UpdateData(TRUE)
3.OnOK()和OnCancel() 是虚函数
注意:这3种和模态的关闭流程差不多
2.但是要注意的是 我们说过OnCancel()和OnOK()调用的是EndDialog() 这个函数是针对销毁模态对话框调用的
3.所以 这里我们不要调用默认基类的OnCancel()和OnOK()函数
4.而是在这2个函数中 自己手动调用一下DestroyWindow() 这里是重点!来销毁窗口
5.值得注意的是 虽然我们不手动调用DestroyWindow()这个的时候 窗口也会消失 但是没有销毁 也就是还存在内存中
6.只有当主窗口关闭了 才会去调用这个对话框的OnDestroy()函数
销毁NEW堆对象
1.当我们NEW对象的时候 需要自己销毁对象 也就是要手动释放内存
2.这时候最好是自己在自己类中把自己给销毁了 听起来很奇怪 是否会报错了呢?因为我们不确定在自己的函数中释放自己 那么当后面调用自己的时候已经释放了 就会报错
3.虽然理论上 这样想没错 但是MFC中有一个函数可以让我们这么做
4.那就是关闭流程中触发的最后一个函数PostNcDestroy回调函数 这个函数也是一个虚函数
5.我们一般就在这里做释放自己对象的内存
注意:
1.对于非模态对话框 需要手动调用后才会触发WM_DESTROY
如果不手动关闭 那么窗口只是不显示 但是还存在
直到主窗口被关闭 才会响应该对话框的WM_DESTROY消息处理函数OnDestroy
迪大交流群:285530835