Einfach eine Hardcopy auf den Standarddrucker?

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Einfach eine Hardcopy auf den Standarddrucker?

Beitrag von Christof »

Hi,

Hat jemand eine kurze Anleitung oder einen entsprechenden Code, der das aktuelle Fenster auf dem Standard-Drucker ausgibt (Hardcopy)?

Wieder einmal habe ich eine übersichtliche Eingabeseite programmiert, die die Programmeinstellungen übernimmt und abspeichert. Läuft in einem eigenen Fenster und funktioniert einwandfrei.

Nun möchte ich dem Anwender die Möglichkeit bieten, auf Knopfdruck (Button) eine Hardcopy auf dem Standarddrucker auszugeben. Ich möchte mir einfach die Arbeit sparen, jetzt auch auch noch eine Druckerausgabe zu programmieren, die dann vielleicht einmal in 5 Jahren genutzt wird. Für den Zweck spielt es keine Rolle, dass da auch ein paar Buttons mitgedruckt werden.

Danke für alle Hinweise, Tipps und Hilfen.

Viele Grüße

Christof
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,

versuche es hiermit mal:

Code: Alles auswählen

#include "dll.ch"

#define KEYEVENTF_KEYUP 0x02
#define VK_MENU     0x12
#define VK_SNAPSHOT 0x2C
PROC main
LOCAL nWindow := 1
   // 0 is entire screen, 1 is active window
    wait "Press any key to copy the"+STR(nWindow)+" screen"
    keybd_event(VK_SNAPSHOT, nWindow, 0, 0) 

    wait "Press any key to copy the focused window"
    keybd_event(VK_MENU, 0, 0, 0)
    keybd_event(VK_SNAPSHOT, 0, 0, 0)
    keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)
    wait
RETURN

DLLFUNCTION keybd_event(mvkey, nscan, flags, xtra) USING STDCALL FROM USER32.DLL
ansonsten mal die PrintScreen Class von Joe Carrick ansehen.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jimmy,

bedeuted das, dass Windows in der USER32.DLL eine Hardcopy Funktion eingebaut hat ?
Ich hatte dafür mal ein kleines Tool (ging auf jedem Fenster) das Hardcopy hies ...
Gruß
Hubert
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Beitrag von Christof »

Hi Jimmy,

danke für den Hinweis. Ich hab's ausprobiert. Wird damit nur der Tastendruck "Druck" bzw. "ALT+Druck" weitergeleitet?

Ich habe auch ein Hardcopy-Programm laufen. Wenn ich jetzt Deine Proc im Programm anstoße, wird das Hardcopy-Programm aufgerufen und das aktuelle Fenster zum Druck angeboten. Soweit i.O.

Schalte ich das Hardcopy-Programm aus (Programm heißt 'PrintKey'), passiert nix! Ist der Bildschirm dann in der Zwischenablage (hab' ich noch nicht ausprobiert)?

Gruß

Christof
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: bedeuted das, dass Windows in der USER32.DLL eine Hardcopy Funktion eingebaut hat ?
Nein, ich hab da wohl nicht ganz richtig gelesen und war mehr bei den
"Keys" als beim "drucken"
Christof hat geschrieben: Wird damit nur der Tastendruck "Druck" bzw. "ALT+Druck" weitergeleitet?
Ja, wie ich schon sagte war ich mehr bei den "Keys" als beim "Druck".

Hier nun die Antwort (rundimentär) auf deine "Druck" Frage.

gruss by OHR
Jimmy

Code: Alles auswählen

PROCEDURE PrtClip
LOCAL oClipboard := XbpClipboard():new():create()
...
   oClipBoard:open()
   aFormats := oClipBoard:queryFormats()
   IF AScan( aFormats, XBPCLPBRD_BITMAP ) > 0
      oBitmap := oClipBoard:getBuffer( XBPCLPBRD_BITMAP )
      PrtClipB(oBitmap)
...
RETURN

FUNCTION PrtClipB(oBitMap)
LOCAL oPrinterPS, oSourcePS
LOCAL aPaperSize
LOCAL oBmp
LOCAL aRect := {0,0,oBitmap:xsize,oBitmap:ySize}
LOCAL lRet := .F.

   oSourcePS := SetAppWindow():lockPS()
   // use your PrinterPS()
   oPrinterPS := PrinterPS()

   IF oPrinterPS<>NIL
      // PaperSize vs. Bitmap aRect
      aPaperSize := oPrinterPS:device():paperSize()

      oPrinterPS:device():startdoc()
      oBitmap:draw(oPrinterPS,aRect)
      oPrinterPS:device():enddoc()
      lRet := .T.
      oPrinterPS:destroy()
   ENDIF
RETURN lRet
Antworten