我使用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将永远不会对调用者提出这样的要求。