Hallo
DP'ler!
Ich zerbreche mir gerade meinen Kopf an dem Thema "Drucken mit Graphics32 Library". Ich habe mich für die G32 entschieden, da sie in meinen Augen eine gute Verbreitung hat, hochperformant ist und auch oft empfohlen wird. Ich habe mir eine kleine Druck-Klasse gebastelt, die ich mit Hilfe der Beitäge in der
DP (
HIER) finden konnte. Leider, zu meiner Enttäuschung, klappt das irgendwie überhaupt nicht. Der Drucker ist zwar auswählbar und lässt sich auch ansprechen (wahnsinn!), aber das wars auch schon. Es wird lediglich ein leeres Bild "gedruckt" - wohl eher ein leeres Blatt.
Hier mein Code:
Delphi-Quellcode:
type
TImagePrint = class(TObject)
private
FFilename: WideString;
FImagePrinter: WideString;
FALeft: Integer;
FATop: Integer;
FARight: Integer;
FABottom: Integer;
procedure ResizeProportional( var Source: TBitmap32;
AvailDim: TPoint );
function SetPrinter( PrinterName: WideString ): Boolean;
public
constructor Create(); overload;
procedure Print();
procedure PrintImage( PCanvas: TCanvas );
published
property Filename: WideString read FFilename write FFilename;
property ImagePrinter: WideString read FImagePrinter write FImagePrinter;
end;
implementation
constructor TImagePrint.Create();
begin
inherited Create();
self.FFilename := '';
self.FImagePrinter := '';
self.FALeft := 0;
self.FATop := 0;
self.FARight := 0;
self.FABottom := 0;
end;
procedure TImagePrint.ResizeProportional( var Source: TBitmap32;
AvailDim: TPoint );
var
_factor: Real; // Scaling
_newdim: TPoint; // New size
_resampler: TKernelResampler;
begin
_factor := Min(Source.Width / AvailDim.X, Source.Height / AvailDim.Y); // Skalierungsfaktor ermitteln
_newdim.X := Floor(Source.Width * _factor); //Neue Breite errechnen
_newdim.Y := Floor(Source.Height * _factor); // " Höhe "
Source.Width := _newdim.X;
Source.Height := _newdim.Y;
_resampler := TKernelResampler.Create(Source);
_resampler.Kernel := TLanczosKernel.Create;
Source.Draw(Source.Width,Source.Height,Source);
end;
function TImagePrint.SetPrinter( PrinterName: WideString ): Boolean;
var
i: Integer;
begin
result := FALSE;
Printer.PrinterIndex := -1;
for i:=0 to Printer.Printers.Count - 1 do
begin
if ( self.FImagePrinter = Printer.Printers[i] ) then
begin
Printer.PrinterIndex := i;
result := TRUE;
break;
end;
end;
end;
procedure TImagePrint.Print();
begin
if ( self.SetPrinter( self.FImagePrinter ) ) then
begin
Printer.BeginDoc;
SetMapMode( Printer.Canvas.Handle, MM_LOMETRIC );
self.PrintImage( Printer.Canvas );
Printer.EndDoc;
end;
end;
procedure TImagePrint.PrintImage( PCanvas: TCanvas );
var
_picture: TBitmap32;
_rect: TRect;
_dimension: TPoint;
begin
_picture := Tbitmap32.Create;
self.FALeft := 0;
self.FATop := 0;
self.FARight := 400;
self.FABottom := 400;
_rect := Rect( self.FALeft, self.FATop, self.FARight, self.FABottom );
_picture.LoadFromFile( self.FFilename );
_dimension.x := 400;
_dimension.y := 400;
self.ResizeProportional( _picture, _dimension );
_picture.DrawTo( PCanvas.Handle, _rect, _picture.BoundsRect);
FreeAndNil( _picture );
end;
Ich habe einige Festwerte hereingeschrieben, um zu testen, ob überhaupt was passiert - aber auch das brachte keinen Erfolg... Leider. Alles was ich versuche ist ein Bild proportional auf ein Blatt zu drucken - wenn möglich mit Millimeter-Angabe der Breite, bzw. Maximalhöhe...
Kann mir vielleicht jemand bei dieser Angelegenheit helfen? Vielen dank....
Euer Moon