:: ADVANCE ::

[DC] DC (Device Context) 본문

Image Processing/Windows Programming

[DC] DC (Device Context)

KSJ14 2015. 12. 17. 16:48
반응형

[DC] DC (Device Context)


cairo로 windows에 그림을 그릴 때 Windows DC가 필요하다.


Windows는 3개의 DLL(동적 연결 라이브러리)로 구성되어 있다.

 - KERNEL     : 메모리 관리 및 프로그램 실행    

 - USER          : 유저 인터페이스와 윈도우 관리

 - GDI              : 화면 처리와 그래픽 담당


Windows API 함수는 대부분은 이 세가지 DLL에 의해 제공되는 것이다.


즉, Windows 의 클라이언트 영역에 그리기를 하려면 이 GDI(Graphics Device Interface) 함수를 사용해야 한다.

그리고 HDC는 'Handleto a Device Context'로 GDI의 중요한 부분이다.

-> DC 개체를 참조하는데 사용되는 번호라는 의미이다.



DC 란,

출력에 필요한 모든 정보를 가진 데이터 구조체이며, GDI (Graphic Device Interface) 모듈에 의해 관리된다.

간단히 함수를 만들려면 DC에 모든 정보를 담아서 간편하게 사용할 수 있어야 한다.


- Device Context의 약자로 출력에 필요한 모든 정보를 가지는 데이터 구조체

- DC는 그리기에 필요한 다양한 정보들의 저장소 역할을 한다.

- GDI 모듈에 의해 관리된다. (폰트, 선의 굵기, 무늬 등등)

- DC는 그리기 함수들이 참조하는 원점 (윈도우 활성영역 left, top 부분)의 정보도 제공한다.

- DC는 윈도우끼리의 출력 결과가 서로 방해하지 않도록 완충 역할도 한다.

- WM_PAINT 메세지에서 보통 사용된다.



DC 얻기와 해제

1. HDC GetDC (HWND hWnd);

   int ReleaseDC (HWND hWnd, HDC hDC);

: GetDC로 DC를 얻고, DC를 사용한 후에 ReleaseDC로 해제해야 한다.

DC도 메모리를 참조하고 있으므로 반드시 해제해야 한다.


2. HDC BeginPaint    (HWND hWnd, LPPAINTSTRUCT lpPaint);

   BOOL EndPaint     (HWND hWnd, CONST PAINTSTRUCT *lpPaint);

: WM_PAINT 메시지 루틴에서만 사용가능하다. (다른 메세지에서는 절대 사용 불가능)

(WM_PAINT는 작업 영역 중 일부가 지워지면 (이를 '무효화 영역'이라 한다.) 다시 그릴 때 발생하는 이벤트)

BeginPaint 함수는 윈도우 핸들 외에 PAINTSTRUCT (페인트 정보 구조체)가 필요한데

이 PAINTSTRUCT 구조체에 그리기 속도를 비약적으로 향상시킬 수 있는 정보가 있다.




비트맵을 함수로 바로 출력할 수 있다면 좋겠지만 안타깝게도 그러한 함수는 없다.

비트맵은 크기가 큰 데이터 덩어리이기 때문에 출력 속도가 형편없이 느리기 때문이다.

다른 좋은 출력 대안이 있어 직접 화면으로 출력하는 방법은 쓰지 않는데

그 대안이 바로 메모리 DC이다.


메모리 DC란 화면 DC와 동일한 특성을 가지며 그 내부에 출력 표면을 거진 메모리 영역이다.

화면 DC에서 할 수 있는 작업을 할 수 있다.

메모리 DC에 먼저 그림을 그린 후 과정은 보여주지 않고 메모리 DC에서 작업을 완료한 후

그 결과만 화면으로 고속 복사하는 방법을 사용한다.


메모리 DC를 만들 때에는 다음 함수를 사용한다.


HDC CreateCompatibleDC(HDC hdc);


화면의 DC의 핸들을 주면 화면 DC와 동일한 특성을 가지는 메모리 DC를 만들어 핸들 값을 리턴해 준다.

* 호환되지 않는 DC끼리는 정보를 공유할 수 없기 때문에 화면 DC와 호환되는 메모리 DC를 만들어야 한다.



[참고] http://del4u.tistory.com/16

[참고] http://soen.kr/lecture/win32api/lec6/lec6-4-2.htm

[참고] http://skmagic.tistory.com/entry/API-DCDevice-ContextWMPAINT

[참고] http://nsakura.tistory.com/30

반응형
Comments