CImageList范围与CImageList :: ExtractIcon()返回HICON范围

时间:2015-04-13 13:54:43

标签: bitmap mfc scope icons imagelist

我使用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是否正确?

1 个答案:

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