怎么在MFC中使用一个自定义的ID来加载位图资源
如何在MFC中使用一个自定义的ID来加载位图资源
到OleLoadPicture()函数的时候就会出现错误,返回值hr是一个负数-2146827807,而m_spIPicture返回的地址是{0x00000000},求解.
------解决方案--------------------
用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;
}
- C/C++ code
//定义 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},求解.
------解决方案--------------------
用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;
}