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 : 문자열을 출력할 정렬방법
7-3 문자열 출력 정리
TextOut : 한줄만 출력, 정렬 정보는 DC에 담겨 전달받는다.
DrawText : 사각 영역을 정의하여 그 안에 문자열을 출력. 자동 줄바꿈. 문자열이 사각 영역을 초과 하면 짤려서 나옴.
8. 문자열 정렬
8-1 SetTextAlign( HDC hdc, UNIT fMode)
문자열의 정렬 방법을 변경하는 함수
- 인자 : hdc - DC의 핸들, fMode - 정렬 정보
ex) TA_UPDATECP : 지정한 좌표가 CP를 사용, 출력 후 CP변경
CP(Current Position)은 그래픽을 출력할 때 다음 그래픽이 출력될 위치를 뜻한다.
* 참조
'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 |