ich möchte eine Grafikausgabe mit Printer.Canvas ausdrucken. Mein Betriebsystem ist Ubuntu 16.04. Dazu habe ich mir im Wiki die Seite "using the printer" durchgelesen und meinen Code daran angelegt. Das Drucken geht jetzt soweit ganz gut. Probleme habe ich aber mit dem Auszentrieren auf der Seite. Ich habe in untenstehendem Programmcode drei Varianten probiert. Bei Variante 1 mit workrect dachte ich eigentlich es würde die ganze Form in den Druckbereich gedruckt. Ergebnis war aber dass das größte Rechteck (das die Größe der Form simulieren soll) rechts und unten abgeschnitten wird. Bei Variante 3 und 4 habe ich eigentlich erwartet dass das gestrichelte Rechteck auf den Seitenrändern liegt. Hier werden aber alle drei Rechtecke rechts und unten abgeschnitten. Wer weiß wo mein Denkfehler liegt?
Viele Grüße
Bernd
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,StdCtrls,Printers;
type
{ TForm1 }
TForm1 = class(TForm)
Button1 : TButton;
procedure FormCreate(Sender: TObject);
procedure drucken1(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1 : TForm1;
dpi : integer;
Druckbereich : TRect;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
dpi:=72;
Form1.Caption := 'Drucke die ganze Form';
Form1.Left := 250;
Form1.Top := 100;
Form1.Width := round((297*dpi)/25.4); //A4 so das es in meinen Bildschirm passt
Form1.Height := round((210*dpi)/25.4);
Form1.Color := clwhite;
Button1 := TButton.Create(self);
Button1.Parent := Form1;
Button1.Left := 20;
Button1.Top := 550;
Button1.Height := 25;
Button1.Width := 100;
Button1.Caption := 'Drucken1';
Button1.OnClick := @drucken1;
Printer.Orientation:=poLandscape;
Druckbereich.Left :=round((printer.PaperSize.PaperRect.WorkRect.Left)*dpi/Printer.XDPI);
Druckbereich.Top :=round((printer.PaperSize.PaperRect.WorkRect.Top)*dpi/Printer.YDPI);
Druckbereich.Right :=round((printer.PaperSize.PaperRect.WorkRect.Right)*dpi/Printer.XDPI);
Druckbereich.Bottom :=round((printer.PaperSize.PaperRect.WorkRect.Bottom)*dpi/Printer.YDPI);
end;
procedure TForm1.drucken1(Sender: TObject);
var myBitMap : TBitMap;
rct : TRect;
HScaleFactor, VScaleFactor: single;
begin
HScaleFactor:=Printer.XDPI/dpi; //Screen.PixelsPerInch=Auflösung Bildschirm
VScaleFactor:=Printer.YDPI/dpi;
myBitMap := TBitMap.Create;
try
myBitMap.LoadFromDevice(Canvas.Handle); //Hier hat myBitMap die Größe Form1.width bzw. height
rct:=Rect(0, 0, trunc(myBitMap.Width*HScaleFactor), trunc(myBitMap.Height*VScaleFactor));
Printer.BeginDoc;
try
//Variante1:
Printer.Canvas.StretchDraw(printer.PaperSize.PaperRect.WorkRect, myBitMap);
//Variante2:
//Printer.Canvas.StretchDraw(Rect(0,0,Printer.PaperSize.Width,Printer.PaperSize.Height), myBitMap);
//Variante3:
//printer.Canvas.StretchDraw(rct,myBitMap);
finally
Printer.EndDoc;
end;
finally
myBitMap.Free;
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color := clwhite;
//Rechteck mit Blattgröße:
Canvas.Rectangle(0,0,Form1.Width,Form1.Height);
Canvas.Pen.Color := clblue;
Canvas.Pen.Style := psdot;
//Rechteck vom Druckbereich:
Canvas.Rectangle(Druckbereich);
Canvas.Pen.Color := clblack;
Canvas.Pen.Style := pssolid;
//Rechteck minimal kleiner als Druckbereich:
Canvas.Rectangle(Druckbereich.Left+2,Druckbereich.Top+2,Druckbereich.Right-2,Druckbereich.Bottom-2);
//das was halt so ausgegeben werden soll:
Canvas.Rectangle(50,50,150,150);
end;
end.