如何在MFC中使用一个自定义的ID来加载位图资源

时间:2022-10-03 05:04:00

//定义
CComQIPtr<IPicture>m_spIPicture;


//加载ID资源函数实现

HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst,
      MAKEINTRESOURCE(nIDRes),
      _T("IMAGE"));//在这里自定义了一个资源类型,名字是IMAGE
if(hRsrc == 0)
{
   hRsrc = ::FindResource(hInst = AfxGetInstanceHandle() , 
                 MAKEINTRESOURCE(nIDRes) ,
                 _T("IMAGE")) ;
}
if (!hRsrc)
      return FALSE;

DWORD len = SizeofResource(hInst, hRsrc);
   HGLOBAL hGl = LoadResource(hInst, hRsrc);
   BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);

if (!lpRsrc)
      return FALSE;

CMemFile file(lpRsrc, len);
CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete);
CArchiveStream arcstream(&ar);
if(m_spIPicture)
       m_spIPicture.Release();
HRESULT hr = OleLoadPicture(pstm, 0, FALSE,
      IID_IPicture, (void**)&m_spIPicture);
   FreeResource(hRsrc);


到OleLoadPicture()函数的时候就会出现错误,返回值hr是一个负数-2146827807,而m_spIPicture返回的地址是{0x00000000},求解.

5 个解决方案

#1


用GDI+,Gdiplus::Image::FromSteam

可以试试这个函数:
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Gdiplus::Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
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=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE;
}

#2


那可不可以只传一个ID的参数,来实现图片的获取呢?
像这样

private:
   //定义
   CComQIPtr<IPicture>m_spIPicture;
.....
//类的实现
bool LoadFromID(UINT nID)
{
   .......
   //最后将m_spIPicture作为图片存储来使用
}

#3


有没有人知道啊?

#4


自己顶起~~~~ 如何在MFC中使用一个自定义的ID来加载位图资源

#5


study one down.

#1


用GDI+,Gdiplus::Image::FromSteam

可以试试这个函数:
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Gdiplus::Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
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=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE;
}

#2


那可不可以只传一个ID的参数,来实现图片的获取呢?
像这样

private:
   //定义
   CComQIPtr<IPicture>m_spIPicture;
.....
//类的实现
bool LoadFromID(UINT nID)
{
   .......
   //最后将m_spIPicture作为图片存储来使用
}

#3


有没有人知道啊?

#4


自己顶起~~~~ 如何在MFC中使用一个自定义的ID来加载位图资源

#5


study one down.