본문 바로가기

assortrock/Win32 API

Win32 API - DC (Device Context)

1. Device Context 란

Win32 에서 출력을 위해 필요한 구조체. 해당 구조체는 출력에 필요한 모든 정보를 갖고 있는 데이터 구조체이다.

 

2. 윈도우는 기본적으로 세가지 동적 연결 라이브러리(Dynamic Linked Library)로 구성되어 있다.

- Kernel : 메모리를 관리하고 프로그램을 실행한다.

- User : 유저 인터페이스(UI)와 윈도우 관리

- GDI : Graphic Device Interface, 화면 처리와 그래칙 등 모든 출력 장치를 제어

 

3. GDI 와 디바이스 드라이버 덕분에 Windows API는 디바이스에 비의존적일 수 있다.

- GDI : 모든 출력장치를 제어하는 인터페이스.

- GDI 오브젝트 : 출력 장치를 제어하고 또한 출력하는 것 . 펜, 브러시, 비트맵, 폰트등 화면에 출력하는 요소들을 뜻한다.

- Deviec Context : GDI 오브젝트를 모아놓은 곳 -> Device Context가 출력에 필요한 모든 정보를 가지는 데이터 구조체라고 하는 이유

- GDI 모듈은 Device Context 를 관리한다.

 

4. DC 가 필요한 이유

하나의 출력을 수행하는데 필요한 많은 정보들을 Device Context 에 저장된 정보를 기반으로 쉽게 처리하기 위해서.

또한  다른 프로그램의 윈도우 끼리 출력 결과가 서로 방해하지 않도록 완충하는 역할도 하고 있다.

 

5. 문자열 출력하기 - TextOut

5-1 HDC : Handle Device Context

 DC 를 다루는 핸들 구조체인 hdc 를 선언.

 

5-2 MW_LBUTTONDOWN 메세지

 WM 은 Window Message 의 약자이다. 왼쪽 마우스를 눌렀을 때 발생하는 메세지. DOWN 이기 때문에 눌리는 타이밍에 발생한다.

 

5-3 GetDC

윈도우의 DC 를 얻을 수 있는 함수. 추후 자세히 설명

 

5-4 TextOut(DC, X, Y, 문자열, 문자열 길이)

문자열 출력 함수.

 

5-5 ReleaseDC

DC반환 함수. 메모리의 낭비를 막기 위해 사용된다. GetDC와 ReleaseDC 를 세트라고 생각하자.

 

5-6 return

lParam, wParam의 정보에 따라 메세지 내부에 switch 문을 또 사용하는 경우가 있다. 이때 break 문으로 수분하고 메세지 종료는 return 으로 구분한다.

 

5-7 WM_DESTROY 메세지

 우측 상단 x 아이콘을 누를 겨우 발생하는 메세지. 프로그램이 종료할 때 발생하는 메세지이다. PostQuitMessage(0)을 통해 종료 메세지 전송.

 

5-8 문제점

-> 이 코드가 실행될 경우 윈도우 창의 크기가 변화하면 텍스트가 사라진다.

 

5-9 WM_PAINT 메세지

다음의 코드로 윈도우가 시작되면 바로 "Hellow World!" 가 출력 되고  윈도우 창의 크기를 바꾸어도 텍스트가 사라지지 않는다.

WM_PAINT는 화면에 출력하는 메시지로 발생하는 시점은 여러 개가 있다.

프로그램이 실행 되었을 때 WM_PAINT 메세지가 발생한다. 실행 이후 발생하는 메세지를 처리하고 , 윈도우를 띄우기 위해서 WM_PAINT가 발생하는 것. 이 때문에 윈도우가 시작하자마자 문자열이 출력된다.

- 여기에서 BeginPaint()와 EndPaint()는 GetDC()와 ReleaseDC()와 똑같은 역할을 한다.

 

6. BeginPaint()와 GetDC()

BeginPaint()는 WM_PAINT메세지 에서만 사용된다. BeginPaint는 윈도우의 Clipping Region 을 자동으로 파악한다.

Clipping Region이란 클라이언트 영역의 특정 부분에 그리기를 한정하는 영역을 의미한다. 윈도우의 화면 상의 변화하는 부분. -> 프로그램을 최소화 했다가 다시 띄우거나 창의 크기를 변화 시키는 것에 WM_PAINT만 발생하고, WM_LBUTTONDOWN 메세지가 발생하지 않기 때문에 문자열이 출력되지 않은 것.

 

GetDC() 는 WM_PAINT 외에 메세지에서 출력을 하기 위해 해당 Client 영역의 Device Context를 얻는 함수이다. 일시적인 출력 방법으로 그 이후의 변화에 대해서는 작용하지 않는다.

 

-> BeginPaint() 함수는 정적(Static) 출력을 하기 위해 사용하고, GetDC() 함수는 동적(Dynamic)출력을 위해 사용한다.

두 함수 모두 사용이 끝나면 메모리를 반환해야 한다.

 

7. 문자열 출력하기 - DrawText

DrawText는 사각 영역을 정의 하여 영역 안에 문자열을 출력한다.

7-1 RECT 구조체

사각 영역 정의

typedef struct _RECT{
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
} RECT;

7-2 DrawText 매개변수

hdc : DC의 핸들

lpchText : 출력할 문자열

nCount : 출력할 문자열의 길이

lpRect : Rect 구조체

uFormat : 문자열을 출력할 정렬방법

uFormat

 

7-3 문자열 출력 정리

 TextOut : 한줄만 출력, 정렬 정보는 DC에 담겨 전달받는다.

 DrawText : 사각 영역을 정의하여 그 안에 문자열을 출력. 자동 줄바꿈. 문자열이 사각 영역을 초과 하면 짤려서 나옴.

8. 문자열 정렬

8-1 SetTextAlign( HDC hdc, UNIT fMode)

문자열의 정렬 방법을 변경하는 함수

- 인자 : hdc - DC의 핸들, fMode - 정렬 정보

fMode

ex) TA_UPDATECP : 지정한 좌표가 CP를 사용, 출력 후 CP변경

CP(Current Position)은 그래픽을 출력할 때 다음 그래픽이 출력될 위치를 뜻한다.

값에 따른
출력할 문자열이 여러개인 경우
출력 문자열이 여러개인 경우
정렬 함수를 사용
정렬 함수를 사용하여 문자열 일자로 정렬

 

 

 

 

* 참조

https://chanos.tistory.com/entry/Windows-API-Device-Context%EB%9E%80-Win32-API%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0?category=1014646

 

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

Win32 API - 키보드 입력  (0) 2022.07.05
Win32 API - 메세지 박스 출력  (0) 2022.07.04
Win32 API - 도형 출력  (0) 2022.07.04
Win32 API 배경 지식 - 핸들(Handle)  (0) 2022.06.30
Win32 API 기본  (0) 2022.06.30