자료 저장소

# DC(Device Context)의 정의

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가 처음 만들어질 때 각 멤버의 초기값이다. 운영체제는 프로그램이 DC를 요구할 때마다 DC에
적절한 초기값을 대입하여 그 핸들을 넘겨준다. 프로그램은 넘겨받은 DC핸들로 그림을 그리며 DC 정보가 정확한
이상 그리기는 항상 정확하게 수행된다고 보장할 수 있다.

# DC의 종류

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

디스플레이 DC 화면 출력에 사용된다.
프린터 DC 프린터 출력에 사용된다.
메모리 DC 비트맵 출력에 사용된다.
정보 DC 정보 취득을 위해 사용된다.


■ 커먼 DC
커먼 DC(Common DC)는 작업영역에 그리기를 하는 가장 보편적인 DC이며 화면 출력을 위해 사용하는 DC이다.
GetDC나 BeginPaint로 DC의 핸들을 발급받으며 사용한 후에는 ReleaseDC나 EndPaint로 해제한다.

■ 프라이비트 DC
프라이비트 DC(PrivateDC)는 하나의 윈도우가 배타적으로 사용하는 DC이다. 커먼 DC는 그리기를 할 때마다
매번 발급받아야 하는데 비해 프라이비트 DC는 윈도우가 생성될 때 한번만 만들어지며 윈도우가 실행되는 동안
계속 존재한다. 그래서 프라이비트 DC에 한번 설정해 놓은 속성은 일부러 바꾸지 않는 한 계속 유효하며 그리기를
할 때마다 DC를 준비하지 않아도 되므로 그만큼 빠르게 그리기를 할 수 있다.

프라이비트 DC를 사용하려면 윈도우 클래스의 스타일에 CS_OWNDC 스타일을 지정한다. 이 윈도우 클래스부터
윈도우가 만들어질 때마다 운영체제는 프라이비트 DC를 생성한다. 이렇게 생선된 DC의 핸들은 프로그램 전체를
통틀어 한번만(WM_CREATE 등에서) 읽으며 이 핸들로 모든 그리기를 할 수 있다. 윈도우 실행 주기 동안 계속
유지되는 DC이므로 사용 후에 해제할 필요도 없고 해제해서도 안된다. 윈도우가 파괴될 때 시스템이 DC를 파괴한다.

■ 클래스 DC
Win32에서 여러가지 문제로 인해 사용을 거의 금지하고 있다.

■ 윈도우 DC
윈도우 DC는 커먼 DC와 사용방법이 비슷하다. 차이점이라면 커먼 DC는 원점이 작업영역의 좌상단이지만 윈도우
DC는 윈도우의 좌상단이 원점이라는 점과 클리핑 영역이 작업영역에만 국한되는 것이 아니라 전체 윈도우라는
점이다. 그래서 윈도우 DC를 사용하면 작업영역뿐아니라 타이틀 바나 경계선에까지도 마음대로 출력할 수 있다.
윈도우 DC를 얻을 때는 GetDC 함수 대신 다음 함수를 사용한다.

HDC GetWindowDC(HWND hWnd);

■ 페어런트 DC
페어런트 DC는 클리핑 영역을 계산하는 시간을 최소화하기 위해 사용한다. 주로 버튼이나 에디트 등의 차일드
컨트롤에서 그리기 속도를 최대한 빠르게 하기 위해 사용되며 최상위 윈도우나 팝업 윈도우는 이 DC를 사용 할
수 없다. 페어런트 DC를 사용하려면 윈도우 클래스의 스타일에 CS_PARENTDC 플래그를 지정한다.
윈도우는 페어런트 DC가 발급될 때 부모 윈도우가 사용하던 DC를 캐시에서 찾아 이미 계산되어 있는 클리핑
영역을 사용함으로써 최대한 시간을 아낀다.


# GetDeviceCaps

DC는 곧 장치를 대표하는 구조체 이다. 화면 DC는 화면을 대표하고 프린터 DC는 프린터를 대표한다.
이런 출력 장치들은 각각 능력이나 설정, 구성이 서로 상이한데 실행중에 장치의 특성을 파악해야 할 때는
DC를 대상으로 다음 함수를 호출한다.

int GetDeviceCaps(HDC hdc, int nIndex);

첫번째 인수는 조사하고자 하는 DC의 핸들이며 nIndex는 조사하고자 하는 값이다. nIndex의 목록을 참조하면
굉장히 많은 값을 조사 할 수 있다.

MSDN : http://msdn.microsoft.com/en-us/library/dd144877(v=VS.85).aspx


[화면의 해상도를 픽셀 단위로 조사하여 보여주는 예]
HDC hdc; 
TCHAR Mes[256];
wsprintf(Mes,TEXT("화면크기 "%d * %d"),GetDeviceCaps(hdc,HORZRES),\
                                               GetDeviceCaps(hdc,VERTRES));
TextOut(....);
댓글 로드 중…

최근에 게시된 글