본문 바로가기
Delphi Tip/출력

델파이 인쇄 출력 1편

by MonoSoft 2023. 8. 25.
728x90
반응형

델파이 인쇄 출력 1편

728x90

 

 

 

 

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에 똑같은 내용이 그려질겁니다.

인쇄를 할때 미리보기를 구현해야 합니다.

그럴경우 인쇄할때 그리는 루틴따로 미리보기할때

그리는 루틴따로 할것 없이 실제 그리는 루틴을 별도로 독립시켜놓으면

하나의 루틴으로 인쇄와 미리보기를

다 할 수 있어서 좋습니다.

 

728x90
반응형

댓글