GDI资源使用上需要注意的一点

Win32编程中GDI相关的东西肯定是每个程序员都要接触的东西,如果平时项目还是以MFC为基础的话,那就更不必说了。但是即便如此要用好GDI还是非常不容易的一件事情。

想必每个MFC的程序员可能都接触过CPPToolTip这个开源库工具,不得不说这是一个用起来很不错的tip工具类。但是要如何用好却也未必容易。最近就遇到一件让人感觉不爽的事情。

按照CodeProject上的说明新建一个CDialog的工程,然后将CPPToolTip的头文件包含近来,然后再对话框类中加一个成员变量CPPToolTip m_tooltip。然后在对话框的OnInitDialog中加入:

1: m_tooltip.Create(this);
2: m_tooltip.AddTool(GetDlgItem(IDOK), _T("tip"));

接下来重载PreTranslateMessage(MGS* pMsg),在函数中增加m_tooltip.RelayEvent(pMsg)。

编译运行后,当鼠标滑动到确认按钮后,会谈出一个“tip”提示。

回过来看代码有没有问题?应该没有问题啦。和GDI由神马关系?请继续看。

我们知道在C++里面,如果一个成员变量是类类型,那么在进入该类的构造函数之前,这个类类型成员变量会自动调用默认构造函数(如果没有使用初始化列表的情况下)。因此在本例中,CPPToolTip构造函数会在Dialog的构造函数执行之前先被调用。

打开Windows的资源管理器,把GDI Objects这一列显示出来。在Dialog的构造函数入口处打一个断点,F5。我们会发现,在进入Dialog的构造函数后,GDI资源数增加了1。调试后你会发现这个GDI资源来自CPPToolTip的构造函数(具体哪里来的,自己调,不是本文论述重点)。

到此,关于GDI的现象已经描述清楚了。

现在的问题就是这一个GDI资源和不合理?我个人觉得,这个GDI资源是不合理的,特别是这个类是用来做tip这样一个场景下。最近遇到的这个问题就是,这个类按照样例方式被不合理利用,导致tip对象很少会被用户使用到,但是GDI资源却被大量创建出来。你都不需要去调用CPPToolTip的任何成员函数,仅仅是去创建一个对象就涉及到GDI的消耗。将m_tooltip声明成数组,然后去掉所有函数调用,你在资源管理器里就能看到结果了。

合理的情况应该是对消的创建过程不应有GDI的资源的消耗。GDI作为系统资源应该是该用的时候再去获取。将GDI资源作为一个成员变量的情况下,也是一样,不要在构造函数中进行资源的分配。很多时候我们都在关注不要发生资源泄露,但是也要关注资源不要滥用。CPPToolTip仅仅是一个小案例,这种问题也许只有在实际中被用户发现了,才会觉得GDI这东西要用好是多么地操蛋的一件事情。。。
原文链接: https://www.cnblogs.com/wpcockroach/archive/2013/04/15/3023245.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/84804

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午9:45
下一篇 2023年2月9日 下午9:45

相关推荐