添加到ImageList后,我需要摧毁图标吗?

我使用LoadIconWithScaleDown API(或使用LoadImage for XP)加载我的图标。然后,我将它添加到我的CImageList,如下所示:

//CImageList imgList; //HICON hIcon = loaded with LoadIconWithScaleDown imgList.Add(hIcon); //Is the following line needed? ::DestroyIcon(hIcon); 

我看到矛盾的说法是否应该释放图标后,它被添加到我的图像列表。

CImageList :: Add的文档说:

完成后,您有责任释放图标句柄。

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

如果由LoadIcon函数加载,则不需要销毁hicon; 系统在不再需要的时候自动释放一个图标资源。

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

没有与图像列表相关的功能会自动破坏图标。 这是因为图标的所有者需要决定是否销毁它。 这些信息可以在DestroyIcon的文档中找到,在那里你被告知不要使用带有共享图标的DestroyIcon

只需要调用DestroyIcon来获得用以下函数创建的图标和游标:CreateIconFromResourceEx(如果调用时没有LR_SHARED标志),CreateIconIndirect和CopyIcon。 不要使用此功能来销毁共享图标。 只要装载的模块保留在内存中,共享图标就是有效的。 以下功能获取共享图标。

  • LoadIcon
  • LoadImage(如果使用LR_SHARED标志)
  • CopyImage(如果使用LR_COPYRETURNORG标志并且hImage参数是共享图标)
  • CreateIconFromResource
  • CreateIconFromResourceEx(如果使用LR_SHARED标志)

这有效地使应用程序员负责跟踪是否需要使用DestroyIcon 。 所以其他API函数根本不会调用DestroyIcon

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

图像列表实际上不包含图标。 他们拥有图像平铺的矩形位图。 所以他们复制你提供的图像。 作为一般规则,API函数永远不会要求您在函数返回后保留参数,而没有明确记录该要求。 更重要的是,这样的要求对于调用者来说是繁重的,如果能够容易地避免的话,良好的API将永远不会对调用者提出这样的要求。