Есть ли какой-нибудь способ загрузить растровое изображение в Cimagelist с помощью CBitmap::FromHandle?

#c #mfc

#c #mfc

Вопрос:

Я пытаюсь создать Cimagelist для вставки ListCtrl

Список:

 CImageList *cImageList;
cImageList = new CImageList();
cImageList->Create(120, 120, ILC_COLOR32, 0, 0);
  

если загрузка из LoadBitmap everthing работает нормально

 CBitmap bitmap;
bitmap.LoadBitmap(IDB_ACCEPTABLE2);
cImageList->Replace(i, amp;bitmap, NULL);
bitmap.DeleteObject();
  

Если я попытаюсь использовать CBitmap::FromHandle , мое изображение будет на 100% черным

 CBitmap *bmp = CBitmap::FromHandle(OneFunction());
cImageList->Replace(i, bmp, NULL);
  

Есть ли какой-нибудь способ загрузить растровое изображение при Cimagelist использовании CBitmap::FromHandle ?

Ответ №1:

Как задокументировано, CBitmap::FromHandle создает временный объект, который вам не принадлежит:

Если объект CBitmap еще не присоединен к дескриптору, создается и присоединяется временный объект CBitmap. Этот временный объект CBitmap действителен только до следующего простоя приложения в цикле событий, после чего все временные графические объекты удаляются. Другой способ сказать это заключается в том, что временный объект действителен только во время обработки одного сообщения window .

Объект принадлежит MFC, и мусор собирается в следующем цикле обработки в режиме ожидания. Если вы хотите прикрепить CBitmap объект к a HBITMAP , вам нужно вручную вызвать Attach :

 CBitmap bmp;
bmp.Attach( OneFunction() );
  

или, если вам нужно вручную управлять временем жизни объекта:

 CBitmap* bmp{ new CBitmap() };
bmp->Attach( OneFunction() );
  

Комментарии:

1. Спасибо, у меня все еще есть проблема из-за указателей, но ваше решение показывает несколько способов решения проблемы.