1. 程式人生 > >在VC中使用GDI+從自定義資源中載入圖片

在VC中使用GDI+從自定義資源中載入圖片

函式定義:

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錯誤。