Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Print Scrollbox in richtiger Größe (https://www.delphipraxis.net/206187-print-scrollbox-richtiger-groesse.html)

Cordt 27. Nov 2020 16:58

Print Scrollbox in richtiger Größe
 
Hallo miteinander,

ich versuche aktuell eine Scrollbox auszudrucken.
Ich habe bereits eine procedure, um die Scrollbox auf die Printer.Canvas zu bekommen, aber beim Ausdrucken ist die übergroße Seite vllt noch 5 cm groß.
Ich würde es gerne auf ne Din A 4 Seite vergrößern. Wenn ich es im PDF-Printer ausdrucke, kann ich in super Qualität bis zur Größe von din A 4 ranzoomen.
Ich hab schon diverses versucht, aber das meiste braucht ein Bitmap zum ausdrucken, das ich ja nicht habe, ebenso ist mir auch keine Kopieren in ein Bitmap gelungen, das ich danach StretchDraw'n könnte, um es dann zu drucken.
Ich hoffe ihr könnt mir hier auf die Sprünge helfen. Danke :)

Delphi-Quellcode:
procedure TFormKampf.BtnPrintClick(Sender: TObject);
var
PrintDialog : TPrintDialog;
i, breite, hoehe      : Integer;

begin

  PrintDialog := TPrintDialog.Create(self);
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;

    SetMapMode(Printer.Canvas.Handle,MM_ANISOTROPIC);
    breite := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE);
    hoehe := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE);

    ScrollBoxToCanvas(ScrollBox1,Printer.Canvas) ;

    Printer.EndDoc;
  end;
end;


procedure TFormKampf.ScrollBoxToCanvas(ScrollBox:TScrollBox; Canvas:TCanvas);
var saveY, Y, SchrittY:integer;
    saveX, X, SchrittX:integer;
    abbruchY, abbruchX:boolean;
    saveBorderStyle:TBorderStyle;
begin
  saveY:=ScrollBox.VertScrollBar.Position;
  saveX:=ScrollBox.HorzScrollBar.Position;
  saveBorderStyle:=ScrollBox.BorderStyle;

  ScrollBox.BorderStyle:=bsNone;
  ScrollBox.VertScrollBar.Position:=0;
  Y:=0;
  SchrittY:=ScrollBox.Height-100;
  repeat
    ScrollBox.HorzScrollBar.Position:=0;
    X:=0;
    SchrittX:=ScrollBox.Width-100;
    abbruchY:=(ScrollBox.VertScrollBar.Position <> Y);
    repeat
      abbruchX:=(ScrollBox.HorzScrollBar.Position <> X);
      ScrollBox.Refresh;
      ScrollBox.PaintTo(Canvas,ScrollBox.HorzScrollBar.Position,
                               ScrollBox.VertScrollBar.Position);
      ScrollBox.HorzScrollBar.Position:=ScrollBox.HorzScrollBar.Position + SchrittX;
      X:=X+SchrittX;
    until abbruchX;
    ScrollBox.VertScrollBar.Position:=ScrollBox.VertScrollBar.Position + SchrittY;
    Y:=Y+SchrittY;
  until abbruchY;

  ScrollBox.VertScrollBar.Position:=saveY;
  ScrollBox.HorzScrollBar.Position:=saveX;
  ScrollBox.BorderStyle:=saveBorderStyle;
end;

himitsu 27. Nov 2020 17:05

AW: Print Scrollbox in richtiger Größe
 
Vermutlich werden die Pixel 1:1 gemappt.
1 Pixel auf dem Bildschirm = 1 Pixel auf dem Drucker
und da der Drucker bestimmt eine wesentlich höhere DPI hat ...

Die Hilfe des Herstellers sagt, du solltest es beim MM_ANISOTROPIC mal mit SetWindowExtEx oder SetViewportExtEx versuchen.

Cordt 6. Dez 2020 12:48

AW: Print Scrollbox in richtiger Größe
 
Danke für die Antwort :)
Ich hab gerade ein anderes Projekt vorgezogen, daher liegt das gerade noch etwas unbearbeitet rum.

Leider kann ich mit deiner Antwort aber nicht viel anfangen. Ich hab mal gegooglet und auch mal versucht eine Doku zu finden, aber bisher konnte ich zu SetWindowExtEx oder SetViewportExtEx gar nichts finden. Vor allem nichts, was mir irgendwie weiter helfen würde...
Kannst du mir da vllt noch einen konkreteren Tipp geben? Vllt einen Fingerzeig zu der Doku, wo du das rausgenommen hast, oder ein Codeschnipsel? :oops:

Lg Cordt

Cordt 25. Jan 2021 20:23

AW: Print Scrollbox in richtiger Größe
 
Soo, ich bin jetzt wieder am Druckerproblem und stehe nach wie vor, wie der Ochs vorm Berg.

Kannst du mir die Hilfe mal verlinken? Dann versuch ich mich selbst daran, oder hast du noch einen konkreteren Tipp?
Ich hab schon dutzende Seiten zu dem Thema durchgeschaut und echt vieles versucht...

himitsu 26. Jan 2021 19:11

AW: Print Scrollbox in richtiger Größe
 
MSDN-Library durchsuchenMM_ANISOTROPIC
https://docs.microsoft.com/en-us/win...gdi-setmapmode

Im Prinzip geben diese APIs ein Mapping an, wie die Pixel von deinem Canvas auf den Pixeln des Devices dargestellt werden sollen.
z.B. MM_LOMETRIC wäre 10 Pixel je 1 Millimeter (mit den DPI, für das Devices)



Alternativ könntest du auf ein TBitmap-Canvas zeichnen und dieses dann via StretchDraw auf Canvas des Printers malen.

Cordt 27. Jan 2021 08:25

AW: Print Scrollbox in richtiger Größe
 
Okay, vielen Dank, mit dem Link bin ich tatsächlich durchgekommen und kann jetzt sichtbar drucken.
Ich werde noch mit ein paar anderen Drucken rumexperimentieren, vllt muss ich das noch ein wenig fein-tunen, aber damit kann ich zumindest mal arbeiten.
Danke vielmals

Delphi-Quellcode:
var
PrintDialog : TPrintDialog;
begin
  PrintDialog := TPrintDialog.Create(self);
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;

    SetGraphicsMode(Printer.Canvas.Handle, GM_ADVANCED);
    SetMapMode(Printer.Canvas.Handle,MM_ANISOTROPIC);        

    SetViewportExtEx(Printer.Canvas.Handle, 5,5, nil);

    ScrollBoxToCanvas(ScrollBox1,Printer.Canvas) ;
    Printer.EndDoc;
  end;
end;

procedure TFormKampf.ScrollBoxToCanvas(ScrollBox:TScrollBox; Canvas:TCanvas);
var saveY, Y, SchrittY:integer;
    saveX, X, SchrittX:integer;
    abbruchY, abbruchX:boolean;
    saveBorderStyle:TBorderStyle;
begin
  saveY:=ScrollBox.VertScrollBar.Position;
  saveX:=ScrollBox.HorzScrollBar.Position;
  saveBorderStyle:=ScrollBox.BorderStyle;

  ScrollBox.BorderStyle:=bsNone;
  ScrollBox.VertScrollBar.Position:=0;
  Y:=0;
  SchrittY:=ScrollBox.Height-100;
  repeat
    ScrollBox.HorzScrollBar.Position:=0;
    X:=0;
    SchrittX:=ScrollBox.Width-100;
    abbruchY:=(ScrollBox.VertScrollBar.Position <> Y);
    repeat
      abbruchX:=(ScrollBox.HorzScrollBar.Position <> X);
      ScrollBox.Refresh;
      ScrollBox.PaintTo(Canvas,ScrollBox.HorzScrollBar.Position,
                               ScrollBox.VertScrollBar.Position);
      ScrollBox.HorzScrollBar.Position:=ScrollBox.HorzScrollBar.Position + SchrittX;
      X:=X+SchrittX;
    until abbruchX;
    ScrollBox.VertScrollBar.Position:=ScrollBox.VertScrollBar.Position + SchrittY;
    Y:=Y+SchrittY;
  until abbruchY;
  ScrollBox.VertScrollBar.Position:=saveY;
  ScrollBox.HorzScrollBar.Position:=saveX;
  ScrollBox.BorderStyle:=saveBorderStyle;
end;

Cordt 8. Feb 2021 22:14

AW: Print Scrollbox in richtiger Größe
 
Zitat:

Zitat von Cordt (Beitrag 1481597)
Okay, vielen Dank, mit dem Link bin ich tatsächlich durchgekommen und kann jetzt sichtbar drucken.
Ich werde noch mit ein paar anderen Drucken rumexperimentieren, vllt muss ich das noch ein wenig fein-tunen, aber damit kann ich zumindest mal arbeiten.
Danke vielmals

Delphi-Quellcode:
var
PrintDialog : TPrintDialog;
begin
  PrintDialog := TPrintDialog.Create(self);
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;

    SetGraphicsMode(Printer.Canvas.Handle, GM_ADVANCED);
    SetMapMode(Printer.Canvas.Handle,MM_ANISOTROPIC);        
//Markiert
    SetViewportExtEx(Printer.Canvas.Handle, 5,5, nil);

    ScrollBoxToCanvas(ScrollBox1,Printer.Canvas) ;
    Printer.EndDoc;
  end;
end;


Es ist natürlich sinnvoller, wenn das auf mehr als dem hauseigenen Drucker funktioniert. Dazu habe ich an oben "//Markierter" Stelle folgendes ergänzt
Delphi-Quellcode:
      cxpage := GetDeviceCaps(Printer.Canvas.Handle, HORZRES);
      cypage := GetDeviceCaps(Printer.Canvas.Handle, VERTRES);

      SetWindowExtEx(Printer.Canvas.Handle, 963, 1346, nil);
      SetViewportExtEx(Printer.Canvas.Handle, cxpage,cypage, nil);
Das SetWindowExtEx bekommt die Größe des Elements (in dem Fall der Scrollbox) mit und SetViewportExtEx die Werte, die der Drucker selbst liefert.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz