양병규님의 '코딩으로 구현하는 인쇄'를 참고하여 출력모듈을 개발하였는데 문제가 있어 질문 올립니다.
업무특성상 수십종의 프린터를 사용하는데요. 특정프린터(주로 삼성프린터)에서 출력이 정상적으로 되지 않는 문제가 발생하네요. 델파이 뻑인지... 아님 제가 잘못 코딩했는지... 프린터드라이버 문제인지... 도무지 감히 안잡히네요. 문제는 문제가 되는 프린터로 다른 프로그램(워드나 아래아한글 등등)은 잘 출력된다는 겁니다.
아래소스중, TextOutBase()부분에서 출력을 하면 한글은 제대로 나오는데 영문/숫자/스페이스(1byte부분)가 한글하고 똑같은 간격으로 출력되네요. 다시말해서 한글 한자당 영문/숫자가 두자씩 찍혀야 하는데 한자씩만 찍히네요.
이 문제 말고도 이렇게 코딩했을 때 전체적으로 프린터 드라이버에 상당이 민감한 것같네요. 다른 프로그램으로는 잘 출력되는데 내가 만든 프로그램은 출력이 안되서 드라이버를 다시깔고서야 된 경우도 있고...
빨리 해결해야 하는데 소스는 별문제 없는거 같고, 참 답답합니다.
혹시 비슷한 문제 경험해 보신 분 계시면 조언바랍니다.
감사합니다.
- 출력관련 부분은 다음과 같습니다. -
procedure TfrmSetReport.PrintMain;
var
OldMap: Integer;
OldOrg: TSize;
...
begin
...
Printer.Orientation := poPortrait;
Printer.BeginDoc;
OldMap := SetMapMode(Printer.Handle, MM_LOMETRIC);
OldOrg := SetOrgPoint(Printer.Handle, Printer.Canvas, Point(200, 200));
...
try
...
// 실제출력....
Printer.Canvas.Pen.Style := psSolid;
Printer.Canvas.Pen.Width := 7;
Printer.Canvas.MoveTo(100, -450);
Printer.Canvas.LineTo(1700, -450);
Printer.Canvas.Font.Name := '바탕체';
Printer.Canvas.Font.Height := 30;
s := '어쩌구저쩌구1234 OK';
TextOutBase(Printer.Canvas, 500, -600, s);
finally
SetOrgPoint(Printer.Handle, Printer.Canvas, Point(OldOrg.cx, OldOrg.cy));
SetMapMode(Printer.Handle, OldMap);
end;
Printer.EndDoc;
...
end;
procedure TextOutBase(Canvas: TCanvas; X, Y: Integer; Text: String);
var
Metrics : TTextMetric;
begin
with Canvas do
begin
GetTextMetrics(Handle, Metrics);
TextOut(X, Y + Metrics.tmAscent, Text);
end;
end;
function SetOrgPoint(Handle: THandle; Canvas: TCanvas; APoint: TPoint): TSize;
var
Org: TPoint;
begin
Escape(Canvas.Handle, GETPRINTINGOFFSET, 0, nil, @Org);
SetWindowOrgEx(Handle, Org.X - APoint.X, APoint.Y - Org.Y, @Result);
end;