一天一个小技巧:善用 WM_NCDESTROY 消息
作者:BlogUpdater |
时间:2024-05-17 |
浏览:609 |
评论已关闭 条评论
某天,一个客户请求我的帮助,他们直接发送了下面的调用堆栈:
有了这个,事儿就好办了。如果你明白窗口销毁的过程,则你应该能明白程序异常的原因。
主要问题在于,树控件(TreeView Control)尝试使用一个已经不再有效的图像列表(Image List),它不再有效的原因可能是它已经被销毁了。
如果我们再次深入研究下这个调用堆栈,则你会发现:树控件自己也正在被销毁。
你可以从名称为 TV_DestroyTree 的函数中推断出这一点,或者如果你查看参数(为了简洁起见,我从堆栈跟踪中删除了这些参数),你会看到这样一条消息:WM_DESTROY。
解决问题的下一步是:弄清楚是谁在图像列表仍在使用时销毁了它。客户分享了他们的源代码,稍加探索就会发现,正是这个功能破坏了图像列表:
现在,所有线索都摆在了桌面上,请使用你出色的推理能力来理解哪里出了问题。
总结
小技能 GET:WM_NCDESTROY 是窗口将收到的最后一条消息(在没有奇怪的情况下),因此它是进行”最终清理”的最佳位置。这就是为什么我们要等到收到 WM_NCDESTROY 时才销毁其实例变量,而不是 WM_DESTROY。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《You know the answer: Window destruction》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
如需转载,请注明来自:拓扑梅尔智慧办公平台 | TopomelBox 官方站点
- 下一篇: 如果清理代码执行失败了,要怎么办?
- 上一篇: 非注意盲视:人们容易看不到眼前显而易见的东西
相关推荐
- 为什么通过翻转颜色值来实现高亮不是一个好主意
- Posted on 06月30日
- 关于 MsgWaitForMultipleObjects 的理解
- Posted on 06月13日
- 新玩意儿更新:C++编码规则及最佳实践
- Posted on 08月24日
- 关于窗口风格的设置
- Posted on 08月20日
评论已关闭。