博客
关于我
关闭对话框
阅读量: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/

你可能感兴趣的文章
【Java-27】Java常见错误记录
查看>>
andriod 开发错误记录
查看>>
C语言编译错误列表
查看>>
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
查看>>
6大亮点抢先看!Facebook加密货币项目Libra白皮书解读
查看>>
数字印钞界迎来重磅精英机构,普通人还有翻身机会吗? | 加密货币与阶层穿越...
查看>>
张一鸣:创业7年,我经历的5件事
查看>>
SQL基础语法
查看>>
git拉取远程指定分支代码
查看>>
C语言--C语言总结大纲
查看>>
JavaFX官方文档
查看>>
CentOS5 Linux编译PHP 报 mysql configure failed 错误解决办法
查看>>
shell编程===》进程锁
查看>>
Split返回数组元素含有空字符串移除
查看>>
解决VS中C语言运行scanf错误
查看>>
idea上的程序报错-> 错误: 找不到或无法加载主类
查看>>
《web安全入门》(四)前端开发基础Javascript
查看>>
C中几道位运算的例题
查看>>
golang log4go 使用说明及丢失日志原因
查看>>
fatal error all goroutines are asleep - deadlock!
查看>>