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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值