博客
关于我
关闭对话框
阅读量:526 次
发布时间:2019-03-08

本文共 1269 字,大约阅读时间需要 4 分钟。

别人给我的问题就是关于MFC应用程序中处理模态对话框关闭顺序时遇到的问题。这个问题看起来简单,但仔细思考后发现其实有一些需要注意的地方。今天我想和大家一起探讨一下这个问题。

好的,大家都知道,在MFC中创建一个模态对话框后,当用户通过"确定"或"取消"按钮点击后,这个对话框就会被关闭。那么,这个过程具体是怎样进行的呢?

首先,我们知道,当用户点击"确定"或"取消"按钮时,Windows会发送一个对应按钮的BN_CLICKED消息,按钮的ID是IDOK或IDCANCEL。这些消息会传递给对话框对象,这样我们就有机会处理这些关闭事件。MFC为我们提供了两个默认的处理函数,分别是OnOK和OnCancel。这些函数会调用EndDialog成员函数来关闭对话框窗口。

但是,当父窗口有子对话框的时候,情况就变得有些复杂了。如果父对话框因为某些原因收到WM_CLOSE消息而被关闭,那么它会在执行OnClose函数之前,不要这接触到子对话框的处理,导致子对话框没有被正确销毁,从而引发问题。为了避免这种情况,我们需要在父对话框的OnClose函数中先处理子对话框的生命周期。

话说回来,我之前遇到过一个问题。我的父对话框里面保存了一个子对话框的指针*pDlgChild。如果在父对话框的OnClose里直接调用delete pDlgChild,就会导致程序崩溃。这是因为Delete操作不能在子对话框还未结束生命周期时执行。

我试过很多方法,包括直接发送WM_CLOSE消息给子对话框,调用WM_DESTROY消息,甚至直接调用子对话框的DestroyWindows函数。结果发现这些方法都行不通,程序依然崩溃。最终我明白了,问题出在生命周期的管理上。父对话框在关闭子对话框之前必须保证子对话框已经完全销毁,否则直接删除指针会导致内存泄漏或程序崩溃。

那解决办法是不是很简单呢?就是在父对话框的OnClose函数之后,或者说在父对话框的销毁流程中,进行delete操作。这是因为父对话框在执行OnClose函数之后,会等到所有子对话框都完全销毁,才能继续自己的销毁流程。这样一来,删除指针就不会有任何问题了。

不过,这里有个疑问,那就是哪些情况会触发WM_CLOSE消息。我发现,如果子对话框已经被正确销毁,那么发送任何关闭消息给它都不会有什么问题了。因此, الحل并不是简单地把delete语句放到OnClose之后,而是要确保在任何情况下,我们都不会直接操作已经销毁的对象。

通过这个过程,我也意识到,我们最好不要做不必要的改动。MFC已经为我们提供了一个成熟的处理机制,这也包括窗口的生命周期管理。这种默认的处理方式不仅简单,而且非常安全,因为它遵循了MFC的设计理念。此外,遵守这个处理流程也对资源管理非常有利。

总的来说,在处理模态对话框关闭顺序的时候,我们要特别注意子对话框的生命周期管理。如果不正确处理,可能会导致各种问题,包括内存泄漏或程序崩溃。因此,解决这个问题最好的方式就是让MFC的默认处理机制来负责所有必要的操作。

转载地址:http://vvsiz.baihongyu.com/

你可能感兴趣的文章
普及企业级数据安全管理
查看>>
13-Android之移除状态栏底部分割线
查看>>
16-Android屏幕亮度调节
查看>>
17-Android系统应用默认开机启动
查看>>
Android Launcher 之源码下载
查看>>
TextureView和地图
查看>>
设计模式(18)——中介者模式
查看>>
Android APK反编译笔记
查看>>
关于百度语音在安卓9.0上无法正常合成的解决方法
查看>>
net start mysql 发生系统错误2 系统找不到指定的文件
查看>>
精选大数据面试真题10道(附答案详细解析)
查看>>
发工资的骚操作。。
查看>>
送一个ipad【最后一个】
查看>>
重磅!大数据《实战全栈工程师成长手册》,附 PDF & PPT 下载
查看>>
实用软件工程(张海藩)课后答案
查看>>
【Bug攻关】Bug调试记录
查看>>
【并查集】P1197 [JSOI2008]星球大战-洛谷
查看>>
JAVA异常和基础类库
查看>>
洛谷【数据结构1-1】线性表
查看>>
Sci-Hub重生了!这回用上了分布式网络
查看>>