프로그래밍/VC++

GDI+ 사용하기

panpro 2007. 7. 9. 21:15

#include <gdiplus.h>

이 헤더 파일에 GDI+의 모든 타입, 열거형, 클래스 등이 선언되어 있다. gdiplus.h를 반드시 인클루드해야 하며 플랫폼 SDK가 지정된 경로에 설치되어 있어야 한다. 이 헤더 파일을 열어 보면 GDI+의 기본적인 선언문들을 직접 구경할 수 있는데 gdiplus.h는 GDI+의 모든 헤더를 포함하는 헤더 파일 컨테이너라고 할 수 있다.

② using namespace Gdiplus;

GDI+의 모든 명칭은 GdiPlus 네임 스페이스에 포함되어 있다. 따라서 클래스 이름과 열거형 이름앞에 GdiPlus::을 일일이 붙여야 하는데 너무 번거로우므로 using 지시자를 사용하여 GdiPlus 네임 스페이스에 선언된 모든 명칭을 전역 영역으로 가져 오도록 한다. 이 지시자에 의해 컴파일러는 전역 네임 영역에 없는 명칭에 대해 GdiPlus 네임 스페이스를 검색하므로 이름만으로 GDI+의 명칭들을 사용할 수 있다.

③ #pragma comment(lib,"gdiplus.lib")

프로젝트 설정 대화상자의 링크 탭에 gdiplus.lib 임포트 라이브러리를 지정하여 그래픽을 출력하는 실제 코드는 gdiplus.dll에 있음을 알린다. 아니면 소스에 위의 한 줄을 적어 놓아도 된다.

라이브러리 모듈에게 gdiplus.lib 임포트 라이브러리를 참조하라고 알려 준다. 매번 프로젝트 설정 대화상자를 열어서 라이브러리를 지정하는 것은 귀찮기 때문에 소스에 한 줄 적는 것이 훨씬 더 편리하다. 새 소스를 만들 때도 붙여 넣기만 하면 되므로 실습에도 편리하다.

④  Status GdiplusStartup(ULONG_PTR *token, const GdiplusStartupInput *input, GdiplusStartupOutput *output);

프로그램 시작시 GDI+ 라이브러리를 초기화한다. 이때는 다음 전역 함수를 사용한다. GDI+는 모든 것이 클래스로 되어 있지만 초기화와 관련된 함수는 일반 함수로 제공된다. 객체를 아직 만들기 전이므로 초기화 함수는 일반 함수 또는 정적 함수일 수밖에 없다.

token은 초기화시 받는 토큰이며 종료할 때 이 토큰을 GdiplusShutdown으로 전달해야 한다. input은 입력 옵션 구조체이며 이 안에 GDI+의 버전, 디버그 콜백 함수, 백그라운드 스레드 허용 여부 등을 지정할 수 있는데 별 다른 옵션을 지정하지 않을 경우는 변수만 선언해서 그 포인터를 넘겨 주면 된다. 예제에서는 gpsi 구조체를 선언한 후 넘기기만 했다. 도움말에서 확인해 보면 알겠지만 이 구조체의 생성자가 무난한 디폴트로 초기화하도록 되어 있으므로 지역 변수라 하더라도 쓰레기값이 들어가지는 않는다. 생략할 수 없으므로 반드시 변수를 선언한 후 그 포인터를 전달해야 한다.

output은 초기화 결과를 돌려 주기 위한 구조체인데 필요없을 경우 NULL로 줄 수 있다. 백그라운드 스레드를 허용하지 않을 때만 output 인수가 필요하다. 이 함수는 초기화 결과를 Status형의 열거형으로 리턴하는데 성공했을 경우 Ok가 리턴된다. Ok가 아닌 경우는 GDI+를 사용할 수 없으므로 적절한 에러 처리를 할 필요가 있다. 예제에서는 메시지 박스를 출력하고 프로그램을 종료했다.

void GdiplusShutdown(ULONG_PTR token);

프로그램을 끝낼 때 GDI+ 라이브러리를 셧다운한다. GDI+는 실행중에 많은 리소스를 할당하는데 이 리소스를 반드시 해제해야 한다. 다음 함수를 사용한다.


출처 : http://icarosss.egloos.com

'프로그래밍 > VC++' 카테고리의 다른 글

GDI+에서 리소스 비트맵 가져와서 쓰기  (0) 2007.07.23
이미지 회전변환  (0) 2007.07.11
XP에서 IDC_HAND가 없다고 나올 때  (0) 2007.07.05
XML 저장하기  (0) 2007.06.27
GDI+를 이용 Drop Shadow 주기  (0) 2007.06.12