每添加一张图片后,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 **/
时间: 2024-10-29 02:47:06

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

(转载)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一个按钮控件和一个图片控件,点击按钮弹出颜色对话框,然后在颜色对话框中选择颜色并点击"确定"后,图片控件中将显示选择的颜色. 其实此实例的功能,还可以通过重载对话框WM_CTLCOLOR消息的响应函数等方法来实现,但为讲解画刷的CBrush的使用,鸡啄米采用了下面代码中的方法. 以下是此实例

VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一个按钮控件和一个图片控件,点击按钮弹出颜色对话框,然后在颜色对话框中选择颜色并点击"确定"后,图片控件中将显示选择的颜色. 其实此实例的功能,还可以通过重载对话框WM_CTLCOLOR消息的响应函数等方法来实现,但为讲解画刷的CBrush的使用,鸡啄米采用了下面代码中的方法. 以下是此实例

Unity3d修炼之路:加载一个预制体,然后为该对象添加组件,然后查找对象,得到组件。

#pragma strict function Awake(){ //加载一个预制体 资源必须在 Resources文件夹下 Resources.LoadLoad(); //加载后 必须示例化 GameObject.Instantiate(); //为对象添加组件 AddComponent(); //Find游戏对象 Find(); //Get组件 GetComponent(); var pPrefab : GameObject = Resources.Load("Prefab/Scence&q

(转载)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmap.CBrush.CFont.CPalette.CPen和CRgn. 在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类.本文就主要讲解画笔的使用. 画笔的应用实例 鸡啄米在这里直接通过一个波形图的实

jquery动态添加删除div--事件绑定,对象克隆

我想做一个可以动态添加删除div的功能.中间遇到一个问题,最后在phpchina问答区版主的热心帮助下解答了(答案在最后)        使用到的jquery方法和思想就是:事件的绑定和销毁(unbind),另外还可以使用clone,通过克隆可以很好的解决这个问题          相关描述如下 功能:点击增加,自动添加一个iptdiv 点击 iptdiv后的 X 自动删除当前div 问题:默认存在的(也就是页面加载进来的)的那个iptdiv 后的 X 点击有效,可以删除当前 iptdiv  但

VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmap.CBrush.CFont.CPalette.CPen和CRgn. 在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类.本文就主要讲解画笔的使用. 画笔的应用实例 鸡啄米在这里直接通过一个波形图的实

AS3 调用gotoAndStop后,显示对象为null的解决方法

再使用flash制作UI资源时通常我们会在一个MC的不同帧中引入其他的MC(有可能引入的MC中还包含了MC),并为这些引入的MC设置实例名称.通过使用gotoAndStop到第几帧来引用里面的资源...可惜有的时候会报:引入的这个显示对象为null....这该如何是好呢?? 接下来就是我在使用FB与IDEA进行实际工作的时候找到的一些解决办法... 第一种: 有时候我们使用的已经是别人做好的UI...或者是自己通过反编译出来的UI... 用flash打开后导入IDEA中如果使用gotoAndSt

ArcEngine中COM对象与其基础RCW分开后就不能再使用

操作ArcEngine中的COM对象时,为了减少内存的增长,用掉的对象要手动释放常用的方法是ReleaseComObject System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj); 但有时会报"COM对象与其基础RCW分开后就不能再使用"错误.这是因为对象被释放了,再去引用就找不到了,所在释放对象固然好,但要分清楚.

ArcEngine COM 对象与其基础 RCW 分开后就不能再使用

代码中可能是释放了对象,又使用了. 例如可能有这一句 System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj); 使用的位置不对,已经释放了,后面在引用就失败了.使用完再释放就行了. 引用自<COM对象与其基础RCW分开后就不能再使用> ------------------------------------------------------------------------------------------- RCW