GGym's Practice Notes

DC (Device Context) 본문

WinAPI

DC (Device Context)

GGym_ 2020. 5. 7. 16:22

기본적으로 Windows는 세가지 동적 연결 라이브러리(DLL: Dynamic Link Library)로 구성된다.

 - Kernel : 메모리, 프로그램 관리

 - User : UI, 윈도우 관리

 - GDI (Graphic Device Interface) : 화면처리, 그래픽

 

DC화면 출력에 필요한 모든 정보를 가지는 구조체이기 때문에 이 셋중 DC는 GDI와 관계가 되어있다. 

하나의 윈도우에 대한 그래픽 정보를 가지고 있으며, 예를 들어 폰트, 선의 색상, 굵기, 채우는 무늬, 그리기 모드, 시작 위치 등의 정보를 가지고 있다.

DC의 내부는 건들 필요없이 나머지는 디폴트 정보를 적용하고 DC의 핸들만 사용자에게 건내면 된다.

DC 핸들의 자료형 : HDC

 

HDC를 얻으려면 getDC()함수를 통하여 해당 윈도우의 DC를 작성해야 한다.

HDC hdc = GetDC(hWnd);

HDC는 Release를 안할 경우 메모리 누수가 일어난다.

ReleaseDC(hWnd, hdc);

 

BeginPaint()함수를 통해서 HDC를 얻을 수도 있다. (PAINTSTRUCT의 객체의 주소도 넘겨받아야 하며 WM_PAINT 내부에서만 가능하다.)

HDC hdc = BeginPaint(hWnd, &ps);

EndPaint()함수를 통해 해제한다.

EndPaint(hWnd, &ps);

BeginPaint는 윈도우창이 갱신(이동,새로 생성 등)정보까지 HDC에게 준다. 따라서 Render는 가급적 BeginPaint와 EndPaint안에 사용한다.

 

HDC 적용 코드 :

hdc = GetDC(hWnd);

LPCTSTR szTemp1 = TEXT("TextOut!");
TextOut(hdc, 10, 10, szTemp1, lstrlen(szTemp1));	// (hdc, 출력위치(x, y), 문자열, 문자열길이)
SetTextAlign(hdc, TA_CENTER);	// (hdc, TA_정렬옵션) default:TA_LEFT
TextOut(hdc, 10, 30, szTemp1, lstrlen(szTemp1));	// SetTextAlign 적용

LPCTSTR szTemp2 = TEXT("DrawText!");
RECT rcTextArea1{ 50, 50, 100, 100 };
DrawText(hdc, szTemp2, -1, &rcTextArea1, DT_CENTER | DT_NOCLIP | DT_SINGLELINE | DT_VCENTER);
// (hdc, 텍스트, 텍스트 길이(-1:자동), 사각영역 변수 주소, 정렬모드)

LPCTSTR szTemp3 = TEXT("Color Text!");
RECT rcTextArea2{ 50, 100, 100, 150 };
SetTextColor(hdc, 0x0000ffff);	// 텍스트 색상지정 (hdc, 32비트 색상)
SetBkMode(hdc, OPAQUE);		// 텍스트 배경모드 지정 TRANSPARENT(투명모드), OPAQUE(불투명모드)
SetBkColor(hdc, 0x00777777);	// 텍스트 배경색상 지정 (hdc, 32비트 색상)
DrawText(hdc, szTemp3, -1, &rcTextArea2, DT_LEFT | DT_NOCLIP);

ReleaseDC(hWnd, hdc);

'WinAPI' 카테고리의 다른 글

WinAPI에 OpenGL 쓰기  (0) 2020.05.13
GDI Object  (0) 2020.05.09
윈도우 창크기 조정 세팅 (AdjustWindowRect(), SetWindowPos)  (0) 2020.05.07
WinAPI 기본 구조  (0) 2020.05.07