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;
}