将 CBitmap 转换为 HICON 并在状态栏上使用它

Converting a CBitmap to HICON and using it on a status bar

我发现这个 link 向您展示了如何将 CBitmap 转换为 HICON:

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

所以我在我的应用程序中尝试过这个:

HICON hIcon = HICONFromCBitmap(m_mapMenuBitmap[5]);
VERIFY(hIcon);
m_StatusBar.GetStatusBarCtrl().SetIcon(paneProgressOrZoomFactor, hIcon);

有效:

hIcon 是否需要在我的 window 期间存活?我必须释放它吗?

为了您的澄清,我的 m_mapMeniBitmapsCBitmap 个物体的地图,它们 确实还活着

在我的 window 期间,hIcon 是否需要存活?我必须释放它吗?

是的,是的!来自 documentation for CreateIconIndirect(加粗我的):

When you are finished using the icon, destroy it using the DestroyIcon function.

我的 m_mapMenuBitmapsCBitmap 个物体的地图,它们确实还活着。

可以 在创建图标后释放这些 CBitmap 对象,但是,正如您正确注意到的那样,它们仍然存在 'alive',所以当你不再需要它们时,你应该总是'kill'它们。来自同一个 M/S 文档:

The system copies the bitmaps in the ICONINFO structure before creating the icon or cursor.
...
The application must continue to manage the original bitmaps and delete them when they are no longer necessary.