在VC中使用GDI+從自定義資源中載入圖片
阿新 • • 發佈:2019-01-29
函式定義:
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, 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; }
呼叫函式:
ImageFromIDResource(IDR_BMP1, "bmp",(Image*&)img);
其中IDR_BMP1為自定義資源的ID,bmp為自定義資源型別
然後就可以呼叫GDI+繪圖了:
Graphics g(hdc);
g.DrawImage(img,0,0,0,0,48,48,UnitPixel);
最後要釋放資源:
delete img;
預設Bitmap(RT_BITMAP)型別的圖片無法載入, RT_BITMAP是預定義型別, 資源裡面沒有bmp檔案的頭, SizeofResource 的返回值要比圖片檔案少幾個位元組,因為少了這幾個位元組, 所以GDI+會返回invalid parameter錯誤。