CreateWindowShot(hWnd, Client=#True)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: CreateWindowShot(hWnd, Client=#True)

Beitrag 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:
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: CreateWindowShot(hWnd, Client=#True)

Beitrag 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 :)
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