Seite 1 von 2
Druckvorschau möglich?
Verfasst: 26.06.2016 01:08
von udg
Hallo,
Zzt. Schreibe ich ein kleines Programm welches eine Grafik als Hintergrund hat die das komplette Window ausfüllt, A6 quer.
Über der Grafik habe ich StringGadgets die ausgefüllt werden können.
Unter der A6 Grafik habe ich 2 Button. Mit dem einen kann man die Eingaben löschen und mit dem anderen wird der PrinterRequester aufgerufen, sodass ich den entsprechenden Drucker auswählen kann.
Was mir leider noch fehlt ist eine Druckvorschau die mir die Hintergrundgrafik plus meine Eingaben anzeigt bevor ich das Ganze zum Drucker schicken möchte um Eingaben auf Richtigkeit noch einmal prüfen zu können.
Wie muss ich vorgehen, dass nur der A6 Grafikbereich inkl. meiner Eingaben ohne der darunter befindlichen Buttons in einer Druckvorschau angezeigt wird um schließlich dann drucken zu können? Natürlich in der richtigen Größe: 14,8cm X 10,5cm
Danke Euch
Grüße
Re: Druckvorschau möglich?
Verfasst: 26.06.2016 10:43
von Bisonte
Nur mal so aus der Luft gegriffen :
Alle "Zeichenoperationen" die zum Drucker geschickt werden, auf ein Image ausführen und dieses anzeigen... ?
Re: Druckvorschau möglich?
Verfasst: 26.06.2016 14:41
von udg
Okay. als preview sollte das ausreichen. Den Inhalt einfach 1:1 aus dem Tool entnehmen und in einem Fenster vor Druck anzeigen lassen.
ansonsten wird der Inhalt ja schon zum Drucker geschickt (also auch ohne Vorschau, das passt soweit).
Ich brauch nun eine Druckvorschau in der angezeigt wird was zum Drucker geschickt wird, wie man sie zB. aus einem Grafikprogramm oÄ. usw. kennt. Was ich vergessen habe zu erwähnen:
Wenn ich den Button Drucken anklick, soll es das Hintergrundbild aus der Druckvorschau nicht mit drucken sondern nur die Eingaben die ich im Programm vorher gemacht habe.
Das Hintergrundbild muss zur Orientierung wärend der Eingabe dienen.
Man füllt ein Formular aus.
Grüße
Re: Druckvorschau möglich?
Verfasst: 26.06.2016 18:59
von Sicro
Hier ein Code-Schnipsel aus einem altem Programm von mir:
Code: Alles auswählen
Procedure.i CreateScreenshotFromWindow(Window)
Protected Image, Drawing
; Bild erstellen, das der gleichen Größe entspricht, wie das Fenster
Image = CreateImage(#PB_Any, WindowWidth(Window, #PB_Window_FrameCoordinate), WindowHeight(Window, #PB_Window_FrameCoordinate))
If Image = 0 : ProcedureReturn #False : EndIf
Drawing = StartDrawing(ImageOutput(0))
If Drawing = 0
FreeImage(Image)
ProcedureReturn #False
EndIf
; Fensterinhalt in das Bild malen
BitBlt_(Drawing, 0, 0, ImageWidth(Image), ImageHeight(Image), GetWindowDC_(WindowID(Window)), 0, 0, #SRCCOPY | #SRCPAINT)
StopDrawing()
ProcedureReturn Image
EndProcedure
#Window_Main = 0
OpenWindow(#Window_Main, ...)
...
Define Image = CreateScreenshotFromWindow(#Window_Main)
If Image
SaveImage(Image, ...)
EndIf
Der müsste dich schon mal weiterbringen.
Re: Druckvorschau möglich?
Verfasst: 26.06.2016 23:27
von udg
Danke dir für das Beispiel. Ich hab den Code Snip noch nicht getestet. Beim überfliegen, wenn ich es richtig erfasse :
Es wird vom Fensterinhalt ein Snapshot gemacht. Den ich wohl dann speichern kann? (kann ich ja auch weglassen)
Bei einem Screenshot wird der verwendete System Font in eine Grafik gespeichert. Das Tool muss mit einem Nadeldrucker kommunizieren. Benötige also den Mono Font und keine Grafik.
Werde die Prozedur morgen mal einbauen und testen.
Bis dahin besten Dank.
Re: Druckvorschau möglich?
Verfasst: 02.07.2016 11:43
von Sicro
udg hat geschrieben:Es wird vom Fensterinhalt ein Snapshot gemacht. Den ich wohl dann speichern kann? (kann ich ja auch weglassen)
Genau. Mit dem SaveImage() wollte ich nur klarstellen, dass du den Screenshot einfach mit den PB-Funktionen bearbeiten kannst.
udg hat geschrieben:Bei einem Screenshot wird der verwendete System Font in eine Grafik gespeichert. Das Tool muss mit einem Nadeldrucker kommunizieren. Benötige also den Mono Font und keine Grafik.
Du hast geschrieben, dass du die Druckfunktion bereits hast und noch eine Druckvorschau benötigst, die das Formular und die Eingaben anzeigt.
Mein Code ist eine Umsetzung deiner Aussage:
udg hat geschrieben:Den Inhalt einfach 1:1 aus dem Tool entnehmen
Besser wäre es, wenn du das Formular, das du bereits in das Fenster als Hintergrund malst, in ein Image malst und - wie Bisonte geschrieben hat - die Texteingaben per DrawText in das Image einfügst. Als Ergebnis hast du nun ein Image mit dem Formular als Hintergrund und den getätigten Texteingaben - also so wie es später auf deinem Ausdruck aussehen würde.
Re: Druckvorschau möglich?
Verfasst: 02.07.2016 13:49
von udg
udg hat geschrieben:Bei einem Screenshot wird der verwendete System Font in eine Grafik gespeichert. Das Tool muss mit einem Nadeldrucker kommunizieren. Benötige also den Mono Font und keine Grafik.
Sicro hat geschrieben:Du hast geschrieben, dass du die Druckfunktion bereits hast und noch eine Druckvorschau benötigst, die das Formular und die Eingaben anzeigt.
Genau, ich brauch nur noch eine Druckvorschau. Bin noch nicht dazu gekommen am Code weiter zu arbeiten. Aber das bekomm ich schon hin
Wie der Drucker dann interpretiert werde ich bei einem Probedruck sehen. Ich mach Meldung.
Danke Dir.
Re: Druckvorschau möglich?
Verfasst: 03.07.2016 13:59
von DarkSoul
Das gesamte Vorgehen finde ich hässlich. Das Aussehen eines Fensters kann der User durch Systemeinstellungen beeinflussen. Dies wirkt sich auch auf deinen Druck aus.
Vermutlich würde die Screenshotmethode ohnehin versagen, wenn das Fenster überlagert oder abgeschnitten dargestellt wird, weil es zu sehr an den Rand verschoben wurde.
Wäre es nicht so besser (anstatt das ganze Fenster zu drucken)?
1. Eine Kopie vom Bild erstellen, welches als Hintergrund dient.
2. Die Eingaben aus den StringGadgets entnehmen und auf Eingabefehler überprüfen.
3. Mittels DrawText die Texte mit definierter Schrift an die entsprechenden auf die Bildkopie setzen.
4. Das Ergebnis ausdrucken.
Ansonsten ist hier ein Ansatz, wie man das mit der Vorschau lösen könnte (allerdings ungetestet und muss für die Bedürfnisse deines Programms ergänzt werden. Daher als Pseudocode betrachten):
Code: Alles auswählen
p = DefaultPrinter() ;Meinetwegen auch PrintRequester()
w = PrinterPageWidth()
h = PrinterPageHeight()
a = 0
exit = 0
;Prerendering
Dim pages(printPageCount)
For a = 0 To printPageCount -1
pages(a) = CreateImage(#PB_Any, w, h, 24, $ffffff)
StartDrawing(ImageOutput(pages(a)))
;hier Content rendern
StopDrawing()
Next a
;Hier Vorschaufenster öffnen und die Bilder aus pages() dort anzeigen. Dem User anbieten, es so zu drucken, wie es ist oder den Vorgang abzubrechen
;Fensterloop für Vorschaufenster
Repeat
event = WaitWindowEvent()
If userClickedOK ;wie auch immer userClickedOK zustandekommt
StartPrinting("myPrintJob")
StartDrawing(PrinterOutput(p))
For a = 0 To printPageCount - 1
DrawImage(ImageID(pages(a)),0,0)
If a < printPageCount - 1
NewPrinterPage()
EndIf
Next a
StopDrawing()
StopPrinting()
exit = 1
EndIf
Until exit = 1
;FreeImage() usw.. hier
Re: Druckvorschau möglich?
Verfasst: 07.07.2016 10:22
von Ramihyn_
Nur mal so als Anmerkung - Drucker haben locker 600-1200 oder gar 2400-4800 dpi - ein Bildschirm hat weit weniger, im Bereich vom 75-225 (üblicherweise).
Ich weiss ja nicht um welche Inhalte es geht, aber wenn die Ausdrucke qualitativ was taugen sollen, sollte man nicht vom screenshot->drucker gehen, denn damit würde man niedrige qualität erzeugen und auf auf hohe Auflösung ausgegeben (ergebniss wäre dann viel schlechter als möglich). Qualitativ sollte man eher hohe qualität auf niedrige Qualität umrechnen, als umgekehrt. Die einfache Lösung wäre also eine Bitmap in hoher Qualität des Druckers in den Speicher zu erzeugen und dann herunterzurechnen um es als vorschau anzuzeigen (vorteil wäre dann auch, dass die vorschau ziemlich exakt der ausgabe entspricht).
Dann hätte man auch das Problem leicht unterschiedlicher Darstellung von Schriftarten bei manchen Druckern nicht mehr. Es kostet natürlich etwas mehr Speicher wegen der höheren Druckerauflösung.
ps: eine mögliche alternative, wäre es die druckerausgabe in eine datei erzeugen (virtueller xps drucker oder sowas) und dann diese Datei einlesen und in eine bitmap rendern und diese als vorschau anzeigen. Aber da ich es selber noch nicht gemacht habe auf die Weise, weiss ich nicht wie aufwändig oder praktikabel es wäre. Es könnte auch in einer Flut von Problemen über unterschiedliche Installationen bis hin zum aufwändigen rendering enden

Re: Druckvorschau möglich?
Verfasst: 07.07.2016 15:48
von udg
Ramihyn_ hat geschrieben:Nur mal so als Anmerkung - Drucker haben locker 600-1200 oder gar 2400-4800 dpi - ein Bildschirm hat weit weniger, im Bereich vom 75-225 (üblicherweise).
Ich weiss ja nicht um welche Inhalte es geht, aber wenn die Ausdrucke qualitativ was taugen sollen, sollte man nicht vom screenshot->drucker gehen, denn damit würde man niedrige qualität erzeugen und auf auf hohe Auflösung ausgegeben (ergebniss wäre dann viel schlechter als möglich). Qualitativ sollte man eher hohe qualität auf niedrige Qualität umrechnen, als umgekehrt.
Ich hatte erwähnt, Formulareinträge sollen mit einem Nadeldrucker (Monofont des Druckers) ausgedruckt werden. Es geht hier nicht um hochwertige Qualitätsausdrucke
Ansonsten liest sich dein Vorschlag sehr abenteuerlich

aber danke für deine Info.
Am Wochenende arbeite ich weiter daran.
Grüße