![]() |
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; |
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. |
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 |
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... |
AW: Print Scrollbox in richtiger Größe
![]() ![]() 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. |
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; |
AW: Print Scrollbox in richtiger Größe
Zitat:
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:
Das SetWindowExtEx bekommt die Größe des Elements (in dem Fall der Scrollbox) mit und SetViewportExtEx die Werte, die der Drucker selbst liefert.
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); Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz