有没有办法使用CBitmap :: FromHandle在Cimagelist上加载位图?

时间:2016-10-12 13:43:26

标签: c++ mfc

我正在尝试创建Cimagelist以插入ListCtrl

列表:

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

如果来自LoadBitmap的负载工作正常

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

如果我尝试使用CBitmap::FromHandle我的图片是100%黑色

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

是否有某种方法可以使用CimagelistCBitmap::FromHandle上加载位图?

1 个答案:

答案 0 :(得分:2)

如上所述,CBitmap::FromHandle会创建一个您不拥有的临时对象:

  

如果CBitmap对象尚未附加到句柄,则会创建并附加临时CBitmap对象。此临时CBitmap对象仅在下次应用程序在其事件循环中具有空闲时间时才有效,此时所有临时图形对象都将被删除。另一种说法是临时对象仅在处理一个窗口消息时有效。

该对象由MFC拥有,并在下一个空闲处理循环中收集垃圾。如果您要将CBitmap对象附加到HBITMAP,则需要手动调用Attach

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

或者,如果您需要手动控制对象的生命周期:

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