Hallo,
ich möchte einen Screenshot in meiner GUI als Hintergrund einladen, habe diesbezüglich mal nach Beispielen für PNG Bilder geschaut und bin fündig geworden.
Allerdings kann ich die Bilddatei weder löschen, noch überschreiben wenn ich diese als Hintergrundbild geladen habe.
Wie ich gelesen habe, liegt das daran das GDI+ die Bilddatei erst wieder freigibt, wenn ich diese im Programm nicht mehr benutze.
Habe dann nach anderen Möglichkeiten geschaut, die Bilddatei zu laden.
Konnte noch ein Beispiel finden wie man das PNG Bild in GUICtrlCreatePic lädt und danach auf die Datei zugreifen kann.
Allerdings kann ich nun nicht mehr mit dem Windowshandle/Klasse auf die GUI und das dort angezeigte Bild zugreifen, benötige das Bild direkt in der GUI mit MY_WM_PAINT Funktion, damit das Bild auch bei minimierten Programm sichtbar ist und über Windowshandle/Klasse angesteuert werden kann.
Wie kann ich dieses Beispiel so umändern, das ich nach dem Einladen der Datei Screenshot.png diese überschreiben/löschen kann ?
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPI.au3>
Global $hGUI, $hImage, $hGraphic, $hImage
Global Const $SC_DRAGMOVE = 0xF012
; Create GUI
$hGUI = GUICreate("SCREENSHOTGUI", 1024, 768, -1, -1)
GUISetBkColor(0x01, $hGUI)
GUISetState()
_WinAPI_SetLayeredWindowAttributes($hGUI, 0x01, 0xFF, 3)
; Load PNG image
_GDIPlus_StartUp()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\screenshot.png"); Funktion blockiert Datei
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
$Button1 = GUICtrlCreateButton("Start", 208, 376, 75, 25)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Button1
ExitLoop
Case $GUI_EVENT_PRIMARYDOWN
_SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndSwitch
WEnd
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
Exit
; Draw PNG image
Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
_WinAPI_RedrawWindow($hGUI, 0, 0, 1)
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Edit:
Zwischenzeitlich habe ich rausgefunden das ich mit _GDIPlus_ImageDispose($hImage) das Bild freigeben kann, allerdings verschwindet es dann auch in der GUI.
Als Notlösung könnte ich nun zwei Dateinamen im Wechsel nutzen:
z.B. Screenshot-1.png als erstes einladen, dann einen neuen Screenshot als Screenshot-2.png erstellen und diesen in die GUI laden.
Mittel _GDIPlus_ImageDispose($image) gebe ich das zuerst eingeladene Bild Screenshot-1.png wieder frei und kann dieses mit einem neuen Screenshot überschreiben.
Das ganze dann im Dauerwechsel, würde gehen aber ist sicher nicht die optimale und richtige Lösung.