Область CImageList против CImageList::ExtractIcon() вернула область HICON

Я использовал CImageList для преобразования растрового изображения в HICON, и мне интересно, HICON, возвращаемый CImageList::ExtractIcon(), все еще действителен после уничтожения CImage? Предположим, у меня есть такой код:

HICON Icon;

        {
            CImageList ImageList;
            ...
            Icon = ImageList.ExtractIcon(0);
        }

Icon;//<----------- Is this still valid?

В графическом интерфейсе я вижу, что он показывает правильное растровое изображение в виде значка, и все работает так, как ожидалось, но когда я проверил в отладчике возвращенный HICON ::GetIconInfo, он всегда возвращает false, даже если CImageList все еще существует. Любые идеи? Является ли HICON в приведенном выше коде правильным после закрытия фигурных скобок или нет?


person IKM2007    schedule 13.04.2015    source источник


Ответы (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;
}
person Andrew Komiagin    schedule 13.04.2015
comment
Я уже выяснил это, но забыл опубликовать ответ здесь, спасибо! - person IKM2007; 14.04.2015