DC(Device Contexts)

2011. 3. 17. 00:32 from PROGRAMMING/winAPI

■ DC(Device Contexts)

: 출력관련 정보(폰트, 선의 색상과 굵기, 출력 방법 등)를 한꺼번에 모아 모니터/프린터 드라이버에 보내주는 구조체.

이 구조체가 없다면 모니터/프린터 출력은 모두 불가능 하므로, DC구조체에 값을 초기화 하는 것은 필수적이다.

프로그램은 DC의 값을 채워주고, 그 함수(API함수)를 호출해주면 운영체제에서 구현하여 데이터를 출력할 수 있음.

출력을 위해 반드시 DC가 있어야 하며, DC는 GDI(Graphic Device Interface) 모듈에 의해서 관리됨.

 

■ DC를 가져오는 방법(문자열 출력 시)

1. GetDC

DC는 주로 하나의 윈도우와 연관되는 출력정보를 가진다. 그래서 인수로 어떤 윈도우에 대한 DC가 필요한가를 밝혀주어야 한다.

GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납한다.

위의 소스는 이 핸들을 HDC형의 hdc변수에 대입한 후, 이 핸들값을 TextOut 함수의 첫번째 인수로 사용하고 있다.

GetDC에 의해 얻어진 핸들은 사용 후에 반드시 ReleaseDC함수에 의해 해제되어야 한다.

DC도 메모리를 차지하므로 할당 후 해제 원칙이 반드시 준수되어야 한다.(http://www.winapi.co.kr/)

 

출력결과)

윈도우에 왼쪽 버튼을 클릭하면, 지정된 좌표(300, 200)에 "Beautiful Korea"가 출력된다.

그러나 GetDC로 만든 문자열은 다른 윈도우에 의해 사라진다.

즉, 윈도우의 크기가 변경되면 다시 마우스 왼쪽 버튼을 클릭하기 전까지 문자열은 나타나지 않는다.

윈도우에서 다른 윈도우에 의해 가려진 영역을 무효영역, 그 외 보이는 영역을 유효영역이라고 하는데,

운영체제가 화면을 보관 및 복구하지 않으므로 가려졌던 무효영역을 복구하도록 만들어 주어야 한다.

 

2. BeginPaint

 

가려졌던 문자열을 지워지지 않게 한다는 것은, 프로그램의 입장에서는 가려졌던 부분의 위치를 다시 내보내는 것이다.

PAINTSTRUCT 구조체의 멤버중 RECT가 가려져 있는 무효영역의 크기 정보를 가지고 있어 기존의 정보를 다시 가져 올 수 있게 한다.

(RECT에는 크기정보만 있을 뿐 실제 값(데이터)은 여전히 DC가 가지고 있음)

따라서 BeginPaint함수를 사용하기 위해서는 BeginPaint정보를 저장하고 있는 구조체인 PAINTSTRUCT가 반드시 필요하다.

 

문자열이 가려졌을 때마다 다시 출력되게 하기 위해서는 문자열의 출력시점을 바꿔 주어야 한다.

마우스 왼쪽 버튼을 클릭하는 메시지를 받았을 때(WM_LBUTTONDOWN) 문자열이 출력되게 했다면, 이번에는 WM_PAINT메시지를 사용해

메시지가 지워질때마다 문자열이 출력되도록 해주는 것이다.

이 때 WM_PAINT메시지 루틴에서는 DC핸들을 GetDC가 아닌 BeginPaint함수로 얻을 수 있으므로 BeginPaint함수를 사용하고, 해제는 EndPaint함수를 이용한다.

 

■ DC의 종류(types of DCs)

윈도우즈가 제공하는 DC는 그리는 표면이 어딘가에 따라 4가지 종류가 있다.

1. Display DC: Supports drawing operations on a video display

2. Printer DC: Supports drawing operations on a printer or plotter

3. Memory(or compatible) DC: Supports drawing operations on a bitmap

4. Information DC: Supports the retrieval! of device data

 

□ Display DC

BeginPaint, GetDc, GetDCEx 함수의 호출에 의해 얻을 수 있는 DC이다. 보통 클라이언트 영역(일반적으로 윈도우 창에서 내용이 보여지는 하얀 부분)에만 그려줄 때 Display DC를 받는다. 그러나 GetWindowDC함수 호출에 의해 window DC를 얻을 수 있다.

window DC는 프로그램이 윈도우 내에 어느 영역에든 그릴 수 있게 하는 DC이다.

프로그램이 그리는 것이 끝나면 즉, DC의 사용이 끝나면 반드시 EndPaint나 ReleaseDC 함수로 해제해야 한다.

 

video display를 위한 DC에도 Class/Common/Private/Window/Parent 5가지 종류가 있다.

 

 

이 중 자주 사용되는 것은 Common DC와 Private DC이다.(http://blog.naver.com/kimgudtjr/140098234234)

 

□ Printer DC

dot-matrix printer, int-jet printer, laser printer, or plotter과 같은 프린터 장치에 사용되는 Dc이다.

CreateDC 함수 호출과 프린터 드라이버의 이름, 프린터의 이름과 같은 인수를 보내 프린터 DC를 만든다.

프로그램이 프린트를 마치면, DeleteDC를 호출하여 프린터DC를 삭제한다.

ReleaseDC가 아니라 반드시 DeleteDC함수로 '해제'가 아닌, '삭제'를 해주어야 한다.

 

□ Memory DC

비트맵과 메타파일을 다루는 DC이다. 메모리 DC는 시스템이 가상 device로서 메모리 일부를 사용할 수 있게 한다.

프로그램이 일시적으로 비트맵을 위한 색상정보을 저장하는데 사용할 수 있는 메모리 내의 비트배열이다.

비트맵은 device와 호환되므로, 메모리 DC를 compatible device context라고도 한다.

 

memory DC는 CreateCompatibleDC 함수를 호출하여 만들 수 있다. 

 

□ Information DC

디폴트 device 데이타를 다시 가져오는데 사용되는 DC.


See Also
Device Context Types in msdn

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0318수업] 윈도우 메시지  (0) 2011.03.18
[0317수업] struct SCROLLINFO  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
[0315수업] WinMain(), WndProc()  (0) 2011.03.15
Posted by 마마필로 :