PNG als GUI: Fehler beim schließen nach Kompilieren...

  • Habe da ein kleines Problem, und zwar stürzt folgendes Programm, beim schließen ab :(

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;#NoTrayIcon
    #AutoIt3Wrapper_UseUpx=n
    #include <WinAPI.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    Opt("MustDeclareVars", 0)

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

    Global Const $AC_SRC_ALPHA = 1
    Global Const $ULW_ALPHA = 2
    Dim $close, $pngSrc, $hImage, $width, $Height, $Gui, $ctrlGui, $close, $msg

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

    _GDIPlus_Startup()
    FileInstall("LaunchySkin.png",@TempDir&"/back.png")
    $pngSrc = @TempDir&"/back.png"
    ;$pngSrc ="LaunchySkin.png"
    $hImage = _GDIPlus_ImageLoadFromFile($pngSrc)
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)
    $GUI = GUICreate(" ^^^^^^^^^^ ", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    $ctrlGui = GUICreate("ctrl", $Width, $Height, 0, -20, $WS_POPUP, $WS_EX_MDICHILD);BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD))

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

    SetBitmap($GUI, $hImage, 0)
    ;$ctrlGui = GUICreate("ControlGUI", $width, $height, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD))
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $gui)
    GUISetState(@SW_SHOW, $ctrlGui)

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

    WinSetOnTop($GUI, "", 1)
    ;_fade()
    SetBitmap($GUI, $hImage, 255)

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

    $close = GUICtrlCreateButton("", 322, 20,24,20)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ;_close()
    Exit
    Case $msg = $close
    ;_close()
    Exit
    EndSelect
    WEnd

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

    Func _fade($opt="in")
    If $opt="in" Then
    For $i = 0 To 255 Step 5
    SetBitmap($GUI, $hImage, $i)
    Sleep(5)
    Next
    SetBitmap($GUI, $hImage, 255)
    ElseIf $opt="out" Then
    For $i = 255 To 0 Step -5
    SetBitmap($GUI, $hImage, $i)
    Sleep(5)
    Next
    EndIf
    EndFunc

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

    Func _close()
    GUIDelete($ctrlGui)
    ; _fade("out")
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    GUIDelete($Gui)
    FileDelete(@TempDir&"/back.png")
    EndFunc

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

    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If ($hWnd = $Gui) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
    EndFunc

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

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc

    [/autoit]

    Hat irgendjemand eine Idee wo der Fehler liegt? Hab schon alles möglich ausprobiert...

    Grüßle AlkoholiX

  • Nun, falls Du noch nicht selbst drauf gekommen bist ... ;)

    Spoiler anzeigen
    [autoit]

    FileInstall("LaunchySkin.png",@TempDir&"/back.png")
    $pngSrc = @TempDir&"/back.png"

    [/autoit]


    ... muss natürlich heissen ...

    Spoiler anzeigen
    [autoit]

    FileInstall("LaunchySkin.png",@TempDir&"\back.png")
    $pngSrc = @TempDir&"\back.png"

    [/autoit]


    :D

    Gruß
    Greenhorn


  • Nun, falls Du noch nicht selbst drauf gekommen bist ... ;)

    Spoiler anzeigen
    [autoit]

    FileInstall("LaunchySkin.png",@TempDir&"/back.png")
    $pngSrc = @TempDir&"/back.png"

    [/autoit]


    ... muss natürlich heissen ...

    Spoiler anzeigen
    [autoit]

    FileInstall("LaunchySkin.png",@TempDir&"\back.png")
    $pngSrc = @TempDir&"\back.png"

    [/autoit]

    Funktionieren beide Methoden! Und ich selbst habe keinen Unterschied gemerkt....

    Grüßle AlkoholiX

  • Leider ist es das auch nicht, habe schon versucht das *.png direkt ausm "@scriptdir" zu lesen... :( (scriptdir = C:\autoit\)
    Also auch keine Leerzeichen....

    Grüßle AlkoholiX