PNG-Image in einer GUI darstellen

  • Ich weiß, da Thema gabs schon einigemale, aber nach knapp 5 Stunden bekomm ich jetzt langsam Pipi in die Augen.

    In meiner GUI möchte ich gerne eine PNG-Grafik anzeigen lassen, aber obwohl das Test.au3 funktioniert, verzweifle ich an der eigentlichen GUI.

    Hier die Test-Variante:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI999 = GUICreate("Show PNG", 250, 250)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _drawpng($hGUI999, "images\winamp001.png", 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Loop until user exits
    do
    until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    Func _drawpng($pnggui,$pngpic, $pngx, $pngy)
    Local $hImage999, $hGraphic999, $hImage999

    [/autoit] [autoit][/autoit] [autoit]

    ; Load PNG image
    _GDIPlus_StartUp()
    $hImage999 = _GDIPlus_ImageLoadFromFile($pngpic)
    $hGraphic999 = _GDIPlus_GraphicsCreateFromHWND($pnggui)

    [/autoit] [autoit][/autoit] [autoit]

    ; Draw PNG image
    ; _WinAPI_RedrawWindow($pnggui, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic999, $hImage999, $pngx, $pngy)
    ; _WinAPI_RedrawWindow($pnggui, 0, 0, $RDW_VALIDATE)

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic999)
    _GDIPlus_ImageDispose($hImage999)
    _GDIPlus_ShutDown()
    EndFunc

    [/autoit]

    Aber wie ich es auch drehe und wende, in meiner eigentlichen GUI schaffe ich es nciht die PNG-Grafik anzeigen zulassen.

    Bevor ich jetzt hier mein ganzes Script reinstelle, möchte ich einfach mal die Frage stelen, was denn die Basic für die Darstelung eines PNG-Images in einer GUI sind.

    Wenn ich richtig liege, sollten doch folgende Punkte zum Erfolg führen?

    Die Includes:
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>

    Erstellen der GUI:
    $Irgendwas = GUICreate("Irgendwas", Breite, Höhe)
    GUISetState()

    Starten der DPIPlus.au3:
    _GDIPlus_StartUp()

    Laden des PNG-Images:
    $hImage999 = _GDIPlus_ImageLoadFromFile("images\beispiel.png")

    Anzeigen des PNG-Images:
    _GDIPlus_GraphicsDrawImage($hGUI999, $hImage999, 0, 0)

    GDIPlus, abschalten:
    _GDIPlus_ShutDown()

    Eine Schleife die die GUI am Leben hält:
    zum Beispiel:
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

    Einmal editiert, zuletzt von AnMa (12. September 2013 um 13:37)

  • Schau in die Hilfe bei

    [autoit]

    GUICtrlCreatePic

    [/autoit]

    da hast du ein Beispiel (Beispiel 3) für PNG das du 1zu1 übernehmen kannst.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mit dem Beispiel habe ich schon die ganzen Stunden gearbeitet und versucht es einzupassen. :(

    Aber mehr als das bekomm ich nicht Zustande:

    Spoiler anzeigen
    [autoit]

    #Region ### INCLUDES ###
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>
    #include <GroupEx[0.5].au3>
    #include <data\Winamp_Library.au3>
    #include <data\config.ini>
    #EndRegion ### INCLUDES ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### GUI FORM ###
    $Main = GUICreate("Downloader", 786, 521, 216, 125)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Pic = GUICtrlCreatePic(@ScriptDir & "\images\BeCast_Hintergrund.jpg", 0, 0, 786, 501)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI, $hImage, $hGraphic, $hImage1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; PNG Bild laden
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("images\winamp.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Main)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    ; Ressourcen aufräumen
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GUICtrlCreateLabelTrans ("Download auswählen:", 75, 48, 178, 24)
    GUICtrlSetFont(-1, 12, 800, 4, "Arial Black")

    [/autoit] [autoit][/autoit] [autoit]

    $Group1 = _GUICtrlGroup_Create("Nachrichten:", 15, 80, 185, 120)
    _GuiCtrlGroup_Set($Main, $Group1, $GUI_BKCOLOR_TRANSPARENT, $_GROUPBACKGROUND)
    $Button1 = GUICtrlCreateButton("Aktualisieren", 111, 168, 83, 25)
    _GUICtrlCreateLabelTrans("Montag - Freitag:", 25, 100, 101, 17)
    _GUICtrlCreateLabelTrans("06:00 Uhr / 09:00 Uhr / 12:00 Uhr", 25, 130, 167, 17)
    _GUICtrlCreateLabelTrans("jeweils ab ca. 10 Min vor", 25, 115, 121, 17)
    _GUICtrlCreateLabelTrans("16:00 Uhr / 20:00 Uhr / 24:00 Uhr", 25, 145, 167, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #EndRegion ### GUI FORM ###

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### MENU ###
    $filemenu = GUICtrlCreateMenu("Datei")
    $optmenu = GUICtrlCreateMenu("Optionen")
    $helpmenu = GUICtrlCreateMenu("?")

    [/autoit] [autoit][/autoit] [autoit]

    $exititem = GUICtrlCreateMenuItem("Beenden", $filemenu)
    $connectitem = GUICtrlCreateMenuItem("Verbindung testen", $optmenu)
    $trenneritem1 = GUICtrlCreateMenuItem("", $optmenu)
    $stateitem = GUICtrlCreateMenuItem("Statusanzeige", $optmenu)
    $einstitem = GUICtrlCreateMenuItem("Einstellungen", $optmenu)
    $helpitem = GUICtrlCreateMenuItem("Hilfe", $helpmenu)
    $aboutitem = GUICtrlCreateMenuItem("Info", $helpmenu)
    #EndRegion ### MENU ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### WORKAROUND ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $exititem, $GUI_EVENT_CLOSE
    Exit
    Case $einstitem
    Run("subs\options.exe", $scriptpath & "subs", @SW_MAXIMIZE)
    EndSwitch
    WEnd
    #EndRegion ### WORKAROUND ###

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### FUNCTIONS ###
    Func _GuiCtrlCreateLabelTrans($_text, $_left, $_top, $_width=Default, $_height=Default, $_style=-1, $_exStyle=0, $_iForeCol=-1)
    Local $ID = GUICtrlCreateLabel($_text, $_left, $_top, $_width, $_height, $_style, $_exStyle)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    If $_iForeCol <> -1 Then GUICtrlSetColor(-1, $_iForeCol)
    Return $ID
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; PNG Bild zeichnen
    Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($Main, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT
    #EndRegion ### FUNCTIONS ###

    [/autoit]

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Du hast die Func "MY_WM_PAINT" nicht angeepasst. Deine UI heißt z.b. ja nicht "$hGUI" sondern "$Main" usw.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • hmm .... OK, die eine Anpassung von "$hGUI" nach "$Main" hatte ich übersehen.

    Aber wüßte ich nicht was ich in der Func "MY_WM_PAINT" anpassen soll. :(

    Wenn ich das Script starte bekomme ich nacheinander zwei GUI's angezeigt.

    Das erste zeigt einzig und alleine das "hintergund-Image" an. Kein Menu, keine Label, kein Button ... nichts.

    Nach der "ESC"

    Kommt das selbe GUI nocheinmal,aber diesmal mit allem was dazu gehört, jedoch kein PNG-Image. :(

    Ich komm nicht drauf wo ich den Denkfehler habe. Alleine, dass das GUI zweimal aufgerufen wird ist ja schon nicht normal.

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Sollte so gehen:

    Spoiler anzeigen
    [autoit]

    #Region ### INCLUDES ###
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>
    #include <GroupEx[0.5].au3>
    #include <data\Winamp_Library.au3>
    #include <data\config.ini>
    #EndRegion ### INCLUDES ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### GUI FORM ###
    $Main = GUICreate("Downloader", 786, 521, 216, 125)
    $Pic = GUICtrlCreatePic(@ScriptDir & "\images\BeCast_Hintergrund.jpg", 0, 0, 786, 501)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Main, $hImage, $hGraphic, $hImage1

    [/autoit] [autoit][/autoit] [autoit]

    ; PNG Bild laden
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("images\winamp.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Main)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GUICtrlCreateLabelTrans ("Download auswählen:", 75, 48, 178, 24)
    GUICtrlSetFont(-1, 12, 800, 4, "Arial Black")

    [/autoit] [autoit][/autoit] [autoit]

    $Group1 = _GUICtrlGroup_Create("Nachrichten:", 15, 80, 185, 120)
    _GuiCtrlGroup_Set($Main, $Group1, $GUI_BKCOLOR_TRANSPARENT, $_GROUPBACKGROUND)
    $Button1 = GUICtrlCreateButton("Aktualisieren", 111, 168, 83, 25)
    _GUICtrlCreateLabelTrans("Montag - Freitag:", 25, 100, 101, 17)
    _GUICtrlCreateLabelTrans("06:00 Uhr / 09:00 Uhr / 12:00 Uhr", 25, 130, 167, 17)
    _GUICtrlCreateLabelTrans("jeweils ab ca. 10 Min vor", 25, 115, 121, 17)
    _GUICtrlCreateLabelTrans("16:00 Uhr / 20:00 Uhr / 24:00 Uhr", 25, 145, 167, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #EndRegion ### GUI FORM ###

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### MENU ###
    $filemenu = GUICtrlCreateMenu("Datei")
    $optmenu = GUICtrlCreateMenu("Optionen")
    $helpmenu = GUICtrlCreateMenu("?")

    [/autoit] [autoit][/autoit] [autoit]

    $exititem = GUICtrlCreateMenuItem("Beenden", $filemenu)
    $connectitem = GUICtrlCreateMenuItem("Verbindung testen", $optmenu)
    $trenneritem1 = GUICtrlCreateMenuItem("", $optmenu)
    $stateitem = GUICtrlCreateMenuItem("Statusanzeige", $optmenu)
    $einstitem = GUICtrlCreateMenuItem("Einstellungen", $optmenu)
    $helpitem = GUICtrlCreateMenuItem("Hilfe", $helpmenu)
    $aboutitem = GUICtrlCreateMenuItem("Info", $helpmenu)
    #EndRegion ### MENU ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### WORKAROUND ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $exititem, $GUI_EVENT_CLOSE
    Exit
    Case $einstitem
    Run("subs\options.exe", $scriptpath & "subs", @SW_MAXIMIZE)
    EndSwitch
    WEnd
    #EndRegion ### WORKAROUND ###

    [/autoit] [autoit][/autoit] [autoit]

    ; Ressourcen aufräumen
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### FUNCTIONS ###
    Func _GuiCtrlCreateLabelTrans($_text, $_left, $_top, $_width=Default, $_height=Default, $_style=-1, $_exStyle=0, $_iForeCol=-1)
    Local $ID = GUICtrlCreateLabel($_text, $_left, $_top, $_width, $_height, $_style, $_exStyle)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    If $_iForeCol <> -1 Then GUICtrlSetColor(-1, $_iForeCol)
    Return $ID
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; PNG Bild zeichnen
    Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    _WinAPI_RedrawWindow($Main, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($Main, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT
    #EndRegion ### FUNCTIONS ###

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ok, das funktioniert :D

    Aber ich verstehe noch nicht warum, da muß ich mir noch mal die Auswirkungen den Veränderungen anschauen. Wenn ich das richtig sehe gab es ja drei Änderungen?

    Löschen von:
    GUISetState()
    und
    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    Versetzen von:
    ; Ressourcen aufräumen
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

    Jetzt ist gaub ich der Groschen gefallen :D

    "GUISetState()" hatte ich eh zweimal drin.
    Die Schleife "Do - Until" hat über die Func ein erstes GUI erzeugt
    Und der "GDIPlus_Dhutdown()" kam bevor das Form aufgebaut wurde.

    Waren das die Gründe?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • ne bedeutent einfache variante wäre

    [autoit]

    #include <GDIPlus.au3> ; darf nicht fehlen!

    [/autoit][autoit][/autoit][autoit]

    Func GUICtrlCreatePng($sPNG_Path, $iPNG_Left = 0, $iPNG_Top = 0)
    _GDIPlus_Startup()
    Local $hImagePNG = _GDIPlus_ImageLoadFromFile($sPNG_Path)
    Local $iPNG_Width = _GDIPlus_ImageGetWidth($hImagePNG)
    Local $iPNG_Height = _GDIPlus_ImageGetHeight($hImagePNG)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImagePNG)

    [/autoit][autoit][/autoit][autoit]

    Local $cPNG_PIC = GUICtrlCreatePic("", $iPNG_Left, $iPNG_Top, $iPNG_Width, $iPNG_Height)

    [/autoit][autoit][/autoit][autoit]

    GUICtrlSendMsg($cPNG_PIC, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($hImagePNG)
    _GDIPlus_Shutdown()

    [/autoit][autoit][/autoit][autoit]

    Return $cPNG_PIC
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]


    einfach aufrufen wie GUICtrlCreatePic (bis auf das die breite/höhe/style/exstyle parameter fehlen, könnte man aber leicht hinzufügen)
    ist weitaus kompfortabler einmal diese funktion aufzurufen, weil man nix weiter tun muss ;)
    es wird auch eine ControlID zurück gegeben die man wie gewohnt weiter verwenden kann

    mfg