每添加一张图片后,GDI对象 + 3 原因: ImageList_AddIcon(hIcon) 后没调用 DestroyIcon(hIcon)

Posted 沙的空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每添加一张图片后,GDI对象 + 3 原因: ImageList_AddIcon(hIcon) 后没调用 DestroyIcon(hIcon)相关的知识,希望对你有一定的参考价值。

今天无意间在【任务管理器】中发现,每添加1张图片后,应用程序的 GDI对象 + 3,添加图片后,再把所有图片删除, GDI对象数量没减少!

排查原因,发现:

GDI对象 + 3 的代码是:

int offset = LookupIconIdFromDirectoryEx(pIcoData, TRUE, width_thumbnail, height_thumbnail, LR_DEFAULTCOLOR);

if(offset != 0) //成功
{

    HICON ico = CreateIconFromResourceEx(pIcoData + offset, 0, TRUE, 0x30000, width_thumbnail, height_thumbnail, LR_DEFAULTCOLOR);

}

但为什么,把所有添加的图片 ImageList_AddIcon(hImgLst_ListView, hIcon); 删除后, GDI 对象数没有减少呢?

网上查了一下相关资料,查找到原因: CreateIconFromResourceEx() 后, 如果图标不需要使用了, 需要销毁图标: DestroyIcon();

微软api提示: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648061(v=vs.85).aspx
您应该使用 CreateIconFromResourceEx 创建的图标, 调用 DestroyIcon (销毁图标)。


宏: ImageList_AddIcon() - https://msdn.microsoft.com/en-us/library/windows/desktop/bb761399(v=vs.85).aspx

根据 https://stackoverflow.com/questions/24227374/do-i-need-to-destroy-icon-after-i-added-it-to-imagelist 介绍:
hImgLst_ListView 将图像数据(hIcon)复制到其内部存储器, 它不保存图标句柄(hIcon)的记录。

 

ImageList_AddIcon(hImgLst_ListView, hIcon); //添加ico格式

DestroyIcon(hIcon);  /** ImageList_AddIcon() 后, 马上销毁 hIcon **/

 

以上是关于每添加一张图片后,GDI对象 + 3 原因: ImageList_AddIcon(hIcon) 后没调用 DestroyIcon(hIcon)的主要内容,如果未能解决你的问题,请参考以下文章

python PIL的问题

学习笔记:利用GDI+生成简单的验证码图片

怎样在安卓手机桌面添加一张照片啊?

用GDI+画验证码

移动web——轮播图

c#2个 picturebox控件重叠如何实现透明