Wojtysz1 podał dwie ciekawe funkcje do drukowania w Delphi w milimetrach : MM_na_DPI i DPI_na_MM. Na ich podstawie napisałem funkcje CoordX(mm) i CoordY(mm), które oprócz zamiany z milimetrów na DPI uwzględniają
sprzętowe marginesy drukarki. Np. żeby wydrukować tekst 10 mm od lewego brzegu kartki i 50 mm od górnego brzegu, wystarczy wykonać instrukcję
TextOut(CoordX(10),CoordY(50), 'To jest napis');
i nie trzeba się kłopotać o lewy i górny margines. Różne drukarki mają różne marginesy i rozdzielczości - obie funkcje potrafią je uwzględnić. Funkcje są szczególnie przydatne przy projektowaniu wydruku. W wersji, którą podaję zakładam , że rozdzielczość pozioma i pionowa są takie same. Nad tym, co zrobić, gdy są różne muszę się dopiero zastanowić .Chodzi przede wszystkim o orientację Landscape, w Portrait wszystko działa poprawnie. Gdy rozdzielczości są równe nie ma problemu w obu orientacjach.
Podaję treść stosownego unitu - może komuś się przyda:
unit Utils_MD;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils,
System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
Vcl.ComCtrls, Vcl.Printers;
function MM_na_DPI(mm:single):integer; //
function DPI_na_MM(dots:integer):single;//
function CoordX(mm:Single):Integer;
function CoordY(mm:Single):Integer;
var
Drukarka:TPrinter;
implementation
function MM_na_DPI(mm:single):integer;
var
a,b:integer;
begin
a:=GetDeviceCaps(Printer.Handle,LogPixelSX); //rozdzielczość drukarki
b:=Round(mm*a/25.4); //dpi jest wartością całkowitą, stąd funkcja Round,
//która zaokrągla dzielenie do liczby całkowitej
Result:=b;
end;
function DPI_na_MM(dots:integer):single;
var
a:integer;
b:real;
begin
a:=GetDeviceCaps(Printer.Handle,LogPixelSX); //rozdzielczość drukarki
b:=dots*25.4/a;
Result:=b;
end;
function CoordX(mm:Single):Integer;
var pom:Integer;
Begin
pom:=MM_na_DPI(mm);
pom:=pom-GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX);
Result:=pom;
End;
function CoordY(mm:Single):Integer;
var pom:Integer;
Begin
pom:=MM_na_DPI(mm);
pom:=pom-GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
Result:=pom;
End;
end.