■ DC는 Device Context의 약자로 출력(화면 출력,프린터 출력 등등)에 필요한 모든 정보를 가지는 구조체이며, 윈도우 상의 모든 출력 함수는 이 DC를 참조하여 출력을 하게 되며, 이 DC를 지칭하는 고유한 번호가 HDC(Handle Device Context)이다. 이 HDC를 사용하여 특정한 DC를 지정한다.
DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며, 출력 함수들은 DC의 정보를 참조하여 그리기를 하고, DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침법하지 않고 최대한 효율적으로 그리기를 할 수 있도록 DC의 정보를 관리한다.
■ DC 구조체의 멤버
DC는 그리기 관련 정보의 집합된 구조체로 멤버가 좀 많은 구조체일 뿐이다. 이 구조체에는 그리기에 필요한 각종 정보가 멤버로 포함되어 있다. 이 외에도 훨씬 더 많은 런타임 데이터들이 포함될 것이다.
운영체제는 프로그램이 DC를 요구할 때마다 DC에 적절한 초기값을 대입하여 그 핸들(HDC)을 넘겨준다. 프로그램은 넘겨받은 DC핸들로 그림을 그리며 DC 정보가 정확한 이상 그리기는 항상 정확하게 수행된다고 보장할 수 있다.
■ DC의 타입에는 4가지가 있다.
디스플레이 DC는 다시 5가지로, 클래스 DC, 커먼 DC, 프라이빗 DC, 윈도우 DC, 페어런트 DC로 나누어진다.
■ 클래스 DC(Class Device Contexts)
16비트 호완을 위해서 있는것으로, 클래스 DC를 사용할 일이 있으면 프라이빗 DC를 사용을 권하고 있다
■ 커먼 DC(Common Device Contexts)
작업영역에 그리기를 하는 가장 보편적인 DC이며 화면 출력을 위해 사용하는 DC이다. GetDC나 BeginPaint로 DC의 핸들을 발급받으며 사용한 후에는 ReleaseDC나 EndPaint로 해제한다.
■ 프라이비트 DC(Private Device Contexts)
하나의 윈도우가 독자적으로 사용하는 DC이다. 커먼 DC는 그리기를 할 때마다 매번 발급받아야 하는데 비해 프라이비트 DC는 윈도우가 생성될 때 한번만 만들어지며 윈도우가 실행되는 동안 계속 존재한다. 그래서 프라이비트 DC에 한번 설정해 놓은 속성은 일부러 바꾸지 않는 한 계속 유효하며 그리기를 할 때마다 DC를 준비하지 않아도 되므로 그만큼 빠르게 그리기를 할 수 있다. 윈도우에서 이 DC를 사용기 위해서는 윈도우 클래스의 스타일에 CS_OWNDC 스타일을 지정해야한 다. 이런 스타일이 지정된 윈도우 클래스부터 윈도우가 만들어질 때마다 운영체제는 프라이비트 DC를 생성한다. 이렇게 생선된 DC의 핸들은 프로그램 전체를 통틀어 한번만(WM_CREATE 등에서) 읽으며 이 핸들로 모든 그리기를 할 수 있다. 윈도우 실행 주기 동안 계속 유지되는 DC이므로 사용 후에 해제할 필요도 없고 해제해서도 안된다. 윈도우가 파괴될 때 시스템이 DC를 파괴한다.
■ 윈도우 DC(Window Device Contexts)
윈도우 DC는 커먼 DC와 사용방법이 비슷하다. 차이점이라면 커먼 DC는 원점이 작업영역의 좌상단이지만 윈도우 DC는 윈도우의 좌상단이 원점이라는 점과 클리핑 영역이 작업영역에만 국한되는 것이 아니라 전체 윈도우라는 점이다. 그래서 윈도우 DC를 사용하면 작업영역뿐아니라 타이틀 바나 경계선에까지도 마음대로 출력할 수 있다. 윈도우 DC를 얻을 때는 GetWindowDC나 GetDCEx를 사용하고, 사용한 후에는 ReleaseDC로 해제한다.
■ 페어런트 DC(Parent Device Contexts)
클리핑 영역을 계산하는 시간을 최소화하기 위해 사용한다. 주로 버튼이나 에디트 등의 차일드 컨트롤에서 그리기 속도를 최대한 빠르게 하기 위해 사용되며 최상위 윈도우나 팝업 윈도우는 이 DC를 사용 할수 없다. 페어런트 DC를 사용하려면 윈도우 클래스의 스타일에 CS_PARENTDC 스타일을 지정한다. 윈도우는 페어런트 DC가 발급될 때 부모 윈도우가 사용하던 DC를 캐시에서 찾아 이미 계산되어 있는 클리핑 영역을 사용함으로써 최대한 시간을 아낀다.
DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며, 출력 함수들은 DC의 정보를 참조하여 그리기를 하고, DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침법하지 않고 최대한 효율적으로 그리기를 할 수 있도록 DC의 정보를 관리한다.
■ DC 구조체의 멤버
멤버 | 초기값 |
배경색상 | 제어판에서 지정한 윈도우의 배경색 |
배경모드 | 불투명(QPAQUE) |
비트맵 | 선택되지 않은 상태 |
브러시 | 흰색 브러시,WHITE_BRUSH |
브러시 원점 | (0,0) |
클리핑 영역 | 작업영역 전체 |
팔레트 | DEFAULT_PALETTE |
펜 위치(CP) | (0,0) |
장치 원점 | 작업영역의 좌상단 |
그리기 모드 | R2_COPYPEN |
폰트 | SYSTEM_FONT |
자간 | 0 |
맵핑 모드 | MM_TEXT |
펜 | BALCK_PEN |
다각형 채우기 모드 | ALTERNATE |
스트레치 모드 | BLACKONWHITE |
덱스트 색상 | 제어판에서 설정한 텍스트 색상 |
뷰포트 확장 | (1,1) |
뷰포트 원점 | (0,0) |
윈도우 확장 | (1,1) |
윈도우 원점 | (0,0) |
운영체제는 프로그램이 DC를 요구할 때마다 DC에 적절한 초기값을 대입하여 그 핸들(HDC)을 넘겨준다. 프로그램은 넘겨받은 DC핸들로 그림을 그리며 DC 정보가 정확한 이상 그리기는 항상 정확하게 수행된다고 보장할 수 있다.
■ DC의 타입에는 4가지가 있다.
디스플레이 DC | 화면 출력에 사용된다. |
프린터 DC | 프린터 출력에 사용된다. |
메모리 DC | 비트맵 출력에 사용된다. |
정보 DC | 정보 취득을 위해 사용된다 |
■ 클래스 DC(Class Device Contexts)
16비트 호완을 위해서 있는것으로, 클래스 DC를 사용할 일이 있으면 프라이빗 DC를 사용을 권하고 있다
■ 커먼 DC(Common Device Contexts)
작업영역에 그리기를 하는 가장 보편적인 DC이며 화면 출력을 위해 사용하는 DC이다. GetDC나 BeginPaint로 DC의 핸들을 발급받으며 사용한 후에는 ReleaseDC나 EndPaint로 해제한다.
■ 프라이비트 DC(Private Device Contexts)
하나의 윈도우가 독자적으로 사용하는 DC이다. 커먼 DC는 그리기를 할 때마다 매번 발급받아야 하는데 비해 프라이비트 DC는 윈도우가 생성될 때 한번만 만들어지며 윈도우가 실행되는 동안 계속 존재한다. 그래서 프라이비트 DC에 한번 설정해 놓은 속성은 일부러 바꾸지 않는 한 계속 유효하며 그리기를 할 때마다 DC를 준비하지 않아도 되므로 그만큼 빠르게 그리기를 할 수 있다. 윈도우에서 이 DC를 사용기 위해서는 윈도우 클래스의 스타일에 CS_OWNDC 스타일을 지정해야한 다. 이런 스타일이 지정된 윈도우 클래스부터 윈도우가 만들어질 때마다 운영체제는 프라이비트 DC를 생성한다. 이렇게 생선된 DC의 핸들은 프로그램 전체를 통틀어 한번만(WM_CREATE 등에서) 읽으며 이 핸들로 모든 그리기를 할 수 있다. 윈도우 실행 주기 동안 계속 유지되는 DC이므로 사용 후에 해제할 필요도 없고 해제해서도 안된다. 윈도우가 파괴될 때 시스템이 DC를 파괴한다.
■ 윈도우 DC(Window Device Contexts)
윈도우 DC는 커먼 DC와 사용방법이 비슷하다. 차이점이라면 커먼 DC는 원점이 작업영역의 좌상단이지만 윈도우 DC는 윈도우의 좌상단이 원점이라는 점과 클리핑 영역이 작업영역에만 국한되는 것이 아니라 전체 윈도우라는 점이다. 그래서 윈도우 DC를 사용하면 작업영역뿐아니라 타이틀 바나 경계선에까지도 마음대로 출력할 수 있다. 윈도우 DC를 얻을 때는 GetWindowDC나 GetDCEx를 사용하고, 사용한 후에는 ReleaseDC로 해제한다.
■ 페어런트 DC(Parent Device Contexts)
클리핑 영역을 계산하는 시간을 최소화하기 위해 사용한다. 주로 버튼이나 에디트 등의 차일드 컨트롤에서 그리기 속도를 최대한 빠르게 하기 위해 사용되며 최상위 윈도우나 팝업 윈도우는 이 DC를 사용 할수 없다. 페어런트 DC를 사용하려면 윈도우 클래스의 스타일에 CS_PARENTDC 스타일을 지정한다. 윈도우는 페어런트 DC가 발급될 때 부모 윈도우가 사용하던 DC를 캐시에서 찾아 이미 계산되어 있는 클리핑 영역을 사용함으로써 최대한 시간을 아낀다.
'API' 카테고리의 다른 글
타이머 컨트롤을 사용하지 않고 API를 사용한 타이머 (0) | 2011.10.21 |
---|---|
캐럿 생성 (0) | 2011.10.13 |
VB6에서 API 사용법. (0) | 2011.10.09 |
시스템에 전체 시리얼 포트 얻기 (0) | 2011.10.08 |
GetWindowThreadProcessId를 사용한 프로세스 강제 종료 (0) | 2011.10.07 |