간단한 출력물을 만들어 내보내고자 할때 (Ex : 세금계산서) 해당 인쇄물이 프린터를 통해 출력되기전에
정상적인 내용을 담고 있는지 화면으로 확인해보고 싶을때가 있다.
리포팅 툴을 이용하여 처리할 경우에는 간단하게 처리할 순 있지만, 순수 노가다를 이용한 코딩시에는 애로사항이 기 마련...
TPrinter를 이용하여 프린터에 출력을 내보내는 과정에서 Canvas에 그려주는 부분만을 TPaintBox의 Canvas에 인쇄하도록 하였더니, 실제로 화면에 보이는 내용과 인쇄되는 내용이 전혀 다른게 아닌가?
아래는 인쇄시 테스트한 코드이다.
Procedure Draw_Test(Canvas : TCanvas); Begin With Canvas Do Begin Rectangle(10, 0, 400, 400); Font.Name := '굴림체'; Font.Height := 20; TextOut( 50, 50 , 'Delphi델파이' ); Font.Size := 40; TextOut(50, 200 , 'Delphi'); End; End; Procedure Do_Print; Begin // 미리보기 Draw_Test(PaintBox.Canvas); // 프린터 인쇄 Printer.BeginDoc; Draw_Test(Printer.Canvas); Printer.EndDoc; End;
여러가지 자료를 찾아보니, 맵핑 모드니 뭐니 여러가지 말이 많다.
이것저것 신경써야될것도 많고.... 너무 복잡하지 아니한가........................ 그러던 와중에 찾은 한가지 방법!
메타파일을 만들어 해당 메타파일을 원하는 Canvas에 그려주면 되는것! 생성된 메타파일을 TPaintBox에 그려주면 미리보기가 되고, TPrinter에 그려주면 인쇄가 되는....
눈에 보이는 그대로 원하는 출력물을 얻어보자! What You See! What You Get! (WYSWYG)
Procedure Draw_Test(Canvas : TCanvas); Var MyMetafile : TMetafile; Begin MyMetafile := TMetafile.Create; Try With TMetafileCanvas.Create(MyMetafile, 0) Do Begin Try Brush.Style := bsClear; Rectangle(10, 0, 400, 400); Font.Name := '굴림체'; Font.Height := 20; TextOut( 50, 50 , 'Delphi델파이' ); Font.Size := 40; TextOut(50, 200 , 'Delphi'); Finally Free; End; End; Canvas.Draw(0,0,MyMetafile); Finally MyMetafile.Free; End; End; Procedure Do_Print; Begin // 미리보기 Draw_Test(PaintBox.Canvas); // 프린터 인쇄 Printer.BeginDoc; Draw_Test(Printer.Canvas); Printer.EndDoc; End;