GDI+ 에는 이미지의 회전과 같은 향상된 함수들이 제공 되지만
사용되는 이미지 데이타가 Gdiplus::Image를 사용 하여야 하므로 보통은 그림파일에서 불러오는
구조를 많이 사용 하게 되는데요, 다음 소스처럼 하면 RCDATA 타입 리소스를 Gdiplus::Image 형태로
불러오기가 가능합니다. 저는 PNG로 테스트 했어요,
Gdiplus::Image * GetImageResource( TCHAR* ResName )
{
Gdiplus::Image * image = NULL;
HRSRC hResource = ::FindResource(HInstance, ResName, RT_RCDATA);
if (!hResource) return NULL;
DWORD imageSize = ::SizeofResource(HInstance, hResource);
if (!imageSize) return NULL;
const void* pResourceData = ::LockResource(::LoadResource(HInstance, hResource));
if (!pResourceData) return NULL;
HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (hBuffer)
{
void* pBuffer = ::GlobalLock(hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
{
image = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (image)
{
if (image->GetLastStatus() != Gdiplus::Ok)
{
delete image;
image = NULL;
}
}
}
}
::GlobalUnlock(hBuffer);
::GlobalFree(hBuffer);
}
return image;
}
사용 할때는
Gdiplus::Image * imgBG = GetImageResource(L"BACKGROUND");
HDC hdc = m_Target->Canvas->Handle;
Gdiplus::Graphics graphics(hdc);
float RollAngle = 45.0f;
graphics.RotateTransform(RollAngle);
graphics.DrawImage(imgBG , x, y, imgBG->GetWidth(), imgBG->GetHeight());
|