CImageList 范围与 CImageList::ExtractIcon() 返回的 HICON 范围
CImageList scope vs CImageList::ExtractIcon() returned HICON scope
我已经使用 CImageList 将位图转换为 HICON,我想知道 CImageList::ExtractIcon() 返回的 HICON 在 CImage 销毁后是否仍然有效?假设我有这样的代码:
HICON Icon;
{
CImageList ImageList;
...
Icon = ImageList.ExtractIcon(0);
}
Icon;//<----------- Is this still valid?
在 GUI 中,我可以看到它显示正确的位图作为图标,一切都按预期工作,但是当我在调试器中检查由 ::GetIconInfo 返回的 HICON 时,它总是 returns false,即使 CImageList 仍然存在。有任何想法吗?上面代码中的 HICON 在右括号后是否正确?
像你这样做是绝对安全的。 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;
}
我已经使用 CImageList 将位图转换为 HICON,我想知道 CImageList::ExtractIcon() 返回的 HICON 在 CImage 销毁后是否仍然有效?假设我有这样的代码:
HICON Icon;
{
CImageList ImageList;
...
Icon = ImageList.ExtractIcon(0);
}
Icon;//<----------- Is this still valid?
在 GUI 中,我可以看到它显示正确的位图作为图标,一切都按预期工作,但是当我在调试器中检查由 ::GetIconInfo 返回的 HICON 时,它总是 returns false,即使 CImageList 仍然存在。有任何想法吗?上面代码中的 HICON 在右括号后是否正确?
像你这样做是绝对安全的。 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;
}