是否有一些方法可以使用CBitmap::FromHandle在Cimagelist上加载位图

Is There some way to load a bitmap on the Cimagelist using CBitmap::FromHandle?

本文关键字:FromHandle Cimagelist 位图 加载 CBitmap 方法 可以使 是否      更新时间:2023-10-16

我正在尝试创建一个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);

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

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

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

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

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

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

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