델파이 인쇄 출력
매핑모드의 사용법
실제로 인쇄에서의 가장 핵심 부분은 매핑모드에 있습니다.
그리고 쓰고 하는것은 이미 누구나 다 아는 사실이고
별로 어려울것도 없으며 궂이 설명을 할 것도 없습니다.
그러나 대부분 매핑모드를 몰라서 인쇄루틴을 엉터리로 하거나
매번 그릴때마다 인자값을 프린터의 해상도에 맞게 재 계산을 해서
그리는것이 대부분입니다.
이제 이번 장의 몇 줄만 잘 배우시면 인쇄가 이렇게 쉽다는것을 알게 될겁니다.
매핑모드란?
그리기 함수들이 사용하는 인자값들의 단위를 픽셀, 밀리미터, 인치
혹은 사용자 정의 단위로 바꾸어 주며 그리기의 기준점을 변경하여 줍니다.
한 가지 예를 다시 들겠습니다.
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축)을 마이너스로 해야겠죠?
기준점을 프린터마다 동일하게 적용하는
예제는 다음 장에서 하도록 하겠습니다.
'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 |
댓글