Drucken, Bildschirm drucken

Anfängerfragen zum Programmieren mit PureBasic.
Kallewirsch
Beiträge: 49
Registriert: 11.01.2010 01:22

Drucken, Bildschirm drucken

Beitrag 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ß
PureBasic 5.00 (Windows - x86)
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Drucken, Bildschirm drucken

Beitrag 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.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Drucken, Bildschirm drucken

Beitrag 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 ) 
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Kallewirsch
Beiträge: 49
Registriert: 11.01.2010 01:22

Re: Drucken, Bildschirm drucken

Beitrag von Kallewirsch »

Schon mal vielen Dank!
PureBasic 5.00 (Windows - x86)
Kallewirsch
Beiträge: 49
Registriert: 11.01.2010 01:22

Re: Drucken, Bildschirm drucken

Beitrag 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
PureBasic 5.00 (Windows - x86)
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Drucken, Bildschirm drucken

Beitrag 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:
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Drucken, Bildschirm drucken

Beitrag 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.
Zuletzt geändert von dysti am 11.02.2013 13:40, insgesamt 1-mal geändert.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Drucken, Bildschirm drucken

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Drucken, Bildschirm drucken

Beitrag 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 
 

PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Kallewirsch
Beiträge: 49
Registriert: 11.01.2010 01:22

Re: Drucken, Bildschirm drucken

Beitrag 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
PureBasic 5.00 (Windows - x86)
Antworten