본문 바로가기
dev, tech/Windows P

DC (Device Context) 와 HANDLE (핸들)

by 구띵 2007. 1. 24.

참고:www.winapi.co.kr

http://dinosaur.cie.cau.ac.kr/seminar/visual/GDI.html#gdiclass

윈도우API 함수의 대부분이 이 세가지 DLL에 의해 제공되고 있다.

KERNEL : 메모리를 관리하고 프로그램을 실행

 

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

 

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

 

 - 출력을 하려면 우리는 GDI(Graphic Device Interface)모듈에 특별히 관심을 기울여야 한다. 화면으로 출력되는 모든 글자와 그림은 GDI를 통해야 하기 때문이다.

 

DC(Device Context)의 필요성과 포함되는 구체적인 정보

 

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

 

 -  어떤 폰트를 사용할 것인가, 선의 색상과 굵기, 채움 무늬와 색상, 출력 방법 등등이 모두 출력에 필요한 정보들이다.

 

 

우선 화면에 선을 긋는 LineTo라는 함수를 생각해 보자. 선을 긋기 위해서는 최소한 시작점과 끝점의 좌표가 필요하다는 것을 상식적으로 쉽게 이해할 수 있을 것이다. 그러면 LineTo(X1,Y1,X2,Y2)와 같은 식으로 함수를 호출하여 선을 그을 수 있을 것이다. 그러나 조금 더 생각하면 두 점의 좌표외에도 여러가지 정보가 더 필요하다. 선의 색상, 굵기, 모양, 선을 그리는 방법, 좌표값을 해석하는 방법 등의 추가 정보가 있어야 비로서 완벽한 선을 그을 수 있다. 이런 정보들을 모두 인수로 넘겨준다면 LineTo 함수는 다음과 같은 모양이 될 것이다.

LineTo(StartX, StartY, EndX, EndY, Color, Width, Shape, ROP, mode,......)

사실 선을 긋기 위해서는 이보다 훨씬 더 많은 정보가 필요하다. 이런 정보들을 일일이 인수로 전달할 것이 아니라 한 곳에 모아두고 그 값들을 사용하는 방법이 훨씬 더 편리하고 효율적이다. 그래서 이런 정보들을 모두 모아 DC라는 것을 만들고 그리기 함수에서는 DC의 핸들만을 넘겨받아 그리기에 필요한 추가 정보는 모두 DC에 정의되어 있는 값을 사용한다. 이런 방식을 사용하면 LineTo 함수는 다음과 같이 간단해질 수 있을 것이다.

LineTo(hDC,X,Y)

얼마나 간단하고 좋은가. 색상이나 굵기를 바꾸고 싶으면 DC에 보관된 정보를 바꾸어주면 된다.

 

상황2

DC가 꼭 필요한 또 다른 예를 들어보자. 윈도우즈는 여러개의 프로그램이 동시에 실행되는 멀티 태스킹 시스템이기 때문에 그리기 함수에 의해 실제 출력되는 모양은 주변환경에 따라 다르다. LineTo(hDC,100,100) 이라는 명령을 내릴 때 화면상의 (100,100)까지 점을 찍는 것이 아니라 실제로 점이 찍혀야 할 부분은 현재 윈도우가 차지하고 있는 영역의 (100,100)이 되어야 한다. LineTo함수는 자신이 지정한 (100,100)의 실제 화면상의 좌표는 알지 못하지만 DC에 의해 정확한 위치를 지정할 수 있게 된다. 또 두 개의 윈도우가 겹쳐져 있는 상황에서 아래쪽의 윈도우에 원을 그리는 명령을 내렸다고 할 때 다음 두 가지 중 어떤 결과가 합당할까?

사용자 삽입 이미지

당연히 오른쪽의 결과가 우리가 기대하는 결과이다. 이런 경우는 원을 그리더라도 그려야 할 부분이 있고 그리지 말아야 할 부분이 있다. 이런 복잡한 처리를 원 그리기 함수가 직접 한다는 것은 불가능하며 DC를 통해야만 이런 처리가 가능하다. DC는 현재 상황에서 어떤 영역이 출력이 허가된 영역인가를 보고 허가된 영역에만 출력을 내 보낸다.

이런 이유외에도 DC의 존재이유는 여러가지가 있지만 여기서는 DC를 왜 사용해야 하는가만 직감적으로 이해하고 넘어가도록 하자.

 

 

 핸들에 대한 이해

 핸들(handle)이란 구체적인 어떤 대상에 붙여진 번호이며 문법적으로는32비트의 정수값이다.

 도스 프로그래밍에서는 거의 유일하게 파일 핸들만이 사용되었으며 그래서도스에서 핸들은 곧 파일 핸들을 의미하는 경우가 많았다.

 그러나 윈도우즈에서는 여러 가지 종류의 핸들이 사용되고 있다.만들어진 윈도우에는 윈도우 핸들(hWnd)을 붙여 윈도우를 번호로 관리하며 아직은 잘 모르겠지만 DC에 대해서도 핸들을 사용하고 논리적 펜, 브러시에도 핸들을 붙여 관리한다.

 

 심지어메모리를 할당할 때도할당한 메모리의 번지를 취급하기보다는 메모리에 번호를 붙인 메모리 핸들을 사용한다. 왜 이렇게 핸들을 자주 사용하는가 하면대상끼리의 구분을 위해서는 문자열보다 정수를 사용하는 것이 훨씬 더 속도가 빠르기 때문이다.

 

윈도우즈에서 핸들을 이렇게 많이 사용하므로 우리는핸들의 일반적인 특성에 관해서 미리 숙지하는 것이 좋다.

핸들은 일반적으로 다음과 같은 특징이 있다.

 

① 일단 핸들은 정수값이며 대부분의 경우 32비트값이다. 핸들을 사용하는 목적은 오로지 구분을 위한 것이므로 핸들끼리 중복되지 않아야하며 이런 목적으로는 정수형이 가장 적합하다.

 

핸들은 운영체제가 발급해 주며 사용자는 쓰기만 하면 된다.예를 들어 윈도우를 만들거나 파일을 열면 운영체제는 만들어진 윈도우나 열려진 파일에 핸들을 붙여준다. 사용자는 이 핸들을 잘 보관해 두었다가 해당 윈도우나 파일을 다시 참조할 때 핸들을 사용하면 된다. 사용자가 직접 핸들을 만들 경우란 없다.

 

같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.만약 이렇게 된다면 핸들은 구분을 위해 사용할 수 없을 것이다. 물론 다른 종류의 핸들끼리는 중복된 값을 가질 수도 있다.

 

④ 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다. 핸들은 크고 작음의 성질을 가지는 숫자가 아니라 단순한 표식일 뿐이다. 핸들형 변수를 만들어 핸들을 대입받아 쓰고 난 후에는 버리면 된다.

윈도우즈에서 핸들은 예외없이접두어 h로 시작되며 핸들값을 저장하기 위해 별도의 데이터형까지 정의해 두고 있다. HWND, HPEN, HBRUSH, HDC 등이 핸들을 담기 위한 데이터형들이며 모두 부호없는 정수형이다.

'dev, tech > Windows P' 카테고리의 다른 글

키보드 입력 받기(다이얼로그)  (0) 2009.02.24
WinMain 에서 하는 일...  (0) 2006.03.04
aa  (0) 2006.02.14
유니코드(Uncode)  (0) 2006.02.13
Windows 서비스  (0) 2006.01.25

댓글