Tech/Win32 API

DC(Device Context)

2016. 11. 13. 01:34

DC(Device Context)란?

출력에 필요한 모든 정보를 가지는 데이터 구조체이며, GDI(Graphic Device Interface)모듈에 의해 관리됩니다.

화면으로 출력 하기 위해서는 반드시 DC가 있어야 합니다.


이 DC를 얻는 방법은 두 가지가 있습니다.


우리는 인수로 전달 된 창(Window)의 핸들(HWND)로 부터 GetDC, BeginPaint 함수를 통해 DC를 가져올 수 있습니다.

이 때 중요한 것은 DC를 무사히 다 사용했으면 반드시 ReleaseDC, EndPaint함수를 통해 반환해야 합니다. DC도 메모리를 차지하므로 반드시 할당 후 해제 원칙이 준수되어야 합니다.


두 가지 방법에 대해 하나씩 보겠습니다.


1. GetDC 함수를 통해 얻어오는 방법


WM_PAINT 이외의 메시지에서 클라이언트 영역 일부를 그리고자 할 때 또는 그 밖의 목적으로 디바이스 컨텍스트 정보를 필요로 하는 경우 사용하는 함수입니다.


HDC GetDC(HWND hWnd);

int ReleaseDC(HWND hWnd, HDC hDC);


GetDC가 리턴하는 DC 핸들의 클리핑 직사각형 영역은 전체 클라이언트 영역입니다.

그리고, BeginPaint와 달리 GetDC는 무효 영역을 유효화하지 않습니다. 클라이언트 영역 전체를 유효화해야 한다면 다음과 같은 함수를 호출해야 합니다.

 

ValidateRect (hWnd, NULL);



2. WM_PAINT 메시지 루틴내에서 DC를 얻어오는 방법


WM_PAINT 메시지 루틴에서는 DC를 GetDC로 얻지 않고 BeginPaint함수로 얻고, EndPaint함수로 해제해 주어야 합니다.


HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);

BOOL EndPaint(HWND hWnd, CONTST PAINTSTRUCT *lpPaint);


BeginPaint함수가 호출되면 클라이언트 영역은 모두 유효화 되게 됩니다.

BeginPaint함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 필요로 합니다. 이 구조체는 그림 그리기에 필요한 정보를 담습니다.


typedef struct tagPAINTSTRUCT {


HDC    hdc;

BOOL   fErase;

RECT    rcPaint;

BOOL   fRestore;

BOOL   fIncUpdate;

BYTE    rgbReserved[16];

} PAINTSTRUCT;


앞의 세 멤버는 사용자가 사용하는 멤버이며 나머지 세 멤버는 윈도우즈가 내부적으로 사용하므로 사용자가 건드려서는 안됩니다.



'Tech > Win32 API' 카테고리의 다른 글

입력 1. 키보드  (0) 2016.11.16
무효 영역(Invalid Region)  (0) 2016.11.15