我使用CImageList将位图转换为HICON,我想知道在CImage破坏后CImageList :: ExtractIcon()返回的HICON仍然有效吗?让我们假设我有这样的代码:
HICON Icon;
{
CImageList ImageList;
...
Icon = ImageList.ExtractIcon(0);
}
Icon;//<----------- Is this still valid?
在GUI中,我可以看到它显示正确的位图作为图标,并且everythig按预期工作,但是当我在调试器中检查返回的HICON by :: GetIconInfo时,即使CImageList仍然存在,它也始终返回false。有任何想法吗?关闭大括号后,上面代码中的HICON是否正确?
答案 0 :(得分:1)
像你一样这样做是绝对安全的。 CImageList::ExtractIcon()
方法调用ImageList_ExtractIcon()
宏,它会调用ImageList_GetIcon()
函数,根据图像列表中的图像和蒙版创建图标或光标。当您不再需要此图标时,请不要忘记拨打DestroyIcon()
。
另一种方法是:
HICON HICONFromCBitmap(CBitmap& bitmap)
{
BITMAP bmp;
bitmap.GetBitmap(&bmp);
HBITMAP hbmMask = ::CreateCompatibleBitmap(::GetDC(NULL),
bmp.bmWidth, bmp.bmHeight);
ICONINFO ii = {0};
ii.fIcon = TRUE;
ii.hbmColor = bitmap;
ii.hbmMask = hbmMask;
HICON hIcon = ::CreateIconIndirect(&ii);
::DeleteObject(hbmMask);
return hIcon;
}