프로그래밍/VC++ 개발 코딩

JPG resouce 등록하고 사용하기

강태공97 2014. 1. 17. 21:32

JPG resource를 등록하고 사용해 보자.!!

1. GDI+를 초기화한다.

xxxx.cpp 파일 처음부분에 하기와 같이 설정한다.

//////////////////////////////////////////////////////////////////////////
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus")
HINSTANCE g_hInst;
class CGdiPlusStarter
{
private:
ULONG_PTR m_gpToken;

public:
bool m_bSuccess;
CGdiPlusStarter() {
GdiplusStartupInput gpsi;
m_bSuccess=(GdiplusStartup(&m_gpToken,&gpsi,NULL) == Ok);
}
~CGdiPlusStarter() {
GdiplusShutdown(m_gpToken);
}


};

CGdiPlusStarter g_gps;
////////////////////////////////////////////////////////////////////////

2. 제대로 초기와 되었는지 확인한다.

GDI를 사용하는 xxxxx::OnInitDialog() 함수에 하기내용을 추가한다.

////////////////////////////////////////////////////////////////////////

if (g_gps.m_bSuccess == FALSE) {
AfxMessageBox(TEXT("GDI+ 라이브러리를 초기화할 수 없습니다."));
return 0;
}

////////////////////////////////////////////////////////////////////////

3. JPG File을 import 한다.

resource File에 원하는 JPG 파일을 호출하여 등록해둔다.

예를들어, "JPG" IDR_JPG1 이렇게 등록되었다고 가정하자.

4. JPG resource를 열어, Dialog Box에 출력한다.

////////////////////////////////////////////////////////////////////////

CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트

Graphics G(dc);

or Graphics(m_hWnd); 도 가능.


HRSRC hResource = FindResource(g_hInst, MAKEINTRESOURCE(IDR_JPG1),
TEXT("JPG"));
if (!hResource) return;

DWORD imageSize = SizeofResource(g_hInst, hResource);
HGLOBAL hGlobal = LoadResource(g_hInst, hResource);
LPVOID pData = LockResource(hGlobal);

HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE,imageSize);
LPVOID pBuffer = GlobalLock(hBuffer);
CopyMemory(pBuffer,pData,imageSize);
GlobalUnlock(hBuffer);

IStream *pStream;
HRESULT hr=CreateStreamOnHGlobal(hBuffer,TRUE,&pStream);

Image src_img(pStream);
pStream->Release();
if (src_img.GetLastStatus() != Ok) return;

G.DrawImage(&src_img, 0, 0);

////////////////////////////////////////////////////////////////////////

이렇게 하면 JPG 파일을 열고, Dialog Box에 원하는 resource를 출력해준다.

끝...

참고로, Position 관련하여,

GetWindowRect, GetClientRect, ScreenToClient, ClientToScreen 함수등을 사용하여,

position의 변경을 꾀할수있다.. ^^*