델파이 인쇄 출력 1편
TCanvas의 사용법 (Printer.Canvas)
용지에 뭔가를 그릴려면 Printer.Canvas부터
사용할 줄 알아야 합니다.
TCanvas가 지원하지 않는 일부 함수를 제외하고는
대부분 Printer.Canvas를 이용해서 그릴것이기 때문입니다.
TCanvas는 다음과 같은 구조를 가지고 있습니다.
// 생성, 소멸
constructor Create;
destructor Destroy; override; // 직선그리기
procedure LineTo(X, Y: Integer);
procedure MoveTo(X, Y: Integer);
procedure Polyline(const Points: array of TPoint);
procedure PolyBezier(const Points: array of TPoint);
procedure PolyBezierTo(const Points: array of TPoint); // 사각형 그리기
procedure FillRect(const Rect: TRect);
procedure DrawFocusRect(const Rect: TRect);
procedure FrameRect(const Rect: TRect);
procedure Rectangle(X1, Y1, X2, Y2: Integer);
procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer); // 원 그리기
procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);
procedure Ellipse(X1, Y1, X2, Y2: Integer);
procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);
procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); // 다각형 그리기
procedure Polygon(const Points: array of TPoint); // 채우기
procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle); // 비트맵 처리
procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap;const Source: TRect; Color:TColor);
procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect);
procedure Draw(X, Y: Integer; Graphic: TGraphic);
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic); // 문자열 관련
function TextExtent(const Text: string): TSize;
function TextHeight(const Text: string): Integer;
procedure TextOut(X, Y: Integer; const Text: string);
procedure TextRect(Rect: TRect; X, Y: Integer; const Text: string);
function TextWidth(const Text: string): Integer; // 점찍기
property Pixels[X, Y: Integer]: TColor; // 상태 제어
procedure Lock; procedure Unlock;
procedure Refresh; function TryLock: Boolean; // 이벤트
property OnChange: TNotifyEvent;
property OnChanging: TNotifyEvent; // 프로퍼티
property ClipRect: TRect; //ReadOnly
property Handle: HDC; property LockCount: Integer ; //ReadOnly
property CanvasOrientation: TCanvasOrientation ; //ReadOnly
property PenPos: TPoint ;
property TextFlags: Longint;
property Brush: TBrush;
property CopyMode: TCopyMode;
property Font: TFont; property Pen: TPen;
이 중에서 선그리기를 한번 해 볼까요?
빈폼의 OnPaint이벤트에다가 다음과 같이 써 보세요
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.MoveTo( 100, 100 );
Canvas.LineTo( 200, 200 );
end;
이번에는 프린터를 이용해서 용지에다가 그려 보겠습니다.
폼에 버튼을 하나 올려놓고 버튼의 OnClick에 이렇게 해 보세요
procedure TForm1.Button1Click(Sender: TObject);
begin
Printer.BeginDoc;
Printer.Canvas.MoveTo( 100, 100 );
Printer.Canvas.LineTo( 200, 200 );
Printer.EndDoc;
end;
아까것이랑 같은데 인쇄를 시작하는 문장과 끝내는 문장이 폼함되었고
Canvas가 Pritner.Canvas로 바뀌었다는것만 다르고 같습니다.
이번에는 선그리기와 더불어 네모와 동그라미 등
여러가지를 그려보겠습니다.
procedure DrawLine( Canvas: TCanvas );
begin
with Canvas do
begin
Pen.Width := 1;
MoveTo( 100, 100 );
LineTo( 2000, 100 );
Pen.Width := 3;
MoveTo( 100, 200 );
LineTo( 2000, 200 );
Pen.Width := 5;
MoveTo( 100, 400 );
LineTo( 2000, 400 );
Pen.Width := 10;
MoveTo( 100, 600 );
LineTo( 2000, 600 );
Pen.Width := 20;
MoveTo( 100, 800 );
LineTo( 2000, 800 );
Pen.Color := clRed;
Brush.Color := clYellow;
Ellipse( 100, 1000, 2000, 1200 );
Pen.Color := clGreen;
Brush.Color := clBlue;
Rectangle( 100, 1400, 2000, 1600 );
Pen.Color := clMaroon;
Brush.Color := clAqua;
Rectangle( 100, 1800, 2000, 2000 );
Brush.Color := clNavy;
Brush.Style:= bsDiagCross;
Rectangle( 100, 2200, 2000, 2500 );
end;
end;
procedure TMain_Form.Button1Click(Sender: TObject);
begin
Printer.BeginDoc;
DrawLine( Printer.Canvas );
Printer.EndDoc;
end;
한가지 짚고 넘어갈것은 아래에 있는
버튼OnClick이벤트에서는 인쇄를 시작하고 종료하는 문장만 있고
실제 그려지는 루틴은 위에 별도로 DrawLine이라는
procedure를 따로 만들어 두었다는 점입니다.
만약 버튼의 OnClck이벤트에다가 이렇게 하면...
procedure TMain_Form.Button1Click(Sender: TObject);
begin
DrawLine( Image1.Canvas );
end;
어떻게 될까요?
물론 당연히 Image1에 똑같은 내용이 그려질겁니다.
인쇄를 할때 미리보기를 구현해야 합니다.
그럴경우 인쇄할때 그리는 루틴따로 미리보기할때
그리는 루틴따로 할것 없이 실제 그리는 루틴을 별도로 독립시켜놓으면
하나의 루틴으로 인쇄와 미리보기를
다 할 수 있어서 좋습니다.
'Delphi Tip > 출력' 카테고리의 다른 글
델파이 인쇄 출력 3편 (0) | 2023.08.29 |
---|---|
델파이 인쇄 출력 2편 (0) | 2023.08.28 |
퀵레포트 추가 설치 (0) | 2022.01.19 |
퀵레포트 -> ITF 변환 및 이미지 정보 변경 (0) | 2022.01.18 |
델파이7 에서 퀵리포트 추가하기 (0) | 2022.01.17 |
댓글