Bitmap::FromResource 读取资源ID失败

今天读取资源的时候Bitmap* pBitmap = Bitmap::FromResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nId));  pBitmap == NULL;总是读取失败,

这里的资源是图片资源,我自定义的"IMAGE"

后来差了资料是,应该是

BOOL CXXXApp::InitInstance()

{

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

}

int CXXXApp::ExitInstance()
{
  GdiplusShutdown(gdiplusToken);

  return COleControlModule::ExitInstance();
}

 

上面虽然能读取,但是图像显示不出来;最后改用下面

typedef std::map<UINT, Bitmap*> BitmapMap; 

BitmapMap   m_Map;

void AddItem(UINT nId)
{
 //Bitmap* pBitmap;
 //ImageFromIDResource(nId, _T("IMAGE"), pBitmap);

 //Bitmap* pBitmap = Bitmap::FromResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nId));
 //m_Map[nId] = pBitmap;

 Bitmap* pBitmap;
 ImageFromIDResource(nId, _T("IMAGE"), pBitmap);
 m_Map[nId] = pBitmap;
}

 


BOOL ImageFromIDResource(UINT nID, LPCTSTR szType, Bitmap* &pImg)
{
 HINSTANCE hInst = AfxGetResourceHandle();
 HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nID), szType);
 if (!hRsrc) return FALSE;
 // load resource into memory
 DWORD len = SizeofResource(hInst, hRsrc);
 BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
 if (!lpRsrc)
 return FALSE;
 // Allocate global memory on which to create stream
 HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
 BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
 memcpy(pmem,lpRsrc,len);
 IStream* pstm;
 CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
 // load from stream
 pImg = Bitmap::FromStream(pstm);
 // free/release stuff
 GlobalUnlock(m_hMem);
 pstm->Release();
 FreeResource(lpRsrc);
 return TRUE;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`Gdiplus::Bitmap::FromStream` 是 GDI+ 库中的一个函数,用于从流中加载图像。其函数原型如下: ```c++ Gdiplus::Status FromStream( IStream *stream, BOOL useEmbeddedColorManagement = FALSE ); ``` 其中,`stream` 参数是一个指向 `IStream` 接口的指针,用于指定要加载的流对象;`useEmbeddedColorManagement` 参数是一个布尔值,用于指定是否使用嵌入的颜色管理数据。 `Gdiplus::Bitmap::FromStream` 函数返回一个 `Gdiplus::Status` 枚举值,表示加载图像的结果。如果加载成功,返回值为 `Gdiplus::Ok`,否则返回其他错误代码。 使用示例: ```c++ Gdiplus::Bitmap* bmp = NULL; // 图像对象指针 IStream* istream = NULL; // 流对象指针 // 创建流对象 CreateStreamOnHGlobal(NULL, TRUE, &istream); // 将数据写入流 // ... // 从流中加载图像 Gdiplus::Status status = Gdiplus::Bitmap::FromStream(istream, &bmp); // 检查是否成功加载图像 if (status != Gdiplus::Ok || bmp == NULL) { // 加载失败,处理错误 // ... } // 成功加载图像,可以使用 bmp 对象进行绘制等操作 // ... // 释放资源 delete bmp; istream->Release(); ``` 在使用 `Gdiplus::Bitmap::FromStream` 函数加载图像时,需要注意以下几点: - 流对象必须在使用完毕后释放,否则会造成内存泄漏; - 图像对象也必须在使用完毕后释放; - 加载图像时需要检查返回值和图像对象是否为空,避免出现错误。 希望这可以帮助到你。如果你有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值