Преобразование CBitmap в HICON и использование его в строке состояния - PullRequest
1 голос
/ 18 апреля 2020

Я нашел ссылку , которая показывает вам, как преобразовать 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);

Это работает:

Status Bar

Нужно ли hIcon быть живым на время моего окна? И нужно ли мне это освобождать?

Для вашего пояснения, моя m_mapMeniBitmaps - это карта CBitmap объектов, и они остаются в живых .

1 Ответ

1 голос
/ 18 апреля 2020

Нужно ли быть живым во время моего окна? И я должен освободить это?

Да и да! Из документации для CreateIconIndirect (шахтное поле):

Когда вы закончите , используя значок , уничтожьте его, используя функцию DestroyIcon.

Моя m_mapMenuBitmaps - это карта CBitmap объектов, и они остаются живыми.

Вы можете освободить эти CBitmap объекты, как только вы создали иконки, но, как вы правильно заметили, они остаются «живыми», поэтому вы должны всегда «убивать» их, когда они вам больше не нужны. Из того же документа M / S:

Система копирует растровых изображений в структуре ICONINFO перед созданием значка или курсора. ... Приложение должно продолжать управлять исходными растровыми изображениями и удалять их, когда они больше не нужны.

...