c00*_*0fd 5 c++ windows winapi icons mfc
我加载使用我的图标LoadIconWithScaleDown API(或使用的LoadImage为XP).我把它添加到我的CImageList这样:
//CImageList imgList;
//HICON hIcon = loaded with LoadIconWithScaleDown
imgList.Add(hIcon);
//Is the following line needed?
::DestroyIcon(hIcon);
Run Code Online (Sandbox Code Playgroud)
我看到在将图标添加到我的图像列表后是否应该释放该图标的矛盾陈述.
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永远不会对调用者提出这样的要求.
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |