Seite 1 von 2

Drucken, Bildschirm drucken

Verfasst: 26.01.2013 22:15
von Kallewirsch
Hallo zusammen,

bin seit langem mal wieder am rumprobieren mit PureBasic. :D

Mal ne Frage an euch:

wie kann ich z.B. den angezeigten Bildschirm ausdrucken? den Schalter zum drucken bekomme ich schon hin.... aber wie sage ich dem ....drucke das was auf dem Bildschirm zu sehen ist......



VIELEN DANK für eure Hilfe
Gruß

Re: Drucken, Bildschirm drucken

Verfasst: 27.01.2013 11:50
von dysti
Hallo Kallewirsch,
auch eine Auszeit seit 2010 genommen.
Ok.
Hier habe ich was für dich:
http://www.osdever.net/bkerndev/Docs/printing.htm

Meine Idee wäre, die "Drucktaste" zu emilieren und den Zwischenspeicher auszulesen.
Das geht ja alles mit PB-Bordmitteln.

Re: Drucken, Bildschirm drucken

Verfasst: 30.01.2013 09:04
von dysti
Vielleicht hilft das ja weiter:

Code: Alles auswählen

UseJPEGImageEncoder() 

Procedure MakeScreenshotForegroundWindow() 
    hWnd=GetForegroundWindow_() 
    GetWindowRect_(hWnd, WindowSize.RECT) 
    Width=WindowSize\Right - WindowSize\Left 
    Height=WindowSize\Bottom - WindowSize\Top 
    hImage = CreateImage(#PB_Any,Width,Height) 
    hDC    = StartDrawing(ImageOutput(hImage)) 
    WndDC  = GetWindowDC_(hWnd) 
    BitBlt_(hDC,0,0,Width,Height,WndDC,0,0,#SRCCOPY) 
    StopDrawing() 
    ReleaseDC_(hWnd,WndDC) 
    ProcedureReturn hImage 
  EndProcedure 
  

  SaveImage(MakeScreenshotForegroundWindow(), "PB_Test_image0.jpg",#PB_ImagePlugin_JPEG ) 

Re: Drucken, Bildschirm drucken

Verfasst: 01.02.2013 18:54
von Kallewirsch
Schon mal vielen Dank!

Re: Drucken, Bildschirm drucken

Verfasst: 10.02.2013 17:30
von Kallewirsch
Hallo an alle,

@dysti
hab deinen Code mal ausprobiert und bin daraufhin auf einen anderen Code gestoßen der schon fast das ist was ich suche.

Code: Alles auswählen

; German forum:
; Author: Redzack (updated for PB4.00 by blbltheworm)
; Date: 31. December 2002
; OS: Windows
; Demo: No


; Capture desktop area and print via WinAPI
; Desktop Ausschnitt "Capturen" und drucken mit WinApi


#WindowWidth  = 700
#WindowHeight = 600

hWnd.l = OpenWindow(0, 100, 120, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)

If hWnd
 
  hBmp.l       = CreateImage(0,2000,2000)
  hdcWnd.l     = GetDC_(hWnd)
  hDektop.l    = GetDesktopWindow_()
  hdcDesktop.l = GetDC_(hdcDesktop)
  hdcBmp.l     = CreateCompatibleDC_(hdcWnd)
 
  SelectObject_(hdcBmp,hBmp)

  ; Dektopausschnitt in das Image kopieren und gleich vergr?ern.
 
  StretchBlt_(hdcBmp,0,0,ImageWidth(0) ,ImageHeight(0) ,hdcDesktop,0,0,100,100,#SRCCOPY)

  If PrintRequester()

    If StartPrinting("Print")
 
      If StartDrawing(PrinterOutput())

        DrawImage(ImageID(0), 0, 0)
       
        StopDrawing()
   
      EndIf


   
      StopPrinting()
 
    EndIf
 
  EndIf
 
  Repeat

    EventID = WaitWindowEvent()

  Until EventID = #PB_Event_CloseWindow

EndIf
DeleteDC_(hdcBmp)
FreeImage(0)
End 

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
In diesem Prg wird ein screenshot gemacht und vergrößert gedruckt.

Kann mir jemand sagen was ich ändern muss damit nicht vergrößert gedruckt wird?

Und kann mir mal jemand erklären was hier gemacht wird? Ich kenne diese z.B. hdcWnd.l / CreateCompatibleDC_(hdcWnd) / StretchBlt_ blablabla......#SRCCOPY...usw. nicht. Finde leider auch in der Hilfe nichts dazu.

Wäre super wenn mir vielleicht jemand im Code ein paar Bemerkungen dazu schreiben könnte.

schon mal herzlichen Dank
Gruß
Kallewirsch

Re: Drucken, Bildschirm drucken

Verfasst: 10.02.2013 18:33
von dysti
Hier hast du die Erklärung zu dem Befehl:
Die Funktion kopiert StretchBlt ein Bitmap aus einer Quelle in ein Rechteck Zielrechteck, Dehnen oder Komprimieren der Bitmap, um die Abmessungen des Zielrechtecks ​​passen, wenn nötig. Das System dehnt oder komprimiert das Bitmap nach der Streckschwingung derzeit im Zielgerät Kontext gesetzt.
Syntax
C + +

BOOL StretchBlt (
_In_ HDC hdcDest,
_In_ Int nXOriginDest,
_In_ Int nYOriginDest,
_In_ Int nWidthDest,
_In_ Int nHeightDest,
_In_ HDC hdcSrc,
_In_ Int nXOriginSrc,
_In_ Int nYOriginSrc,
_In_ Int nWidthSrc,
_In_ Int nHeightSrc,
_In_ DWORD dwRop
);

Parameter
hdcDest [in]
Ein Griff zum Zielgerät Kontext.
nXOriginDest [in]
Die x-Koordinate, in logischen Einheiten, von der oberen linken Ecke des Zielrechtecks.
nYOriginDest [in]
Die y-Koordinate in logischen Einheiten, von der oberen linken Ecke des Zielrechtecks.
nWidthDest [in]
Die Breite, in logische Einheiten des Zielrechtecks.
nHeightDest [in]
Die Höhe, in logische Einheiten des Zielrechtecks.
hdcSrc [in]
Ein Handgriff zu der Quellvorrichtung Kontext.
nXOriginSrc [in]
Die x-Koordinate, in logischen Einheiten, von der oberen linken Ecke des Quellrechtecks.
nYOriginSrc [in]
Die y-Koordinate in logischen Einheiten, von der oberen linken Ecke des Quellrechtecks.
nWidthSrc [in]
Die Breite, in logische Einheiten des Quellrechtecks.
nHeightSrc [in]
Die Höhe, in logische Einheiten des Quellrechtecks.
dwRop [in]
Die Raster-Operation durchgeführt werden soll. Raster Operation Codes definieren, wie das System Farben in Output-Operationen, die einen Pinsel, einen Quell-Bitmap und eine Ziel-Bitmap beinhalten kombiniert.
Siehe BitBlt für eine Liste von gemeinsamen Raster Operation Codes (ROPs). Beachten Sie, dass die CAPTUREBLT ROP in der Regel nicht für Druckvorrichtung Kontexten verwendet werden.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.
Wenn die Funktion fehlschlägt, ist der Rückgabewert null.
Bemerkungen
StretchBlt streckt oder staucht die Quelle Bitmap im Speicher und kopiert dann das Ergebnis an den Zielrechtecks. Dies kann entweder eine Bitmap kompatible Bitmap (DDB) oder den mit einer sein CreateDIBSection . Die Farbdaten für Muster oder Zielpixel nach der Dehnung oder Stauchung auftritt verschmolzen.
Wenn ein Enhanced Metafile aufgenommen wird, tritt ein Fehler auf (und die Funktion gibt FALSE), wenn das Quellgerät Rahmen kennzeichnet eine Enhanced-Metadatei Gerät Kontext.
Wenn der angegebene Rasteroperation erfordert eine Bürste, verwendet das System die Bürste gegenwärtig in die Zielgerätekontext ausgewählt.
Die Zielkoordinaten unter Verwendung der Transformation derzeit für die Zielvorrichtung spezifizierten Kontext transformiert; die Quellenkoordinaten werden mithilfe der Transformation derzeit für die Quellenvorrichtung spezifizierten Kontext transformiert.
Wenn die Quelle Transformation hat eine Drehung oder Scherung, tritt ein Fehler auf.
Wenn das Ziel, Quelle und Muster Bitmaps nicht die gleiche Farbe haben Format, wandelt StretchBlt die Quell-und Muster-Bitmaps, die Ziel-Bitmap entsprechen.
Wenn StretchBlt muss ein monochromes Bitmap in einer Farb-Bitmap zu konvertieren, setzt es weiße Bits (1) auf die Hintergrundfarbe schwarz und Bits (0) zu der Vordergrundfarbe. Um eine Farbe Bitmap in einer monochromen Bitmap konvertieren, legt es Pixel, die die Hintergrundfarbe passen auf Weiß (1) und setzt alle anderen Pixel in Schwarz (0). Die Vorder-und Hintergrundfarben des Gerätes Zusammenhang mit Farbe verwendet werden.
StretchBlt erzeugt ein Spiegelbild einer Bitmap, wenn die Vorzeichen der nWidthSrc und nWidthDest Parameter oder wenn der nHeightSrc und nHeightDest Parameter unterscheiden. Wenn nWidthSrc und nWidthDest unterschiedliche Vorzeichen haben, erzeugt die Funktion ein Spiegelbild des Bitmap entlang der x-Achse. Wenn nHeightSrc und nHeightDest unterschiedliche Vorzeichen haben, erzeugt die Funktion ein Spiegelbild des Bitmap entlang der y-Achse.
Nicht alle Geräte unterstützen die Funktion StretchBlt. Weitere Informationen finden Sie in den GetDeviceCaps .
ICM: Kein Farbmanagement durchgeführt wird, wenn ein Blit auftritt.
Wenn in einer Multi-Monitor-System verwendet wird, muss sowohl hdcSrc und hdcDest auf dem gleichen Gerät beziehen oder die Funktion fehl. Um Daten zwischen DCs für verschiedene Geräte zu übertragen, konvertieren Sie die Speicher-Bitmap zu einem DIB indem GetDIBits . Um die DIB zu dem zweiten Gerät anzuzeigen, rufen SetDIBits oder StretchDIBits .
Und hier die Wirkungsweise bei einem direkten Scan:

Re: Drucken, Bildschirm drucken

Verfasst: 11.02.2013 01:23
von dysti
.....und hier die Lösung:

Code: Alles auswählen

EnableExplicit
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

UseJPEGImageEncoder()
UsePNGImageEncoder()

ExamineDesktops()

#image_0=0

Global Width.i  = DesktopWidth(0)
Global Height.i = DesktopHeight(0)

Procedure SavePicFile(hImage2)
  
  Define Filename$, ImageFormat, Extension$

        Filename$ = SaveFileRequester("Screenshot speichern", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 1)
          If Filename$
          
            Select SelectedFilePattern()
            
              Case 0  ; BMP
                ImageFormat = #PB_ImagePlugin_BMP
                Extension$  = "bmp"

              Case 1  ; JPEG
                ImageFormat = #PB_ImagePlugin_JPEG
                Extension$  = "jpg"
                
              Case 2  ; PNG
                ImageFormat = #PB_ImagePlugin_PNG
                Extension$  = "png"

            EndSelect
            
            If LCase(GetExtensionPart(Filename$)) <> Extension$
              Filename$ + "." + Extension$
            EndIf
            
            If SaveImage(hImage2, Filename$, ImageFormat)
                MessageRequester("Information", "Bild ist erfolgreich gesichert", 0)
            EndIf
          
          EndIf
       
          
        EndProcedure
        
Procedure PrintPicFile(hImage1)
          
        If PrintRequester()
          If StartPrinting("ScreenshotPrint")
            If StartDrawing(PrinterOutput())
              DrawImage(ImageID(hImage1), 0, 0)
              StopDrawing()
            EndIf
            StopPrinting()
          EndIf
        EndIf       
          
EndProcedure

Procedure MakeScreenshotWindow(pdruck.b=#False,large.b=#False) ; MakeScreenshotWindow(Drucken,Vergrößerung)
    
      Define hWnd.i,hImage.i,hdcWnd.i, hdcDesktop.i, hdcImage.i
      
      hWnd=GetForegroundWindow_()
      hImage=CreateImage(#image_0,Width*(large+1),Height*(large+1))
      hdcWnd=GetDC_(hWnd)
      hWnd=GetDesktopWindow_()
      hdcDesktop= GetDC_(hdcDesktop)
      hdcImage=CreateCompatibleDC_(hdcWnd)
      SelectObject_(hdcImage,hImage)
      StretchBlt_(hdcImage,0,0,Width*(large+1) ,Height*(large+1) ,hdcDesktop,0,0,Width ,Height,#SRCCOPY)
      If pdruck ; wenn 0 -> kein Ausgabe an den Drucker
        PrintPicFile(#image_0)
      Else
        SavePicFile(#image_0)
      EndIf
        
  EndProcedure 
  
  Delay(1000)
; MakeScreenshotWindow(Drucken,Vergrößerung)         Drucken=0 / Speichern=1
  MakeScreenshotWindow(0,0)
 

@TS-Soft, habe ich gemacht.

Re: Drucken, Bildschirm drucken

Verfasst: 11.02.2013 01:28
von ts-soft
@dysti
Langsam solltest Du Dir angewöhnen handles als Integer und nicht als Long zu deklarieren!

PS: EnableExplicit macht schön :mrgreen:

Re: Drucken, Bildschirm drucken

Verfasst: 11.02.2013 13:51
von dysti
@Kallewirsch, hier mit Fenster:

Code: Alles auswählen

EnableExplicit
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

UseJPEGImageEncoder()
UsePNGImageEncoder()

ExamineDesktops()

#image_0=0

Global Width.i  = DesktopWidth(0)
Global Height.i = DesktopHeight(0)
Define hWnd.i, EventID.i

#WindowWidth  = 700
#WindowHeight = 600

Procedure SavePicFile(hImage2)
  
  Define Filename$, ImageFormat, Extension$

        Filename$ = SaveFileRequester("Screenshot speichern", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 1)
          If Filename$
          
            Select SelectedFilePattern()
            
              Case 0  ; BMP
                ImageFormat = #PB_ImagePlugin_BMP
                Extension$  = "bmp"

              Case 1  ; JPEG
                ImageFormat = #PB_ImagePlugin_JPEG
                Extension$  = "jpg"
                
              Case 2  ; PNG
                ImageFormat = #PB_ImagePlugin_PNG
                Extension$  = "png"

            EndSelect
            
            If LCase(GetExtensionPart(Filename$)) <> Extension$
              Filename$ + "." + Extension$
            EndIf
            
            If SaveImage(hImage2, Filename$, ImageFormat)
                MessageRequester("Information", "Bild ist erfolgreich gesichert", 0)
            EndIf
          
          EndIf
       
          
        EndProcedure
        
Procedure PrintPicFile(hImage1)
          
        If PrintRequester()
          If StartPrinting("ScreenshotPrint")
            If StartDrawing(PrinterOutput())
              DrawImage(ImageID(hImage1), 0, 0)
              StopDrawing()
            EndIf
            StopPrinting()
          EndIf
        EndIf       
          
EndProcedure

Procedure MakeScreenshotWindow(hWnd,pdruck.b=#False,large.b=#False) ; MakeScreenshotWindow(Drucken,Vergrößerung)
    
      Define hImage.i,hdcWnd.i, hdcDesktop.i, hdcImage.i;,hWnd.i
      
      hWnd=GetForegroundWindow_()
      hImage=CreateImage(#image_0,Width*(large+1),Height*(large+1))
      hdcWnd=GetDC_(hWnd)
      hWnd=GetDesktopWindow_()
      hdcDesktop= GetDC_(hdcDesktop)
      hdcImage=CreateCompatibleDC_(hdcWnd)
      SelectObject_(hdcImage,hImage)
      StretchBlt_(hdcImage,0,0,Width*(large+1) ,Height*(large+1) ,hdcDesktop,0,0,Width ,Height,#SRCCOPY)
      If pdruck ; wenn 0 -> kein Ausgabe an den Drucker
        PrintPicFile(#image_0)
      Else
        SavePicFile(#image_0)
      EndIf    
      DeleteDC_(hdcImage)
      FreeImage(0)
        
  EndProcedure 
  
  
  
  hWnd = OpenWindow(0, 100, 120, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
  ButtonGadget(1, 190, 150, 130, 30, "Start")  
  ButtonGadget(2, 190, 250, 130, 30, "Ende")
  Delay(1000)

Repeat

  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_CloseWindow


    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
            ; MakeScreenshotWindow(hWnd,Drucken,Vergrößerung)         Drucken=0 / Speichern=1
              MakeScreenshotWindow(hWnd,0,0)
        Case 2
              EventID = #PB_Event_CloseWindow
      EndSelect
  EndSelect

  Until EventID = #PB_Event_CloseWindow
End 
 


Re: Drucken, Bildschirm drucken

Verfasst: 11.02.2013 23:00
von Kallewirsch
BREMSEN

dysti, so brauch ich das nicht. mach dir nicht so viel Arbeit!


hab jetzt schon einiges probiert, und muss sagen das ich auch immer weiter komme (langsam ....sehr langsam).

hab hier nen Code zusammengeschnippselt.....ich will doch nur den screenshot 1:1 ausgedruckt bekommen....nicht über Datei.....sondern direkt.... Taste drücken....requester geht auf ...Taste drücken....screenschot wird in ORGINALGRÖßE gedruckt.

noch was kleingedrucktes zu mir:
ich bin kein programmierer.....und brauche daher etwas genauere Hilfen von euch...... aber ich streng mich an


sag mir mal einer warum in gewünschter größe abgespeichert wird

und der Ausdruck in anderer Größe ist?

Code: Alles auswählen


UseJPEGImageEncoder()

Procedure MakeDesktopScreenshot(N0,x,y,Width,Height)
   hImage = CreateImage(N0,Width,Height)
   hdc    = StartDrawing(ImageOutput(0))
   DeskDC = GetDC_(GetDesktopWindow_())
      BitBlt_(hdc,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
   StopDrawing()
   ReleaseDC_(GetDesktopWindow_(),DeskDC)
   ProcedureReturn hImage
EndProcedure

MakeDesktopScreenshot(0, 0, 0, 1024, 768)
SaveImage(0, "C:\DesktopScreenshot.jpg",#PB_ImagePlugin_JPEG ) 



  If PrintRequester()

  If StartPrinting("Print")
 
   If StartDrawing(PrinterOutput())

        DrawImage(ImageID(0), 0, 0)
       
        StopDrawing()
   
   EndIf
   
      StopPrinting()
 
  EndIf
 
  EndIf
Viele Grüße an alle