我使用LoadIconWithScaleDown API加载我的图标(或使用LoadImage加载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(不推荐使用)加载它。所以该怎么办?
答案 0 :(得分:5)
与图像列表相关的任何功能都不会自动破坏图标。这是因为图标的所有者需要决定是否销毁它。此信息可在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永远不会对调用者提出这样的要求。