:: ADVANCE ::
[DC] DC (Device Context) 본문
[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
'Image Processing > Windows Programming' 카테고리의 다른 글
[MFC] Dialog based MFC 기본 영상처리 window 만들기 (1) | 2015.12.18 |
---|---|
[error] LINK2005 이미 정의되어 있습니다. (0) | 2015.12.18 |
[CALLBACK] CALLBACK Function (0) | 2015.12.17 |
[LRESULT] LRESULT & CALLBACK (0) | 2015.12.17 |