여러 GDI 오브젝트를 이용하여 다양한 도형과 다양한 색상을 출력해보세요.
윈도우즈는 세가지 동적 연결 라이브러리 이루어져 있는데
메모리를 관리하고 실행시키는 KERNEL, 유저 인터페이스와 윈도우를 관리하는 USER 그리고
화면 처리와 그래픽을 담당하는 GDI이다.
출력을 하려면 우리는 GDI(Graphic Device Interface)모듈에 특별히 관심을 기울여야 한다. 화면으로 출력되는 모든 글자와 그림은 GDI를 통해야 하기 때문이다.
DC (Device Context)란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI모듈에 의해 관리된다. 어떤 폰트를 사용할 것인가, 선의 색상과 굵기, 채움 무늬와 색상, 출력방법 등등이 모두 출력에 필요한 정보들이다. 화면 출력에 DC가 필요한 이유를 이해가 위해서 몇가지 상황을 들어보자
상황1
우선 화면에 선을 긋는 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)
상황2
DC가 필요한 또다른 예는 윈도우즈는 여러개의 프로그램이 동시에 실행되는 멀티태스킹 시스템이기 때문에 그리기 함수에 의해 실제 출력되는 모양은 주변환경에 따라 다르다. LineTo(hdc, 100, 100)을 호출 했을때 화면상의 (100, 100)까지의 점을 찍는 것이 아니라 실제로 점이 찍혀야 할 부분은 현재 윈도우가 차지하고 있는 영역이 되어야한다.
또한 2개의 윈도우가 있을대 화면에 그려져야 할부분은 해당 코드가 실행된 윈도우영역에서만 그림이 그려져야 한다.