![]() |
Druckervorschau
Hallo,
ich habe eine DruckProcedure geschrieben, die dem Drucker über printer.canvas "Daten" übermittelt. Bevor der Druck jedoch beginnt hätte ich noch gern ein Fenster mit dem Seiteninhalt, der anschließend gedruckt wird, angezeigt. Kann ich dafür irgendwie die Daten vom printer.canvas verwenden, oder muss ich das ganze noch mal für eine andere Komponente schreiben? Meine erste Idee war, die Daten von printer.canvas in eine PaintBox zu laden doch bei
Delphi-Quellcode:
kommt der Fehler:
paint.Canvas. := printer.canvas;
Zitat:
|
Re: Druckervorschau
Soweit ich mich erinnere hat ein Canvas auch noch die Eigenschaft "Pixels[x,y]", mit der man jeden Pixel einzeln ansprechen kann. Eventuell könnte man damit eine Vorschau erzeugen, dass man x und y in einer (For-)Schleife durchlaufenlässt und die pixel einzeln kopiert.
(Ich weiß, dass das relativ langsam sein wird, aber es ist erstmal ein Ansatz.) MfG Binärbaum |
Re: Druckervorschau
Hi,
keine Ahnung, ob's funktioniert, aber TCanvas besitzt die Methode ![]() edit: Schau Dir mal ![]() Gruß Stephan :dance: |
Re: Druckervorschau
Oder über das Handle der Canvas-Objekte direkt mit den Funktionen der WinAPI mit BitBlt oder StretchBlt. Siehe dazu dann sonst im MSDN nach.
|
Re: Druckervorschau
Hallo,
Zitat:
Zitat:
Zitat:
|
Re: Druckervorschau
Wenn man auch lesend auf das Canvas des TPrinter Objektes zugreifen kann, wovon ich mal ausgehe, sollte das schon gehen. Theoretisch sollte das in etwa so aussehen, wenn du z.Bsp. auf das TForm-Objekt Form1 zeichnen willst:
Delphi-Quellcode:
Sofern dein Canvas Objekt natürlich die notwendige Breite und Höhe besitzt sollte das meines Erachtens gehen.
BitBlt(Form1.Canvas.Handle, 0, 0, breite, hoehe, printer.Canvas.Handle, 0, 0, SRCCOPY);
|
Re: Druckervorschau
hallo,
der Code funktioniert aber nicht: Es kommt eine Fehlermeldung, dass die beiden Canvas nicht zueinander kompatiebel sind :wall: Hat da jemand noch eine Idee? |
Re: Druckervorschau
Nur mal so eine Idee: man könnte statt der Paintbox auch ein extra Formular erstellen, auf dessen Canvas dann die Vorschau angezeigt wird.
MfG Binärbaum |
Re: Druckervorschau
Hallo!
Das mit auf einer Form zeichnen ändert in diesem Falle nichts, da das Canvas des TPrinter Objekts ein anderes Format hat. Wennn es überhaupt geht, muss man wahrscheinlich das ganze in etwa so lösen:
Delphi-Quellcode:
Sicher bin ich mir dabei jetzt aber nicht, da ich das ganze gerade nicht in Delphi testen kann. Aber vielleicht guckt ja hier noch jemand rein, der etwas vesierter mit den GDI Funktionen ist. Ansonsten würde ich eine Druckfunktion erstellen, die ein TCanvas als Parameter übernimmt und dann auf diesem alles ausgibt. Dann ruft man diese zuerst mit dem Canvas der Druckvorschau auf und anschließend wenn der Nutzer OK drückt eben mit dem Printer-Canvas. Da sollte man aber natürlich nicht vergessen dann BeginDoc und EndDoc aufzurufen.
var
h_DC, hdc_mem, temp : HDC; begin h_DC := GetDC(Form1.Handle); hdc_mem := CreateCompatibleDC(h_DC); temp := SelectObject(hdc_mem, Printer.Canvas.Handle); BitBlt(h_DC, 0, 0, Breite, Hoehe, hdc_mem, 0, 0, SRCCOPY); SelectObject(hdc_mem, temp); DeleteDC(hdc_mem); ReleaseDC(Form1.Handle, h_DC); |
Re: Druckervorschau
Moin, Teetimemoin,
also ich denke, dass es aufgrund der doch sehr unterschiedlichen Auflösungen von Bildschirm zu Drucker ziemlich sinnlos ist, den Druckercanvas fürdie Bildschirmanzeige herunterzurechnen. Denke Du solltest den Druck auf zwei Canvas mit unterschiedlicherAuflösung drucken. Einen für den Bildschirm,einen für den Ausdruck. Das Verfahren gibt es praktisch bei ![]() Etwas Einarbeitungszeit braucht man dafür aber auch.. Grüße // Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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 by Thomas Breitkreuz