를 코드 상단에 적어주자.
HBITMAP LoadPNGToHBITMAP(LPWSTR res) {
//http://www.codeproject.com/Articles/3537/Loading-JPG-PNG-resources-using-GDI
//http://blog.iolate.kr/204
HRSRC imgResource = FindResource(NULL, res, L"PNG");
if (!imgResource) return NULL;
DWORD imgSize = SizeofResource(NULL, imgResource);
if (!imgSize) return NULL;
const void* pResourceData = LockResource(LoadResource(hInst, imgResource));
if (!pResourceData) return NULL;
HGLOBAL m_hBuffer = GlobalAlloc(GMEM_MOVEABLE, imgSize);
HBITMAP hBitmap;
if (m_hBuffer) {
void* pBuffer = GlobalLock(m_hBuffer);
if (pBuffer) {
CopyMemory(pBuffer, pResourceData, imgSize);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK) {
GpBitmap* m_pBitmap;
DllExports::GdipCreateBitmapFromStream(pStream, &m_pBitmap);
pStream->Release();
if (m_pBitmap) {
DllExports::GdipCreateHBITMAPFromBitmap(m_pBitmap, &hBitmap, ARGB(0xFF000000)); //255, 0, 0, 0
}
}
}
GlobalUnlock(m_hBuffer);
}
GlobalFree(m_hBuffer);
m_hBuffer = NULL;
if (hBitmap) {
return hBitmap;
}else return NULL;
}
WM_PAINT 메세지에서 아래 더보기와 같이 그려주면 된다.
사이즈는 원래 구하는 코드가 있었는데, 난 필요없어서 제거함. 그정도는 구글링하자.(후에 내 자신을 원망하겠지..)
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HGDIOBJ oldBitmap = SelectObject(hdcMem, hBitmap);
BitBlt(hdc, 0, 0, 800, 600, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
break;
}
* VS 2015 에서 VS 2010 의 컴파일러를 사용하여, Win XP SP3 및 Win 7 SP1 에서의 작동을 확인하였다.