그래픽, 멀티미디어 어플리케이션 제작 (Creating Graphic and Multimedia Application) 델파이를 이용해서 어플리케이션에 그래픽 기능을 추가하거나, 멀티 미디어를 지원하게 하 는 것은 그다지 어려운 일이 아니다. 간단하게 미리 그려진 그림을 디자인 시에 추가할 수 도 있고, 여러가지 그래픽 컨트롤을 추가하거나 런타임에서 동적으로 그리는 등의 방법이 모두 가능하다. 또한, 델파이 4 에서 멀티미디어 컴포넌트를 사용하면 어플리케이션에서 동영상이나 각종 사운드 등을 지원하게 할 수 있다. 이번 장에서는 각종 어플리케이션을 제작할 때 화려함을 더해줄 수 있는 그래픽과 멀티 미 디어를 지원하게 하는 방법에 대해서 알아보도록 한다. 그래픽 프로그래밍 개괄 VCL 그래픽 컴포넌트는 윈도우의 GDI(Graphics Device Interface)를 캡슐화한다. 델파이 어플리케이션에서 그림을 그리려면, 객체의 캔버스를 이용한다. 캔버스는 객체의 프로퍼티 로 제공되지만, 그 자체가 객체이다. 캔버스 객체의 가장 큰 장점은 리소스를 효과적으로 사용하며, 디바이스 컨텍스트를 관리하기 때문에 스크린, 프린터나 비트맵, 메타 파일 등의 종류에 관계 없이 같은 방법으로 사용할 수 있다는 것이다. 캔버스는 런타임에만 사용할 수 있다. 또한, TCanvas 객체가 윈도우의 디바이스 컨텍스트 의 wrapper 이므로, 캔버스에 대해 윈도우 GDI 함수를 사용할 때에는 캔버스 객체의 Handle 프로퍼티를 이용해서 디바이스 컨텍스트 핸들을 얻어야 한다. 디바이스 컨텍스트의 이해 윈도우의 그래픽에 대해 배울 때 가장 먼저 알아야 할 것이 디바이스 컨텍스트이다. 모든 윈도우 응용 프로그램들이 실제 장치 대신에 가상 화면과 가상 프린터를 사용한다. 윈도우 는 본질적으로 실제 디스플레이 하기 전에, 내부적으로 그릴 것을 그리게 되는데 이때 사용 하는 것이 디바이스 컨텍스트이다. 따라서 화면이나 프린터에 그리기를 원하는 어떤 것과 디바이스 컨텍스트를 분리할 필요가 있다. 디바이스 컨텍스트는 단순한 메모리라기 보다는 객체이다. 이 등록정보를 변경하면 다양한 특수 효과를 줄 수도 있다. 윈도우는 디바이스 컨텍스트를 가지고 직접 작업하는 것을 허용하지 않는다. 이를 처리하 기 위해서는 API 함수를 호출해야 한다. 이때 컨텍스트 핸들에 대한 변수로 hDC 를 사용
37
Embed
그래픽, 멀티미디어 어플리케이션 제작delphi.borlandforum.com/impboard/attach/0000140111/... · 2012-12-04 · VCL 그래픽 컴포넌트는 윈도우의 GDI(Graphics
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
그래픽, 멀티미디어 어플리케이션 제작
(Creating Graphic and Multimedia Application)
델파이를 이용해서 어플리케이션에 그래픽 기능을 추가하거나, 멀티 미디어를 지원하게 하
는 것은 그다지 어려운 일이 아니다. 간단하게 미리 그려진 그림을 디자인 시에 추가할 수
도 있고, 여러가지 그래픽 컨트롤을 추가하거나 런타임에서 동적으로 그리는 등의 방법이
모두 가능하다.
또한, 델파이 4 에서 멀티미디어 컴포넌트를 사용하면 어플리케이션에서 동영상이나 각종
사운드 등을 지원하게 할 수 있다.
이번 장에서는 각종 어플리케이션을 제작할 때 화려함을 더해줄 수 있는 그래픽과 멀티 미
디어를 지원하게 하는 방법에 대해서 알아보도록 한다.
그래픽 프로그래밍 개괄
VCL 그래픽 컴포넌트는 윈도우의 GDI(Graphics Device Interface)를 캡슐화한다. 델파이
어플리케이션에서 그림을 그리려면, 객체의 캔버스를 이용한다. 캔버스는 객체의 프로퍼티
로 제공되지만, 그 자체가 객체이다. 캔버스 객체의 가장 큰 장점은 리소스를 효과적으로
사용하며, 디바이스 컨텍스트를 관리하기 때문에 스크린, 프린터나 비트맵, 메타 파일 등의
종류에 관계 없이 같은 방법으로 사용할 수 있다는 것이다.
캔버스는 런타임에만 사용할 수 있다. 또한, TCanvas 객체가 윈도우의 디바이스 컨텍스트
의 wrapper 이므로, 캔버스에 대해 윈도우 GDI 함수를 사용할 때에는 캔버스 객체의
Handle 프로퍼티를 이용해서 디바이스 컨텍스트 핸들을 얻어야 한다.
디바이스 컨텍스트의 이해
윈도우의 그래픽에 대해 배울 때 가장 먼저 알아야 할 것이 디바이스 컨텍스트이다. 모든
윈도우 응용 프로그램들이 실제 장치 대신에 가상 화면과 가상 프린터를 사용한다. 윈도우
는 본질적으로 실제 디스플레이 하기 전에, 내부적으로 그릴 것을 그리게 되는데 이때 사용
하는 것이 디바이스 컨텍스트이다.
따라서 화면이나 프린터에 그리기를 원하는 어떤 것과 디바이스 컨텍스트를 분리할 필요가
있다. 디바이스 컨텍스트는 단순한 메모리라기 보다는 객체이다. 이 등록정보를 변경하면
다양한 특수 효과를 줄 수도 있다.
윈도우는 디바이스 컨텍스트를 가지고 직접 작업하는 것을 허용하지 않는다. 이를 처리하
기 위해서는 API 함수를 호출해야 한다. 이때 컨텍스트 핸들에 대한 변수로 hDC 를 사용
한다.
델파이는 미리 정의된 디바이스 컨텍스트의 wrapper 를 제공한다. 이것이 바로 캔버스이다.
윈도우의 디바이스 컨텍스트의 유형에는 다음과 같은 4가지 종류가 있다.
1. 디스플레이 (Display)
보통 윈도우나 TMemo 컨트롤과 같이 그릴 수 있는 다른 영역에 부착되어 있다. 이 컨텍
스트에 그리면 항상 정보가 화면에 전달된다. 디스플레이 디바이스 컨텍스트에는 Class,
Common, Private 형의 3 가지 종류가 있다. 32 비트 응용 프로그램에서는 항상 private
형을 사용하면 된다. 만약 빨리 그래프나 차트를 출력하고자 할 때에는 common 형을 사
용할 수 있다. Common 디바이스 컨텍스트를 얻을 때에는 GetDC 나 GetDCEx,
BeginPaint 함수 등을 사용하면 된다. 물론 이때 받은 핸들은 빨리 사용하고 반납해야 한
다. Private 디바이스 컨텍스트는 실제로 응용 프로그램이 소유하고 있는 컨텍스트이다.
이것의 장점은 윈도우에 돌려주기 전에 마음대로 그릴 수 있다는 점이다. 캐드나 그래픽
응용 프로그램의 경우에는 이 유형의 디스플레이 디바이스 컨텍스트를 사용한다.
2. 프린터 (Printer)
디스플레이 디바이스 컨텍스트와 같이 프린터 디바이스 컨텍스트에 보내는 것도 당장 인쇄
된다.
3. 메모리 (Memory)
디스플레이나 프린터 디바이스 컨텍스트에 보낼 수 있는 것은 메모리에도 보낼 수 있다.
메모리 디바이스 컨텍스트는 CreateCompatibleDC 함수를 사용하여 만든다. 인쇄나 지금
디스플레이에 나타낼 때, 또는 나중에 출력할 때 메모리 디바이스 컨텍스트가 사용되고 있
으며, 비트맵과 같은 것에도 이 디바이스 컨텍스트 유형을 사용할 수 있다.
4. 정보 (Information)
이 디바이스 컨텍스트는 디스플레이의 경우에는 그다지 문제가 되지 않지만, 프린터의 경우
에는 중요한 역할을 한다. 예를 들어 프린터에 인쇄할 컬러 문서가 있는 경우, 프린터가
컬러 출력을 지원하는지 알면 도움이 될 것이다. 만약 흑백 프린터의 경우에는 특별한 디
더링 루틴을 추가하는 것이 필요하다. 정보 디바이스 컨텍스트는 CreateIC 함수를 이용하
여 만든다. 디바이스 컨텍스트를 만들었으면, GetCurrentObject 나 GetObject 함수를 이용
하여 특정 객체에 대한 정보를 얻을 수 있다.
윈도우의 그래픽 객체
윈도우는 7 개의 서로 다른 그래픽 객체를 가지고 있다. 이들은 윈도우의 다른 객체 들을
만들 때 사용되는 기본 객체이다. 이들 객체에 대해서 알아보자.
1. 비트맵 (Bitmap)
비트맵은 특정 유형의 래스터 그림이다. 예를 들어 아이콘과 PCX 파일은 물론 BMP 파일
도 이 범주에 속한다. 비트맵 객체는 바이트 단위의 크기, 픽셀 단위의 차원, 컬러 포맷,
압축 스키마 등의 정보를 가진다. 비트맵 객체는 자신의 특정 유형에 기초한 다른 속성들
도 다향하게 가지고 있다.
2. 브러쉬 (Brush)
브러쉬 색상을 적용할 때 사용된다. 벽에 칠을 할 때 붓을 사용하는 것과 같이 윈도우는
다각형이나 패스와 같은 다른 그래픽 객체의 내부를 칠할 때 브러쉬를 사용하고 있다. 특
정 패턴으로 내부를 채우고자 할 때에는 비트맵을 브러쉬로 사용할 수도 있다.
3. 팔레트 (Palette)
윈도우는 풍부한 색상을 정의하여 사용하는 색상의 집합인 팔레트를 사용한다. 그런데, 일
부 비디오 카드는 한번에 256 색상만 나타낼 수 있다. 이것이 하나 이상의 팔레트를 사용
하는 이유로 서로 다른 256 색상이 필요할 때마다 서로 다른 팔레트를 사용하면 깨끗하고
견고한 색상을 화면에 나타낼 수 있다.
4. 폰트 (Font)
글자를 나타내는 폰트 역시 마찬가지로 그래픽 객체이다. 적절한 크기와 서체를 사용하여
야 좋은 어플리케이션을 만들 수 있다.
5. 패스 (Path)
다각형이나 호, 선, 그리고 타원과 같은 그려진 객체의 특정 유형을 의미한다. 윈도우는 수
많은 서로 다른 패스에 대한 함수를 가지고 있으며, 이들은 모두 서로 다른 속성들을 가지
고 있다.
6. 펜 (Pen)
선을 그리거나, 도형을 그릴 떄 사용하는 객체로 라인의 두께와 스타일과 같은 것들을 설정
하게 된다.
7. 지역 (Region)
지역은 디바이스 컨텍스트에 있는 한 영역의 위치를 나타낸다. 때때로 캔버스 전체가 아니
라 일정 영역에 대해서만 윈도우가 작업하도록 요청해야 할 때가 있다. 지역 객체는 이와
같은 일을 할 수 있게 해 주는 역할을 한다.
윈도우의 그래픽 모드
디바이스 컨텍스트를 사용할 때에, 디바이스 컨텍스트의 유형을 명시하면 그래픽 객체를 담
을 컨테이너를 정의하는 셈이다. 그러면, 이 객체 들이 어떻게 작용할 것인지를 결정해야
하는데, 이를 결정하는 것이 그래픽 모드이다. 그래픽 모드는 윈도우에게 디바이스 컨텍
스트의 컨테이너에 있는 객체들이 서로 어떻게 동작할 것인지를 지정한다.
이들이 동작하는 방법은 대개 특정 유형의 함수를 사용할 때 어떤 종류의 화면 효과를 얻을
것인가를 결정한다. 이는 브러쉬를 사용하여 특정 영역을 채울 때 영향이 크다.
윈도우의 그래픽 모드에는 다음의 5가지가 있으며, 이들을 동시에 사용한다.
1. 배경 (Background)
윈도우가 배경색을 섞는 방법을 정의한다. 윈도우가 한 색상을 다른 색상을 대치해야 하는
지, 또는 두 색상을 합해서 새로운 색상을 만들어야 하는지를 나타낸다. 텍스트와 비트맵
동작에 있어서 보통 이 모드를 사용하게 된다.
2. 드로잉 (Drawing)
이 모드는 전경색(foreground color)을 같이 섞는 방법을 윈도우에게 알려주는 역할을 한다.
이 모드는 보통 펜이나 브러쉬, 텍스트, 그리고 비트맵 동작을 사용할 때 사용된다.
3. 매핑 (Mapping)
매핑은 윈도우에게 크기 조정을 어떻게 해결할 것인지를 알려주는 역할을 한다. 예를 들어,
이론적으로 가능한 커다란 공간을 그래픽으로 할 때, 시스템에 있는 메모리 공간에 의해 이
를 모두 나타내게 할 수 없을 것이다. 프린터가 디스플레이에 이를 어떻게 보여줄 것인가
를 결정하는 역할을 하는 것이 매핑이다.
4. 다각형 채우기 (Polygon-Fill)
이 모드는 윈도우가 다각형과 다른 도형을 채우는 방법을 정의한다. 본질적으로 윈도우가
그릴 때 사용할 도형의 모양과 브러쉬의 크기를 결정하는 역할을 한다.
5. 스트레칭 (Stretching)
이미지를 압축하면, 이미지의 세세한 내용의 일부를 잃어버리게 된다. 이미지의 질을 가능
한 많이 유지하려면 윈도우가 색상들을 섞는 방법을 알아야 한다.
캔버스의 공통적인 프로퍼티와 메소드
캔버스 객체에서 공통적으로 사용하는 프로퍼티를 나열하면 다음과 같다.
프로퍼티 설 명
Font 이미지에 텍스트를 기록할 때 사용할 폰트를 지정한다. TFont 객체를 설정한다.
Brush 그래픽 모양과 배경을 채울 색깔과 패턴을 결정한다. TBrush 객체를 설정한다.
Pen 캔버스가 그림을 그릴 때 사용할 라인의 펜 종류를 결정한다. TPen 객체를 설정한다.
PenPos 펜의 현재의 위치를 지정한다.
Pixels 현재의 ClipRect 내의 픽셀 영역의 색깔을 지정한다.
캔버스 객체에서 사용하는 메소드에는 다음과 같은 것들이 있다. 이들에 대해서 모두 자세
하게 설명할 수는 없으므로, 간단히 설명한다. 이중에서 CopyRect, Ellipase, RectAngle,
MoveTo, TextOut, TextWidth, TextHeight 는 이미 9장에서 사용한 바 있다.
메소드 설 명
Arc 지정된 사각영역의 타원을 따라서 호를 그린다.
Chord 타원이 라인으로 절단된 닫힌 그림을 그린다.
CopyRect 다른 캔버스의 영역에서 이미지를 복사한다.
Draw 캔버스의 Graphic 파라미터로 지정된 그래픽 객체를 지정한 위치에 그린다.
Ellipse 지정된 사각영역을 따라서 타원을 그린다.
FillRect 지정된 사각영역을 현재의 브러쉬로 채운다.
FloodFill 캔버스 전체 영역을 현재의 브러쉬로 채운다.
FrameRect 캔버스의 브러쉬를 이용하여 사각형을 그린다.
LineTo PenPos 의 위치에서 지정된 위치까지 라인을 그린다.
MoveTo 현재의 위치를 지정된 위치로 옮긴다.
Pie 타원에서 지정된 사각영역으로 경계된 부분을 파이 형태로 그린다.
Polygon 파라미터로 넘긴 점들을 연결하여 다각형을 만든다. 처음 점과 마지막 점이 연결된
다.
PolyLine 현재의 펜으로 Points 에 넘어온 점들을 서로 연결한다.
Rectangle 좌측 상단점과 우측 하단점을 대각선으로 하는 사각형을 펜을 이용해서 그리고, 내부
를 브러쉬로 채운다.
RoundRect 코너가 둥근 사각형을 그린다.
StretchDraw 캔버스에 그린 그래픽을 지정된 사각영역에 맞춘다. 경우에 따라서 확대되거나 상하
좌우 비율이 변경된다.
TextHeight,
TextWidth
각각 현재 폰트로 문자열을 쓸 때의 높이와 폭을 반환한다. 높이에는 줄 사이의 여
백이 포함된다.
TextOut 문자열을 지정된 위치에 첫자부터 출력한다. 그리고, PenPos 프로퍼티는 문자열의
끝부분의 위치로 업데이트 된다.
TextRect 영역안에 문자열을 기록한다. 영역 바깥으로 나가는 문자열은 보이지 않게 된다.
그래픽 작업을 할 때에는 드로잉(drawing)과 페인팅(painting)이란 용어를 구별해서 사용해
야 한다.
드로잉은 특정 그래픽 요소를 생성하는 것이다. 예를 들어, 라인이나 특정 형태를 코드를
이용해서 그리는 것이다. 보통 앞에서 설명한 캔버스의 드로잉 메소드를 호출해서 사용한
다. 이미지가 저장되지 않기 때문에, 그 내용의 전부 또는 일부를 잃을 수 있으며, 출력도
이미지가 저장되지 않고, 어플리케이션은 어떻게 다시 그리는 지를 알지 못하므로 변할 수
있다.
그에 비해 페인팅은 객체 전체의 형태를 생성하는 것으로, 드로잉을 포함한다. 즉, 어떤 상
황에서든 어플리케이션이 그 전체 화면을 다시 칠할 수 있도록 하는 것이다. 사실 사용자
가 마우스 버튼을 누르거나 다른 어떤 동작을 취하면 그 위치와 다른 요소들을 저장해야 하
고, 페인팅 메소드에서 이 정보를 실제로 해당 이미지를 페인팅하기 위해 사용한다. .
스크린의 리프레쉬
윈도우는 스크린 위의 객체의 형태가 변경되거나, 리프레쉬할 필요가 있을 때에는
WM_PAINT 메시지를 생성해낸다. 이 메시지는 VCL 에서 OnPaint 이벤트로 표현된다.
그러므로, VCL 객체가 Refersh 메소드를 호출하면 언제나 OnPaint 이벤트가 발생한다.
폼에서 Refresh 메소드를 사용하면 지정된 형태로 그래픽을 다시 그리게 된다. 그러므로,
예를 들어 폼의 OnResize 이벤트 핸들러에서 폼의 형태를 변경하는 코드를 집어 넣은 경우
에는 Refresh 메소드를 호출해서 변경된 사항을 반영하도록 해야 한다.
일부 운영체제에서는 윈도우의 클라이언트 영역의 일부가 무효화(invalidated)된 경우 자동
으로 그 부분을 그려주지만, 윈도우는 그렇지 않다. 윈도우 운영체제에서는 일단 스크린에
그려진 것은 영구적이다. 그러므로, 폼이나 컨트롤이 드래그 등의 작업에 의해 잠시 가려
지는 경우 폼이나 컨트롤은 반드시 불명확해진 영역을 다시 페인트 해야 한다.
TImage 컨트롤을 사용한다면, TImage 내부에 있는 그래픽의 페인팅과 refreshing 은 VCL
에 의해 자동으로 관리된다. 또한 TImage 에 드로잉을 한 경우에는 이것이 지속적인
(persistent) 이미지이기 때문에, 포함된 이미지를 다시 그려줄 필요도 없다. 이와는 반대
로 TPaintBox 의 캔버스는 스크린 디바이스에 직접 연결되어 있기 때문에, PaintBox 에 그
려진 모든 것은 임시로 저장된다. 대부분의 경우 TPaintBox 와 거의 동일하다.
그러므로, TPaintBox 에 그리거나 페인팅을 한 경우에는 OnPaint 이벤트 핸들러에 클라이
언트 영역이 무효화될 때마다 이를 다시 그려주는 코드를 추가할 필요가 있다.
그래픽 이미지가 어플리케이션에 나타나는 형태는 그리는 방법에 따라 틀리다. 만약
TBitmap 캔버스처럼 오프 스크린 이미지를 그리는 경우에는 컨트롤이 컨트롤의 캔버스에
비트맵을 복사하기 전에는 나타나지 않는다. 그러므로, 비트맵을 그리고 이것을 이미지 컨
트롤에 대입하려면, 이미지는 컨트롤이 OnPaint 메시지를 처리할 기회가 있을 때에 보여줄
수 있다.
화면의 Refresh 와 연관된 메소드에는 Invalidate, Update, Refresh(Repaint)의 3가지가 있
다. 이들의 특징은 각각 다음과 같다.
1. Invalidate 메소드
이 메소드는 윈도우에게 폼의 전체 표면이 페인팅되어야 한다는 것을 알려준다. 그런데,
Invalidate 는 페인팅 동작을 즉각 강제하지 않고 윈도우가 이 요구사항을 저장하고나서, 현
재 프로시저가 완전히 수행되고 시스템에 다른 이벤트가 남아 있지 않을 경우에 여기에 반
응하게 된다. 때때로 이 지연 시간 때문에, 페인팅 작업에 여러 변경이 일어난 후에야 비
로소 폼이 페인팅되는 수가 있다. 그렇기 때문에, 느린 페인트 메소드가 여러 번 호출되서
수행속도를 더욱 느리게 하는 것을 막을 수 있다.
2. Update 메소드
윈도우에게 폼의 내용을 갱신할 것인지를 물어 보아서 그것을 곧장 페인팅하는 메소드이다.
이 메소드는 무효 영역(invalidated area)이 있을 경우에만 동작한다. 그러므로, 이 동작은
Invalidate 메소드가 막 호출되었을 때 일어나거나 아니면 사용자에 의한 동작의 결과로서
일어날 수 있다. 만약 무효 영역이 없다면 아무런 동작을 하지 않으므로, 보통 Invalidate
를 호출한 뒤에 바로 Update 메소드를 호출한다.
3. Refresh(Repaint) 메소드
Invalidate 와 Update 메소드를 차례로 호출한다. 그 결과로 이 메소드는 OnPaint 이벤트
를 즉각 동작시킨다.
이 메소드 들은 잘 사용해야 한다. 컨트롤을 반복 페이팅을 요청해야 할 경우에는
Invalidate 를 호출하는 것이 좋다. 이는 윈도우가 화면을 갱신하는데 너무 많은 시간을 소
비하면 이 호출들을 한데 모아서 한 번에 처리할 수도 있기 때문이다. 윈도우의
WM_PAINT 메시지는 낮은 우선 순위 메시지이기 때문에, 이것이 가능하고 더 효과적이다.
반면에, Refresh 를 여러 번 호출했을 경우에는 윈도우가 매번 다른 메시지만 처리할 수는
없으니 화면이 다시 그려져야 하고, 페인팅 작업이 느리기 때문에 어플리케이션 전체의 성
능을 떨어뜨릴 수 있다. 그렇지만, 가능한 빠르게 화면을 다시 그려야 하는 때가 있는데
이런 경우에는 Refresh 를 호출하는 것이 좋다.
그래픽 객체의 종류
VCL 은 다음과 같은 그래픽 객체를 제공한다.
객 체 설 명
Picture 그래픽 이미지를 담을 수 있다. 만약에 추가적인 그래픽 파일 포맷을 추가
하려면 RegisterFileFormat 메소드를 사용한다. 그래픽 파일을 보여준다.
Bitmap 이미지를 생성, 관리, 저장하는데 사용되는 강력한 그래픽 객체
Clipboard 어플리케이션에 cut, copy, paste 를 지원하게 될 텍스트나 그래픽에 대한 컨
테이너를 나타낸다. 적절한 포맷 관리, 참조 계수 관리 등을 한다.
Icon 윈도우 아이콘 파일을 다룬다.
Metafile
이미지를 다룰 때 실제 픽셀로서 구성되는 것이 아니라, 이미지를 구성하기
위한 여러 작업들을 기록하는 것이다. 메타 파일은 비트맵에 비해 메모리도
적게 차지하고, 이미지 손상이 적은 장점이 있으나, 처리 속도가 느리다.
캔버스 객체의 프로퍼티 활용
캔버스 객체에서 제공하는 여러가지 프로퍼티를 설정하여 사용하는 방법에 대해서 알아보자.
펜을 이용하여 라인을 그리고, 브러쉬를 이용하여 내부를 채우며, 적절한 폰트를 골라서 텍
스트를 기록하는 등의 작업이 캔버스 객체의 프로퍼티를 활용하여 이루어진다.
펜의 활용
캔버스의 Pen 프로퍼티는 라인의 형태를 결정한다. 선을 긋는 작업을 궁극적으로 생각해
보면 두 개의 점 사이에 있는 픽셀의 그룹을 바꾸는 것이다. 펜에 대해서 연상할 때 가장
쉽게 생각할 수 있는 것은 포토샵이나 페이트샵 프로와 같은 그래픽 프로그램의 도구 상자
에서 여러가지 모양의 붓을 선택해서 선이나 도형을 그릴 수 있다는 것이다. 펜을 선택한
다는 것은 이런 그래픽 프로그램에서 붓을 선택하는 것과 같은 것이다.
펜 자체에는 변경해서 사용할 수 있는 프로퍼티가 4 가지가 있다. Color, Width, Style,
Mode 가 그것인데 이들 프로퍼티의 값들이 펜의 형태를 결정하게 된다. 디폴트로 모든 펜
은 검정색, 두께는 1 픽셀이고 solid 형을 가지며, 모드는 캔버스에 있는 어떤 것이든 덧 씌
워그리는 copy 모드로 설정되어 있다.
1. 펜 색상의 변경
펜의 색상을 변경하는 것은 다른 여러가지 컴포넌트의 Color 프로퍼티를 런타임에서 변경
하는 것과 똑같다. 펜의 색상은 그려지는 라인의 색상을 결정하게 된다.
사용자에게 펜에 대한 새로운 색상을 결정하게 하려면, 보통 컬러 그리드를 띄워서 선택하
게 한다. 컬러 그리드는 foreground 색상과 background 색상을 결정할 수 있게 구성되어
있다. 이때 foreground 색상은 보통 펜의 색상을 나타내며, background 색상은 브러쉬의
색상을 나타낸다고 생각하면 된다.
2. 펜의 두께 변경
펜의 두께는 그려지는 라인의 두께를 픽셀 단위로 결정하는 것이다. 펜의 두께가 1 보다
크면, 펜의 Style 프로퍼티 값에 관계 없이 윈도우 95 는 언제나 solid 라인을 그리게 된다.
펜의 두께를 변경하려면 펜의 Width 프로퍼티에 정수값을 대입하면 된다.
3. 펜의 스타일 변경
펜의 Style 프로퍼티는 선의 종류를 일반적인 선(solid), 점선(dotted line), 대쉬(dashed
line) 등이 있다. 모두 6 개의 스타일이 존재하는데 이들은 각각 psSolid, psDash, psDot,
psDashDot, psDashDotDot, psClear 이다. 앞에서도 설명 했지만, 펜의 두께가 1 픽셀을
넘을 경우 이 프로퍼티의 값은 무시된다.
4. 펜의 모드 변경
펜의 모드 프로퍼티는 펜의 색상과 캔버스의 색상을 결합하는 방법을 결정하는 것이다. 예
를 들어, 펜은 언제나 검정색이게 할 수도 있고, 캔버스의 배경색의 보색으로 보이게 할 수
도 있고, 펜 색상의 보색으로 보이게 할 수도 있다.
5. 펜의 위치 얻기
펜이 다음 라인을 그릴 때 시작점이 되는 위치를 펜의 위치(position)라고 한다. 캔버스는
펜의 위치를 PenPos 프로퍼티에 저장한다. 펜의 위치는 라인을 그릴 때에만 영향을 미친
다. 그러므로, 다른 도형이나 텍스트를 그리는 경우에는 그리려는 위치를 좌표로 전달해야
한다. 펜의 위치를 설정할 때에는 MoveTo 메소드를 사용한다. 예를 들어, 다음의 코드는
펜의 위치를 캔버스의 좌측 상단으로 이동한다.
Canvas.MoveTo(0, 0);
LineTo 메소드로 라인을 그릴 때, 라인의 끝점으로 현재의 위치를 이동시킨다.
브러쉬의 활용
캔버스 컨트롤의 Brush 프로퍼티는 도형의 내부를 채우는 방법을 결정한다. 브러쉬 객체
에는 Color, Style, Bitmap 의 3개의 프로퍼티를 이용해서 여러가지 작업을 하게 된다.
이들 프로퍼티의 디폴트 값은 백색, solid 스타일, 패턴은 없는 것이다.
1. 브러쉬 색상의 변경
브러쉬의 Color 프로퍼티는 영역의 내부를 채울 색상을 결정한다. 보통 브러쉬는 배경색을
결정하는 것으로 이해하면 된다.
2. 브러쉬 스타일의 변경
브러쉬 스타일은 캔버스에 채우는 방법을 결정한다. 스타일에 따라 브러쉬 색상과 캔버스
의 색상을 결합하는 방법을 결정한다. 미리 지정된 스타일에는 solid, clear 와 여러가지 라