Einzelnen Beitrag anzeigen

moonwhaler

Registriert seit: 22. Dez 2005
57 Beiträge
 
Delphi 5 Enterprise
 
#1

Drucken mit Graphics32 Library

  Alt 4. Sep 2007, 14:49
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
  Mit Zitat antworten Zitat