본문 바로가기
Delphi Tip/출력

델파이 인쇄 출력 5편

by MonoSoft 2023. 9. 1.
728x90
반응형

델파이 인쇄 출력

 

728x90

 

 

다음 세 가지를 중점적으로 다루겠습니다.

 

1. 라인단위로 출력하기

2. 박스(표)안에 출력하기

3. 무질서하게 출력하기

 

첫번째,

라인단위로 출력하기는 한 라인에 서로 다른 글꼴크기를 적용할때의 기법을 배우고

 

두번째,

박스안에 출력하기는 문서에서 표를 사용할때 각 셀에 문자를 중앙 또는

왼쪽, 오른쪽으로 정렬하는 방법에 대해서 배우고

 

세번째,

무질서하게 출력하기는 글꼴의 가로 세로 비율을 마음대로 조절하여

장평을 조절하는 방법과 문장을 여러 각도로 돌려서 출력하는 방법을 배우겠습니다.

어때요? 이 정도만 하면 문자 출력은 다 되겠죠?

 

 

 

1. 라인 단위로 출력하기

한 라인에 여러 크기의 폰트가 적용이될때 그냥 TextOut( 0, 0 ); 이라고 하면

모두 글꼴의 위부분을 기준으로 출력이 되기 때문에

문장이 위로 정렬된 상태로 됩니다.

 

( 예: TjT )

┏━━━━━━┓ ┏┓ ┏━━┓

┗━━┓┏━━┛ ┗┛ ┗┓┏┛

┃┃ ┏┓ ┃┃

┃┃ ┏┓┃┃ ┗┛

┃┃ ┃┗┛┃

┃┃ ┗━━┛

┃┃

┃┃

┗┛

 

이 그림에서 j와 마지막 T자의 크기를 작게 했는데

위로 정렬이 되어서 웃기게 되었죠?

그렇다고 TextOut( XX, Y - Font.Height ); 이렇게 하면 될까요?

 

그렇게 하면

 

┏━━━━━━┓

┗━━┓┏━━┛

┃┃

┃┃ ┏┓

┃┃ ┗┛

┃┃ ┏┓ ┏━━┓

┃┃ ┏┓┃┃ ┗┓┏┛

┃┃ ┃┗┛┃ ┃┃

┗┛ ┗━━┛ ┗┛

 

T자 끼리는 맞는데 j자가 위로 올라왔네요

약간 밑으로 내려 가야 하는디~

그럼 어떻게 해야 하느냐 그걸 알려면 먼저 몇 가지 용어를 알아야 겠군요

 

────┲━━┱ ──────Ascent Line

┗┓┏┛

┃┃ ┏┓

┃┃ ┗┛

┃┃ ┏┓

┏┓ ┃┃ ┃┃

┃┗━┛┃ ┃┃

──┺━━━┹ ─ ┲┓┨┨─ Base Line

┃┗┛┃

─────────┺━━┹ ─Descent Line

 

* Ascent 어센트 [asent] <-발음기호

Descent 디센트 [disent]

 

우리가 정렬을 해야할 기준은 Base Line입니다. 이해 하시죠?

 

그럼 어센트라인에서 베이스라인까지의 길이와 베이스라인에서

디센트라인까지의 길이를 구해야 겠군요

 

그런것을 구하려면 TextMetric을 다룰줄 알아야 합니다.

 

TTextMetric = record

  tmHeight: Longint; //전체 높이

  tmAscent: Longint; //베이스라인의 윗부분

  tmDescent: Longint; //베이스라인의 아랫부분

  tmInternalLeading: Longint; //경계 내부의리딩

  tmExternalLeading: Longint; //행간의 엑스트라 리딩

  tmAveCharWidth: Longint; //문자의 평균 폭

  tmMaxCharWidth: Longint; //가장 큰문자 가로 폭

  tmWeight: Longint; //굵기

  tmOverhang: Longint; //문자열간의 추가 폭

  tmDigitizedAspectX: Longint; //수평 기준

  tmDigitizedAspectY: Longint; //수직 기준

  tmFirstChar: AnsiChar; //첫번째 문자

  tmLastChar: AnsiChar; //마지막 문자

  tmDefaultChar: AnsiChar; //글꼴에 없는문자를 대체할 문자(네모)

  tmBreakChar: AnsiChar; //단어 잘림을 정의하는데 사용되는 문자

  tmItalic: Byte; //기울임꼴 <> 0

  tmUnderlined: Byte; //밑줄 <> 0

  tmStruckOut: Byte; //취소선 <> 0

  tmPitchAndFamily: Byte; //글꼴의 피치,패미리 정보

  tmCharSet: Byte; //문자세트

end;

 

제일 위에 세 개 tmHeight, tmAscent, tmDescent만 알면 됩니다.

 

tmHeight는 디센트라인에서 어센트라인까지의 폰트 높이를 말하구요
tmAscent는 베이스라인에서 어센트라인까지의 길이를 말하고
tmDescent는 베이스라인에서 디센트라인까지의 길이를 말합니다

 

우리는 GetTextMetrics API를 이용해서 프린터에서 사용되고 있는 글꼴의 정보를

위의 TTextMetric에다가 얻어올것입니다.

 

아래 소스를 보세요

 

procedure TMain_Form.Button2Click(Sender: TObject);

var

  Metrics : TTextMetric;

begin

  Printer.BeginDoc;

 

  with Printer.Canvas do

  begin

    SetMapMode( Handle, MM_LOMETRIC );

 

    Font.Name := '굴림체';

    Font.Height := 300;

    GetTextMetrics( Handle, Metrics );

    TextOut( 50, -500 + Metrics.tmAscent, 'Delphi델파이' );

 

    Pen.Width := 2; MoveTo( 0, -500 );

    LineTo( 2000, -500 );

    Pen.Width := 1;

 

    MoveTo( 0, -500 + Metrics.tmAscent );

    LineTo( 2000, -500 + Metrics.tmAscent );

 

    MoveTo( 0, -500 - Metrics.tmDescent );

    LineTo( 2000, -500 - Metrics.tmDescent );

  end;

 

  Printer.EndDoc;

end;

 

핵심은

GetTextMetrics( Handle, Metrics );

TextOut( 50, -500 + Metrics.tmAscent, 'Delphi델파이' ); 이겁니다.

 

GetTextMetrics로 프린터핸들의 폰트를 Metrics로 저장하고

TextOut( 50, -500 + Metrics.tmAscent, ... 로 출력을 하는데

왜 + Metrics.tmAscent 냐구요?

 

매핑모드가 MM_LOMETRIC기 땜에 Y축이 증가할 수록 올라가니깐 그렇습니다.

 

즉 Y축 -500에서 폰트의 베이스라인에서

어센트라인까지의 길이만큼 위로 올린다는 뜻입니다.

 

그러면 TextOut 의 기준 점이 폰트의 크기와 관계없이

베이스라인으로 정렬이 됩니다.

 

다음 예를 직접 해 보세요

 

procedure TextOutBase( X, Y: Integer; Text: String );

var

  Metrics : TTextMetric;

begin

  with Printer.Canvas do

  begin

    GetTextMetrics( Handle, Metrics );

    TextOut( X, Y + Metrics.tmAscent, Text );

  end;

end;

 

procedure TMain_Form.Button3Click(Sender: TObject);

const

  Text1 = 'Delphi';

  Text2 = 'print';

  Text3 = 'Superpage';

  Text4 = 'Yang Byoung Kyu';

  Text5 = '델마당';

 

var

  Len : Integer;

begin

  Printer.BeginDoc;

 

  with Printer.Canvas do

  begin

    SetMapMode( Handle, MM_LOMETRIC );

 

    Font.Name := 'Times New Roman';

    Brush.Style := bsClear;

    Len := 100;

 

    Font.Height := 200;

    TextOutBase( Len, -300, Text1 );

    Inc( Len, TextWidth( Text1 + ' ' ) );

 

    Font.Height := 120;

    TextOutBase( Len, -300, Text2 );

    Inc( Len, TextWidth( Text2 + ' ' ) );

 

    Font.Height := 60;

    TextOutBase( Len, -300, Text3 );

    Inc( Len, TextWidth( Text3 + ' ' ) );

 

    Font.Height := 50;

    TextOutBase( Len, -300, Text4 );

    Inc( Len, TextWidth( Text4 + ' ' ) );

 

    Font.Name := '굴림';

    Font.Height := 100;

    TextOutBase( Len, -300, Text5 );

    MoveTo( 0, -300 ); LineTo( 2000, -300 );

  end;

 

  Printer.EndDoc;

end;

 

 

 

2. 박스안에 출력하기

 

박스안에 출력하는 가장 간편한방법으로는 DrawText이 있습니다.

 

// 박스안에 출력하기

procedure TMain_Form.Button4Click(Sender: TObject);

const

  DrawFormat : array[0..8] of UINT = (

DT_LEFT or DT_TOP,

DT_CENTER or DT_TOP,

DT_RIGHT or DT_TOP,

DT_LEFT or DT_VCENTER,

DT_CENTER or DT_VCENTER,

DT_RIGHT or DT_VCENTER,

DT_LEFT or DT_BOTTOM,

DT_CENTER or DT_BOTTOM,

DT_RIGHT or DT_BOTTOM );

 

Texts:

728x90
반응형

'Delphi Tip > 출력' 카테고리의 다른 글

델파이 인쇄 출력 8편  (0) 2023.09.05
델파이 인쇄 출력 6편  (0) 2023.09.04
델파이 인쇄 출력 4편  (0) 2023.08.30
델파이 인쇄 출력 3편  (0) 2023.08.29
델파이 인쇄 출력 2편  (0) 2023.08.28

댓글