Druckvorschau möglich?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Druckvorschau möglich?

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Druckvorschau möglich?

Beitrag von Bisonte »

Nur mal so aus der Luft gegriffen :

Alle "Zeichenoperationen" die zum Drucker geschickt werden, auf ein Image ausführen und dieses anzeigen... ?
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Druckvorschau möglich?

Beitrag 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
Zuletzt geändert von udg am 26.06.2016 23:52, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Druckvorschau möglich?

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Druckvorschau möglich?

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Druckvorschau möglich?

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Druckvorschau möglich?

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Druckvorschau möglich?

Beitrag 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
Bild
Ramihyn_
Beiträge: 61
Registriert: 20.06.2007 10:56

Re: Druckvorschau möglich?

Beitrag 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 ;)
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Druckvorschau möglich?

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten