1. 程式人生 > >對話方塊載入PNG背景圖片

對話方塊載入PNG背景圖片

static bool G_ImageFromIDResource(LPCTSTR pName, LPCTSTR pType, Gdiplus::Image* &m_pBitmap)
{
HGLOBAL m_hBuffer = NULL;
// 計算機函式。該函式確定指定模組中指定型別和名稱的資源所在位置。
// 如果函式執行成功,那麼返回值為指向被指定資源資訊塊的控制代碼。
// 為了獲得這些資源,將這個控制代碼傳遞給LoadResource函式。
// 如果函式執行失敗,則返回值為NULL。
// 若想獲得更多錯誤資訊,請呼叫GetLastError函式。
HRSRC hResource = ::FindResource(NULL, pName, pType);
if (!hResource)
return false;
// 返回指定資源的位元組數大小。
DWORD imageSize = ::SizeofResource(NULL, hResource);
if (!imageSize)
return false;
// 先裝載指定資源到全域性儲存器。
// 然後,鎖定資源並得到資源在記憶體中的第一個位元組的指標。
const void* pResourceData = ::LockResource(::LoadResource(NULL, hResource));
if (!pResourceData)
return false;
// Windows API函式。該函式從堆中分配一定數目的位元組數。
m_hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (m_hBuffer)
{
// 鎖定記憶體中指定的記憶體塊,並返回一個地址值,令其指向記憶體塊的起始處。
void* pBuffer = ::GlobalLock(m_hBuffer);
if (pBuffer)
{
// 將一塊記憶體的資料從一個位置複製到另一個位置。
CopyMemory(pBuffer, pResourceData, imageSize);


IStream* pStream = NULL;
// 指定記憶體建立流物件。
// 如果函式建立流物件成功則返回S_OK。
if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
{
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (m_pBitmap)

if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
return true;


delete m_pBitmap;
m_pBitmap = NULL;
}
}
// 解除鎖定的記憶體塊,使指向該記憶體塊的指標無效。
// GlobalLock鎖定的記憶體,一定要用GlobalUnlock解鎖。
::GlobalUnlock(m_hBuffer);
}
// 釋放指定的全域性記憶體塊。
::GlobalFree(m_hBuffer);
m_hBuffer = NULL;
}
return false;
}