2

我想从资源中加载 PNG 文件。有一种大致 MFC 方式(使用CResourceStream):

CImage img;
CResourceStream str(0, MAKEINTRESOURCE(id), _T("PNG"));
img.Load(&str);
CBitmap *bmp(CBitmap::FromHandle(img.operator HBITMAP());

但是一个项目是 MFC-less 和 ATL-less。如何编写以非 MFC 样式加载 png?据我了解,这个目的可以通过 GDI+ 来实现

编辑:有一个适当的加载实现png答案流

4

1 回答 1

3

好吧,GDI+ 可以轻松地从 IStream 或文件中的 PNG 数据创建 HBITMAP,但是从资源到 IStream 需要一些工作。

如果你调用 CreateStreamOnHGlobal(NULL, TRUE, &stm),其中 stm 是一个 IStream* 变量,它基本上会给你一个临时的内存流。您可以使用 FindResource、LoadResource、LockResource 和 SizeofResource 来获取指向资源数据及其大小的指针。一旦你拥有了这两个东西,你就可以使用 IStream::Write 将数据从你的资源复制到 IStream 中。

一旦你有一个包含 PNG 数据的 IStream,将 IStream 传递给 GDI+ Bitmap 构造函数,并使用GetHBITMAP 方法获取 HBITMAP。

于 2012-06-22T22:45:41.017 回答