WinAPI: Device Context
1. DC의 필요성
Windows는 메모리를 관리하고 프로그램을 실행시키는 KERNEL, 유저 인터페이스와 윈도우를 관리하는 USER, 화면 처리와 그래픽을 담당하는 GDI, 총 3가지 동적 연결 라이브러리로 구성되어 있습니다. 출력을 하려면 GDI 모듈에 특별히 관심을 기울여야 합니다.
DC(Device Context)란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI 모듈에 의해 관리됩니다.
2. 문자열 출력
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
TextOut(hdc, 100, 100, "Beautiful Korea", 15);
ReleaseDC(hWnd, hdc);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
문자열을 출력하도록 변경한 WndProc 함수입니다. 마우스 왼쪽 버튼이 클릭되었을 때, GetDC라는 함수를 통하여 DC를 얻고 ReleaseDC 함수를 DC를 해제합니다.
3. WM_PAINT 메시지
위의 예제에는 출력된 문자열이 윈도우 크기를 변경시키면 사라지는 문제점을 가지고 있습니다. Windows는 화면을 보관, 복구해 주지 않기 때문에 이런 현상이 발생하는 것입니다. 화면을 유지시키려면 복구해 주어야 합니다. 이 때 WM_PAINT 메시지가 이용됩니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
TextOut(hdc, 100, 100, "Beautiful Korea", 15);
EndPaint(hWnd, &ps);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
이렇게 쓰면 문자열이 지워질 일 없이 유지됩니다.
4. DC를 얻는 방법
HDC GetDC(HWND hWnd);
int ReleaseDC(HWND hWnd, HDC hDC);
위 두개의 함수로 DC를 얻고 해제합니다. DC는 주로 하나의 윈도우와 연관되는 출력 정보를 가집니다. GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납합니다. 사용된 HDC 변수는 메모리를 할당받았기 때문에 ReleaseDC 함수로 해제해 주어야 합니다.
HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);
2번째 방법은 WM_PAINT 메시지 루틴에서만 사용할 수 있습니다. GetDC가 아닌 BeginPaint 함수로 DC 핸들을 얻으며 해제할 때는 EndPaint 함수를 사용합니다. GetDC는 일반적인 방법이며 BeginPaint는 WM_PAINT 메시지 내에서 좀 더 전문적인 함수로 사용됩니다.
BeginPaint 함수는 페인트 정보 구조체 또한 인수로 요구하며 이 구조체는 그림 그리기에 필요한 정보를 담습니다.
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
hdc, fErase, rcPaint는 사용자가 사용하는 멤버이며, 나머지는 Windows가 내부적으로 사용합니다.
Windows는 메모리를 관리하고 프로그램을 실행시키는 KERNEL, 유저 인터페이스와 윈도우를 관리하는 USER, 화면 처리와 그래픽을 담당하는 GDI, 총 3가지 동적 연결 라이브러리로 구성되어 있습니다. 출력을 하려면 GDI 모듈에 특별히 관심을 기울여야 합니다.
DC(Device Context)란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI 모듈에 의해 관리됩니다.
2. 문자열 출력
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
TextOut(hdc, 100, 100, "Beautiful Korea", 15);
ReleaseDC(hWnd, hdc);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
문자열을 출력하도록 변경한 WndProc 함수입니다. 마우스 왼쪽 버튼이 클릭되었을 때, GetDC라는 함수를 통하여 DC를 얻고 ReleaseDC 함수를 DC를 해제합니다.
3. WM_PAINT 메시지
위의 예제에는 출력된 문자열이 윈도우 크기를 변경시키면 사라지는 문제점을 가지고 있습니다. Windows는 화면을 보관, 복구해 주지 않기 때문에 이런 현상이 발생하는 것입니다. 화면을 유지시키려면 복구해 주어야 합니다. 이 때 WM_PAINT 메시지가 이용됩니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
TextOut(hdc, 100, 100, "Beautiful Korea", 15);
EndPaint(hWnd, &ps);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
이렇게 쓰면 문자열이 지워질 일 없이 유지됩니다.
4. DC를 얻는 방법
HDC GetDC(HWND hWnd);
int ReleaseDC(HWND hWnd, HDC hDC);
위 두개의 함수로 DC를 얻고 해제합니다. DC는 주로 하나의 윈도우와 연관되는 출력 정보를 가집니다. GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납합니다. 사용된 HDC 변수는 메모리를 할당받았기 때문에 ReleaseDC 함수로 해제해 주어야 합니다.
HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);
2번째 방법은 WM_PAINT 메시지 루틴에서만 사용할 수 있습니다. GetDC가 아닌 BeginPaint 함수로 DC 핸들을 얻으며 해제할 때는 EndPaint 함수를 사용합니다. GetDC는 일반적인 방법이며 BeginPaint는 WM_PAINT 메시지 내에서 좀 더 전문적인 함수로 사용됩니다.
BeginPaint 함수는 페인트 정보 구조체 또한 인수로 요구하며 이 구조체는 그림 그리기에 필요한 정보를 담습니다.
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
hdc, fErase, rcPaint는 사용자가 사용하는 멤버이며, 나머지는 Windows가 내부적으로 사용합니다.
댓글
댓글 쓰기