Seite 2 von 2

Re: CreateWindowShot(hWnd, Client=#True)

Verfasst: 03.10.2016 09:51
von Rudi
Hier nun noch eine weitere und wohl letzte Version, mit Anwendung der PrintWindow_() API.
Um das Date-Gadget aufzunehmen, einfach ein anderes Datum angeben!

Code: Alles auswählen

EnableExplicit

CompilerSelect #PB_Compiler_OS
	CompilerCase #PB_OS_Windows
		;CompilerError "Dieser Code läuft nicht unter Windows!"
	CompilerCase #PB_OS_Linux
		CompilerError "Dieser Code läuft nicht unter Linux!"
	CompilerCase #PB_OS_MacOS
		CompilerError "Dieser Code läuft nicht unter MacOS!"
CompilerEndSelect

CompilerIf #PB_Compiler_Version < 540
	CompilerError "Es muss mindestens PureBasic Version 5.40 verwendet werden!"
CompilerEndIf

CompilerSelect #PB_Compiler_Debugger
	CompilerCase 0
		CompilerError "Der Debugger muss eingeschaltet sein!"
	CompilerCase 1
		;CompilerError "Der Debugger muss ausgeschaltet sein!"
CompilerEndSelect

UsePNGImageEncoder()

Prototype PrintWindow(hWnd, hDC, Flag)
Define Lib = OpenLibrary(#PB_Any, "user32.dll")
If IsLibrary(Lib)
	Global PrintWindow_.PrintWindow = GetFunction(Lib, "PrintWindow")
Else
	MessageRequester("user32.dll", "Die erforderliche Library konnte nicht korrekt initialisiert werden. Das Programm wird beendet", #MB_ICONERROR|#MB_TOPMOST)
	End
EndIf

Procedure CreateWindowShot(hWnd, wClient=#True, x=0, y=0, w=0, h=0)
	Protected.i Image, hDC, Flag
	Protected.RECT Rect
	
	If IsWindow_(hWnd)
		If IsIconic_(hWnd) : OpenIcon_(hWnd) : EndIf
		
		Select wClient
			Case #False
				GetWindowRect_(hWnd, Rect)
				Flag = #Null
			Case #True
				GetClientRect_(hWnd, Rect)
				Flag = #PW_CLIENTONLY
		EndSelect
		
		If ValidateRect_(hWnd, Rect)
			With Rect
				Protected Width = \right - \left
				Protected Height = \bottom - \top
			EndWith
			
			Image = CreateImage(#PB_Any, Width, Height)
			If IsImage(Image)
				hDC = StartDrawing(ImageOutput(Image))
				If hDC
					If Not PrintWindow_(hWnd, hDC, Flag)
						FreeImage(Image)
					EndIf
					GrabDrawingImage(Image, x, y, w, h)
					StopDrawing()
				Else
					FreeImage(Image)
				EndIf
			EndIf
		EndIf
	EndIf
	
	ProcedureReturn Image
EndProcedure

;                              ╔════════════════╤════════════════╗
;                              ║          ┌─────┴─────┐          ║
;                              ╟──────────┤  Example  ├──────────╢
;                              ║          └─────┬─────┘          ║
;                              ╚════════════════╧════════════════╝

Procedure Execute(hWnd, wClient=#False, File$="D:\WindowImage.png")
	Protected Image
	
	If IsWindow_(hWnd)
		Image = CreateWindowShot(hWnd, wClient)
		If IsImage(Image)
			Select MessageRequester("Frage", ~"Soll das Bild gespeichert werden?\n\n\"Nein\" zeigt es an.", #MB_ICONQUESTION|#MB_YESNO|#MB_TOPMOST)
				Case #IDYES
					File$ = SaveFileRequester("", File$, "PNG-Image (.png)|*.png", 0)
					If File$
						SaveImage(Image, File$, #PB_ImagePlugin_PNG)
					EndIf
				Case #IDNO
					ShowLibraryViewer("Image", Image)
			EndSelect
		EndIf
	EndIf
EndProcedure

Procedure OpenWindow_Window_0()
	Protected Window, Button_0, Button_1, Button_2
	
	Window = OpenWindow(#PB_Any, 450, 200, 400, 400, "Window - ©Rudi☺", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
	If IsWindow(Window)
		SetWindowColor(Window, #Blue)
		Button_0 = ButtonGadget(#PB_Any, 1, 1, 398, 35, "Bildschirmfoto vom gesamten Fenster")
		Button_1 = ButtonGadget(#PB_Any, 1, 364, 398, 35, "Bildschirmfoto vom Clientbereich")
		Button_2 = DateGadget(#PB_Any, 35, 290, 330, 35, "Datum: %dd.%mm.%yyyy, Zeit: %hh:%ii Uhr")
		FrameGadget(#PB_Any, 90, 90, 210, 180, "Hinweis:")
		TextGadget(#PB_Any, 105, 125, 180, 110, ~"Klicke oben auf den Button, um ein Bildschirmfoto vom gesamten Fenster zu erhalten.\n\n\nKlicke unten auf den Button, um ein Bildschirmfoto nur vom Clientbereich des Fensters zu erhalten.")
		
		Repeat
			Select WaitWindowEvent()
				Case #PB_Event_Gadget
					Select EventGadget()
						Case Button_0
							Execute(WindowID(Window))
						Case Button_1
							Execute(WindowID(Window), #True, "D:\ClientImage.png")
						Case Button_2
							Execute(GadgetID(Button_2), #False, "D:\GadgetImage.png")
					EndSelect
				Case #PB_Event_CloseWindow
					Select EventWindow()
						Case Window
							Break
					EndSelect
			EndSelect
		Until GetAsyncKeyState_(#VK_ESCAPE)&1
		CloseWindow(Window)
	EndIf
EndProcedure

OpenWindow_Window_0()
If IsLibrary(Lib)
	CloseLibrary(Lib)
EndIf
End
[/size]Diese Version beinhaltet die vorteilhafte Funtionalität aller vorhergehenden Versionen, mit folgenden Ausnahmen:
  1. Es können nur bestimmte Gadgettypen aufgenommen werden.
  2. Es kann nicht der visuelle Fensterrahmenstyle aufgenommen werden.
udg hat geschrieben:Ich muss nämlich dafür sorgen dass lediglich der Bereich mit dem Logo (siehe Bild oben) am Ende gespeichert wird. Dein Code zieht ja nur den FensterFrame ab und speichert den Inhalt.
Habe Dir noch eine Clip-Funtion mit eingebaut. :wink:

Re: CreateWindowShot(hWnd, Client=#True)

Verfasst: 03.10.2016 17:35
von udg
Rudi hat geschrieben:Habe Dir noch eine Clip-Funtion mit eingebaut. :wink:

coole Sache. Teste ich sobald Zeit ist. Feedback kommt dann umgehend :)