AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Print Scrollbox in richtiger Größe

Print Scrollbox in richtiger Größe

Ein Thema von Cordt · begonnen am 27. Nov 2020 · letzter Beitrag vom 8. Feb 2021
Antwort Antwort
Cordt

Registriert seit: 10. Jan 2013
28 Beiträge
 
#1

Print Scrollbox in richtiger Größe

  Alt 27. Nov 2020, 17:58
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.926 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Print Scrollbox in richtiger Größe

  Alt 27. Nov 2020, 18:05
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
28 Beiträge
 
#3

AW: Print Scrollbox in richtiger Größe

  Alt 6. Dez 2020, 13:48
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?

Lg Cordt
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
28 Beiträge
 
#4

AW: Print Scrollbox in richtiger Größe

  Alt 25. Jan 2021, 21:23
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.926 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Print Scrollbox in richtiger Größe

  Alt 26. Jan 2021, 20:11
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (26. Jan 2021 um 20:23 Uhr)
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
28 Beiträge
 
#6

AW: Print Scrollbox in richtiger Größe

  Alt 27. Jan 2021, 09:25
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;
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
28 Beiträge
 
#7

AW: Print Scrollbox in richtiger Größe

  Alt 8. Feb 2021, 23:14
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ß
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf