Bild (png) in GUI verschwindet nach kurzer Zeit

  • Hallo Leute,

    ich habe ein Bild (png-Datei [640 x100 px]), das ich auf einer GUI anzeigen lasse.
    Leider verschwindet das Bild nach ca. 5 - 10 Sek wieder. Kann mir jemand sagen warum das passiert bzw. wie ich das verhindern kann??

    Spoiler anzeigen
    [autoit]


    #include <GdiPlus.au3>

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

    $hGui = GUICreate("GUI", 1, 1, -1, -1, 0x81000000)
    GUISetBkColor(0x000000, $hGui)

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

    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()
    $graphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $image1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\img\A_1.png")
    _GDIPlus_GraphicsDrawImageRect($graphic, $image1, 0, @DesktopHeight - 120, 640, 100)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_ImageDispose($image1)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

    [/autoit]


    Der Strahleman 8)

    Wenn denn alles so einfach wäre wie

    [autoit]

    "Autoit"

    [/autoit]

    meine UDFs
    Math2

    Wichtige Threads
    Math2

    Einmal editiert, zuletzt von Strahleman (1. Dezember 2010 um 19:21)

  • Versuchs mal hiermit

    Spoiler anzeigen
    [autoit]


    #include <GdiPlus.au3>
    #include <GuiConstantsEx.au3>
    _Start()
    Func _Start()

    $hGui = GUICreate("GUI", 1, 1, -1, -1, 0x81000000)
    GUISetBkColor(0x000000, $hGui)
    GUISetState()

    _GDIPlus_Startup()
    $graphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $image1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\img\A_1.png")
    _GDIPlus_GraphicsDrawImageRect($graphic, $image1, 0, @DesktopHeight - 120, 640, 100)

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_ImageDispose($image1)
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]
  • Hallo Strahleman,

    GDI-Graphiken, müssen immer wieder eneuert werden, da sie sonst von den Routinen welche die GUI aktualisieren überzeichnet werden. Am einfachsten funktioniert das mit GuiREGISTERMSG (siehe Beispiel 3 in der Hilfe z GuiCtrlCreatePic, also so:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GdiPlus.au3>

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

    $hGui = GUICreate("GUI", 1, 1, -1, -1, 0x81000000)
    GUISetBkColor(0x000000, $hGui)

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

    _GDIPlus_Startup()
    Global $hgraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $himage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\img\A_1.png")
    _GDIPlus_GraphicsDrawImageRect($hgraphic, $himage, 0, @DesktopHeight - 120, 640, 100)
    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hgraphic)
    _GDIPlus_ImageDispose($himage)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    ; Draw PNG image
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hgraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

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

    mfg autoBert

  • Hallo AutoBert,

    Danke für den Tipp! Jetzt hab ich's hin bekommen. Allerdings verstehe ich noch nicht wieso ich denn die GDI-Grafiken immer wieder neu laden/zeichnen muss?

    Das lauffähige Programm sieht dann übrigens so aus:

    Spoiler anzeigen
    [autoit]

    #include <GdiPlus.au3>

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

    $hGui = GUICreate("GUI", 1, 1, -1, -1, 0x81000000)
    GUISetBkColor(0x000000, $hGui)

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

    GUISetState(@SW_SHOW)

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

    GUIRegisterMsg(0x000F, "MY_WM_PAINT")

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

    _GDIPlus_Startup()
    $graphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $image1 = _GDIPlus_ImageLoadFromFile("C:\Users\chris\Documents\Autoit\WWM-Quiz" & "\img\A_1.png")
    _GDIPlus_GraphicsDrawImageRect($graphic, $image1, 0, @DesktopHeight - 120, 640, 100)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_ImageDispose($image1)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, 0x0100)
    _GDIPlus_GraphicsDrawImageRect($graphic, $image1, 0, @DesktopHeight - 120, 640, 100)
    _WinAPI_RedrawWindow($hGUI, 0, 0, 0x0008)
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>MY_WM_PAINT

    [/autoit]


    der Strahleman 8)

    Wenn denn alles so einfach wäre wie

    [autoit]

    "Autoit"

    [/autoit]

    meine UDFs
    Math2

    Wichtige Threads
    Math2

  • Hallo Strahlemann,

    dein Skript dürfte so nicht funktionieren, da die Func MY_WM_PAINT zu einem Zeitpunkt registriert wird, zu dem die Variablen $Grapgic und $Image1 noch nicht deklariert sind,

    mfg autoBert

  • Guten Morgen AutoBert,

    ja da hast du Recht.
    Ich hab da noch die Vorgängerversion im Zwischenspeicher gehabt. Die globale Variablendeklaration hab ich natürlich zu Beginn auch gemacht.

    Spoiler anzeigen
    [autoit]


    #include <GdiPlus.au3>

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

    Global $graphic, $image
    Global $hGui = GUICreate("GUI", 1, 1, -1, -1, 0x81000000)
    GUISetBkColor(0x000000, $hGui)

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

    GUISetState(@SW_SHOW)

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

    GUIRegisterMsg(0x000F, "MY_WM_PAINT")

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

    _GDIPlus_Startup()
    CreatePNG("A_1", 0, @DesktopHeight - 120)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_ImageDispose($image)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func CreatePNG($sPngFile, $x, $y, $pngWidth = 640, $pngHeight = 100)
    $graphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $image = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\img\" & $sPngFile & ".png")
    _GDIPlus_GraphicsDrawImageRect($graphic, $image, $x, $y, $pngWidth, $pngHeight)
    EndFunc

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

    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, 0x0100)
    _GDIPlus_GraphicsDrawImageRect($graphic, $image, 0, @DesktopHeight - 120, 640, 100)
    _WinAPI_RedrawWindow($hGUI, 0, 0, 0x0008)
    Return "GUI_RUNDEFMSG" ;$GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

    [/autoit]


    Und warum muss nun immer wieder neu geladen werden?

    der Strahleman 8)

    Wenn denn alles so einfach wäre wie

    [autoit]

    "Autoit"

    [/autoit]

    meine UDFs
    Math2

    Wichtige Threads
    Math2