1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Leisti86

Beiträge von Leisti86

  • _GDIPlus_ImageLoadFromFile sperrt Bilddatei nach einladen, wie freigeben ?

    • Leisti86
    • 27. Oktober 2016 um 22:49

    Danke UEZ,
    hatte ich also das richtige gefunden :)
    Leider sitze ich nun schon ein paar Stunden rum und finde den Fehler nicht, bzw. konnte ich es nun auf _GDIPlus_ImageDispose($hImage) eingrenzen.

    Wenn ich während die Funktion ausgeführt wird das Fenster der GUI verschiebe oder schnell mit anderen Fenstern verdecke und wieder sichtbar mache, stürzt das ganze Programm ab :(
    Ebenso wenn ich ein Fenster eines anderen Programms minimiere/verkleinere, während die GUI dahinter ist.

    Ich vermute ich mache etwas bei _GDIPlus_ImageDispose($hImage) falsch ?

    Das sind die Funktionen die ich nutzen möchte, der Ablauf ist:
    1. GUI erstellen und mit Funktion _ReDraw verbinden (Bild soll auch wenn GUI von anderen Fenstern verdeckt ist angezeigt werden)
    2. PNG Bild in GUI laden und anzeigen.
    3. bei Bedarf geladenes PNG Bild wieder freigeben, damit dieses Überschrieben werden kann.
    4. neues PNG Bild einladen

    Scheint schwerer zu sein als ich dachte, ein Bild in einer GUI immer anzuzeigen, egal ob die GUI verdeckt ist oder minimiert.
    Wärst Du oder ein anderer Leser bitte so nett mir weiterzuhelfen ?

    Danke!

    So verwende ich die Funktionen bisher:

    AutoIt
    Global $hGUI = GUICreate("FensterTitel", $SCREENCAP_X, $SCREENCAP_Y,0, 0)
    GUISetState()
    GUIRegisterMsg($WM_PAINT, "_ReDraw")
    ;#################################
    ; Lade erstmalig PNG Bild in GUI
    _GDIPlus_Startup()
    Global $image = _GDIPlus_ImageLoadFromFile($Screenshot)
    Global $graphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    _GDIPlus_GraphicsDrawImageRect($graphics, $image, 0, 0, $SCREENCAP_X, $SCREENCAP_Y)
    ;#################################
    ; später so ein geladenes PNG Bild löschen und Datei freigeben zum überschreiben...
    _GDIPlus_ImageDispose($image) ; crasht Programm beim Fensterwechsel...
    _WinAPI_DeleteObject($image)
    ;#################################
    ; nach dem löschen des alten Bildes, lade neues PNG Bild in GUI
    $image = _GDIPlus_ImageLoadFromFile($Screenshot)
    _GDIPlus_GraphicsDrawImageRect($graphics, $image, 0, 0, $SCREENCAP_X, $SCREENCAP_Y)
    ;#################################
    ; Funktion um Inhalt einer GUI immer anzuzeigen, egal ob minimiert oder verdeckt
    Func _ReDraw($hWnd2, $msg, $wParam, $lParam)
    	#forceref $hWnd, $Msg, $wParam, $lParam
         _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
         _GDIPlus_GraphicsDrawImage($graphics, $image, 0, 0)
         _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
         Return $GUI_RUNDEFMSG
    EndFunc
    Alles anzeigen
  • _GDIPlus_ImageLoadFromFile sperrt Bilddatei nach einladen, wie freigeben ?

    • Leisti86
    • 27. Oktober 2016 um 13:49

    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 ?

    AutoIt
    #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.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™