二.非模态窗口结束流程

非模态窗口结束流程

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迪大学院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值