【问题标题】:Do I need to destroy icon after I added it to ImageList?将图标添加到 ImageList 后是否需要销毁图标?
【发布时间】:2014-06-15 07:14:05
【问题描述】:

我正在使用LoadIconWithScaleDown API 加载我的图标(或者在 XP 中使用LoadImage。)然后我将它添加到我的 CImageList 中:

//CImageList imgList;
//HICON hIcon = loaded with LoadIconWithScaleDown
imgList.Add(hIcon);

//Is the following line needed?
::DestroyIcon(hIcon);

我看到关于在图标添加到我的图像列表后是否应该释放图标的矛盾陈述。

CImageList::Add 的文档说:

您有责任在完成后释放图标句柄 用它。

但是 CImageList::Add 内部调用的ImageList_ReplaceIcon 的文档说:

如果 hicon 是由 LoadIcon 加载的,则不需要销毁它 功能;系统自动释放图标资源 不再需要。

好吧,我没有完全用LoadIcon 加载它(已弃用。)那我该怎么办?

【问题讨论】:

  • 是的,您需要删除图标 - imagelist 只是将图像数据复制到其内部存储中,它不保留图标句柄的记录。通过 LoadIcon 从程序资源中加载的图标不需要删除,因为系统可以自动回收它们的资源,但是这样做仍然是一个好习惯。
  • @JonathanPotter:正如我所说,我没有使用 LoadIcon 本身,我通过 LoadIconWithScaleDown 或 LoadImage 加载它们。
  • 正如我所说,是的,你需要删除图标
  • @JonathanPotter:好的。谢谢。

标签: c++ windows winapi mfc icons


【解决方案1】:

与图像列表相关的任何功能都不会自动销毁图标。那是因为图标的所有者需要决定是否销毁它。此信息可在 DestroyIcon 的文档中找到,您被告知不要将 DestroyIcon 与共享图标一起使用:

只需为使用以下函数创建的图标和光标调用 DestroyIcon:CreateIconFromResourceEx(如果在没有 LR_SHARED 标志的情况下调用)、CreateIconIndirect 和 CopyIcon。请勿使用此功能破坏共享图标。只要加载它的模块仍在内存中,共享图标就有效。以下函数获取共享图标。

  • 加载图标
  • Lo​​adImage(如果您使用 LR_SHARED 标志)
  • CopyImage(如果您使用 LR_COPYRETURNORG 标志并且 hImage 参数是共享图标)
  • CreateIconFromResource
  • CreateIconFromResourceEx(如果您使用 LR_SHARED 标志)

这实际上让应用程序程序员有责任跟踪是否需要DestroyIcon。所以其他 API 函数根本不会调用DestroyIcon

您提到的来自ImageList_ReplaceIcon 的文档只是重复了我上面引用的建议。

图像列表实际上并不包含图标。它们持有平铺图像的矩形位图。因此,他们会复制您提供的图像。作为一般规则,API 函数永远不会要求您在函数返回后保持参数活动,而无需明确记录该要求。更重要的是,这样的要求对调用者来说是很繁重的,如果可以很容易地避免,一个好的 API 永远不会对调用者提出这样的要求。

【讨论】:

  • 谢谢。问题是ImageList_ReplaceIcon 对我传递给它的图标做了什么。如果它制作了一个独立于我的“深层”副本,那么是的,我可以安全地尽快销毁我的副本。但如果它只是创建对我的图标的引用,那么立即销毁我的图标将产生一个明显的问题。从那份稀缺的 MSDN 文档中,我并不清楚这一点。
  • 图片列表不存储图标。它们存储包含所有图像的矩形位图。无论如何,正如我所说,没有 API 会在您传递的图标上调用 DestroyIcon。
  • 就像@JonathanPotter 总结的那样,我可以在imgList.Add(hIcon); 通话后立即销毁我的图标,对吧?
  • 呃是的。那就是我的意思。没有 api 会为你做这件事,所以你必须这样做。
  • 是的,我明白了。但是我要说的是,如果图像列表没有对我的图标进行“深度”复制,我无法立即销毁它,并且只要使用图像列表就必须保持它“活动”。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2011-10-20
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多