본문 바로가기
Delphi Tip/출력

델파이 인쇄 출력 3편

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

델파이 인쇄 출력

728x90

 

 

매핑모드의 사용법

 

실제로 인쇄에서의 가장 핵심 부분은 매핑모드에 있습니다.

그리고 쓰고 하는것은 이미 누구나 다 아는 사실이고

별로 어려울것도 없으며 궂이 설명을 할 것도 없습니다.

 

그러나 대부분 매핑모드를 몰라서 인쇄루틴을 엉터리로 하거나

매번 그릴때마다 인자값을 프린터의 해상도에 맞게 재 계산을 해서

그리는것이 대부분입니다.

 

이제 이번 장의 몇 줄만 잘 배우시면 인쇄가 이렇게 쉽다는것을 알게 될겁니다.

 

 

매핑모드란?

그리기 함수들이 사용하는 인자값들의 단위를 픽셀, 밀리미터, 인치

혹은 사용자 정의 단위로 바꾸어 주며 그리기의 기준점을 변경하여 줍니다.

 

 

한 가지 예를 다시 들겠습니다.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  Printer.BeginDoc;

  Printer.Canvas.MoveTo( 100, 100 );

  Printer.Canvas.LineTo( 200, 200 );

  Printer.EndDoc;

end;

 

이 루틴을 실행하면 역슬래시모양의 선이 그려지는데

시작점이 가로 100 세로 100 지점이고 끝지점이가로 200 세로 200 지점입니다.

 

물론 단위는 픽셀이지요 그러면 문제가 있지요?

 

어떤 프린터는 해상도가 150DPI이고 어떤 프린터는 해상도가 300DPI고

또 어떤 프린터는 해상도가 600DPI잖아요

 

그러면 각 프린터마다 선의 길이와 위치, 굵기가 다르게 나옵니다.

그래서 이것을 해결하기 위해 프린터의 해상도를 얻어와서

시작점의 위치와 끝점의 위치를 재 계산하고 그럽니다.

 

그러나...

 

우리는 그렇게 하지 말고 이렇게 합시다.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Printer.BeginDoc;

SetMapMode( Printer.Handle, MM_LOMETRIC );

Printer.Canvas.MoveTo( 100, -100);

Printer.Canvas.LineTo( 200, -200 );

Printer.EndDoc;

end;

 

여기서 바뀐부분은

SetMapMode( Printer.Handle, MM_LOMETRIC );가 추가되었다는것 하고

그리기의 두번째 인자(Y값)이 마이너스로 바뀌었다는 점입니다.

 

이렇게하면 그리기의 단위가 픽셀에서 0.1밀리미터 단위로 바뀝니다.

 

그러니깐 위의 문장은 시작점이 가로, 세로 각 10밀리미터 끝점이

가로, 세로 각 20밀리미터의 위치에 그려집니다.

 

그리고 선의 굵기를 지정하지 않았으므로 디폴트값 1이 적용되니깐

선의 굵기는 0.1밀리미터입니다.

 

물론 프린터의 해상도하고는 아무런 관계가 없습니다.

 

매핑모드중 디폴트인 MM_TEXT(픽셀단위)를 제외하고

나머지는 모두 Y값이 위로 갈수록 증가하고 내려 갈수록 감소합니다.

 

물론 새로운 함수를 정의 해서 MM_TEXT처럼 밑으로 갈수록

증가하도록 바꿀수도 있지만 그냥 쓰는것이 가장 쉽습니다.

 

 

 

각 매핑모드의 단위는 다음과 같습니다.

 

이름 단위 X증가 방향 Y증가 방향

MM_TEXT Pixel 오른쪽 아래

MM_LOMETRIC 0.1 mm 오른쪽 위

MM_HIMETRIC 0.01 mm 오른쪽 위

MM_LOENGLISH 0.01 inch 오른쪽 위

MM_HIENGLISH 0.001 inch 오른쪽 위

MM_TWIPS 1/20 Point, 1/1440 inch 오른쪽 위

MM_ISOTROPIC 사용자정의 X,Y동일 사용자정의 사용자정의

MM_ANISOTROPIC 사용자정의 사용자정의 사용자정의

 

※ MM_TEXT : 엠엠 텍스트

MM_LOMETRIC : 엠엠 로 메트릭

MM_HIMETRIC : 엠엠 하이 메트릭

MM_LOENGLISH : 엠엠 로 잉글리쉬

MM_HIENGLISH : 엠엠 하이 잉글리쉬

MM_TWIPS : 엠엠 트윕스

MM_ISOTROPIC : 엠엠 이소트로픽

MM_ANISOTROPIC : 엠엠 애니소트로픽

( 발음을 확실히 모르면 대중 앞에서 개망신 당할 수도 있어용~ )

 

 

이번에는 매핑모드를 여러가지로 바꾸어서 출력을 해 보겠습니다.

 

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;

SetMapMove( Printer.Handle, MM_LOMETRIC );

DrawLine( Printer.Canvas );

Printer.EndDoc;

end;

 

procedure TMain_Form.Button2Click(Sender: TObject);

begin

Printer.BeginDoc;

SetMapMove( Printer.Handle, MM_HIMETRIC );

DrawLine( Printer.Canvas );

Printer.EndDoc;

end;

 

procedure TMain_Form.Button3Click(Sender: TObject);

begin

Printer.BeginDoc;

SetMapMove( Printer.Handle, MM_LOENGLISH );

DrawLine( Printer.Canvas );

Printer.EndDoc;

end;

 

procedure TMain_Form.Button4Click(Sender: TObject);

begin

Printer.BeginDoc;

SetMapMove( Printer.Handle, MM_HIENGLISH );

DrawLine( Printer.Canvas );

Printer.EndDoc;

end;

 

가장 많이 쓰이는 네 가지로 해 보았습니다.

모두 다 제각각으로 출력이 됩니다.

 

이 중에서 어떤것을 사용할 지는 물론 본인이

문서의 특성에 맞게 선택을 하면 됩니다.

 

지금까지 해온 예제들은 모두 그리기의

기본위치가 왼쪽 위 지점이 었습니다.

 

물론 인쇄에서 뿐만 아니라 화면이나

모든 디바이스에서도 기준점(0,0)은 항상 왼쪽 위 지점입니다.

 

그래서 대부분의 사람들은 항상 기준점은 왼쪽위이다. 라고 단정을 지어 버립니다.

하지만 그리기의 기준점은 얼마든지 변경할 수 있습니다.

 

 

다음 예를 보십시오.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Printer.BeginDoc;

SetMapMove( Printer.Handle, MM_LOMETRIC );

Printer.Canvas.MoveTo( 0, 0 );

Printer.Canvas.LineTo( 100, -100 );

Printer.EndDoc;

end;

 

이렇게 하면 물론 역슬래쉬모양의 선이 가로세로 10밀리미터 지점까지 그려지겠죠?

그러나 시작점이 0, 0 임에도 불구하고 위치가 프린터마다 다르게 나옵니다.

 

왜냐하면 프린터마다 여백이 다르기 때문이죠~

그래서 왼쪽 여백을 20밀리미터로 하고 싶으면 프린터의

여백을 얻어와서 20밀리미터 빼기 여백을 한 지점을

기준점으로설정하면 모든 프린터에서 같은 여백이 적용됩니다.

 

쉽죠?

먼저 기준점을 바꾸는 것부터 해볼까요?

 

var

OldPoint: TPoint; :

SetWindowOrgEx( Printer.Handle, 100, 100, @OldPoint );

 

이렇게 해주면 그리기의 기준점이 가로 100 세로 100의 위치로 바뀌면서

현재의 기준점을 OldPoint에 저장해 줍니다.

 

물론 단위는 현재 매핑모드따라 다릅니다.

즉 디폴트(MM_TEXT)에서는 100픽셀이고

MM_LOMETRIC에서는 10밀리미터의 위치를 말합니다.

 

MM_TEXT를 제외한 나머지에서는

세번째 인자값(Y축)을 마이너스로 해야겠죠?

 

기준점을 프린터마다 동일하게 적용하는

예제는 다음 장에서 하도록 하겠습니다.

 

728x90
반응형

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

델파이 인쇄 출력 5편  (0) 2023.09.01
델파이 인쇄 출력 4편  (0) 2023.08.30
델파이 인쇄 출력 2편  (0) 2023.08.28
델파이 인쇄 출력 1편  (0) 2023.08.25
퀵레포트 추가 설치  (0) 2022.01.19

댓글