Transparentes Fenster mit PNG-Datei

  • Hohoho,

    Ich wollte ein transparentes Fenster machen, auf dem Buttons sind und ein PNG-Bild. Leider kann man weder transparente Fenster, noch PNG-Dateien einfach anzeigen lassen.
    Ein Script für ein transparentes Fenster habe ich hier gefunden: Link
    Ein Script für eine PNG-Datei habe ich hier gefunden: Link (Beispiel 3)

    Nur wenn ich das ganze jetzt verbinden will, wird der transparente Hintergrund der PNG-Datei nicht transparent, da das Transparenter-Hintergrund Script vom Bild die ganze Fläche ignoriert.

    Hier ist mein aktuelles Script, welches ihr mir zusammenkopiert habe und mittlerweile völlig zerstört durch irgendwelche nötigen Änderungen:

    Spoiler anzeigen
    [autoit]

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

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

    _GDIPlus_StartUp()

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

    $FGUI = GUICreate("Test Windows regions", 500,350,Default,Default, $WS_POPUP)
    $FImage=_GDIPlus_ImageLoadFromFile(@ScriptDir&"\images\header.png")
    $FGraphic=_GDIPlus_GraphicsCreateFromHWND($FGUI)
    $FButtonBeen=GUICtrlCreateButton("Beenden", 0, 120, 150)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")

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

    GUISetState(@SW_SHOW)
    $pos=WinGetPos($FGUI)
    Global $Element[2]
    $Element[0]=$FButtonBeen
    $Element[1]=$FGraphic
    _GuiHole($FGUI, 0,0, 500, 350)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $FButtonBeen
    ExitLoop
    EndSwitch
    WEnd
    Close()

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

    Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $Element)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole
    Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos[4], $ctrl_rgn
    If IsArray($ctrl_id) Then
    For $i = 0 To UBound($ctrl_id) -1
    $ctrl_pos = ControlGetPos($FGUI, "", $ctrl_id[$i])
    If $i=1 Then
    Local $ctrl_pos[5]
    $ctrl_pos[0]=0
    $ctrl_pos[1]=0
    $ctrl_pos[2]=500
    $ctrl_pos[3]=49
    EndIf
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    Next
    Else
    $ctrl_pos = ControlGetPos($FGUI, "", $ctrl_id)
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    EndIf
    EndFunc ;==>_AddCtrlRegion
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($FGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($FGraphic, $FImage, 0, 0)
    _WinAPI_RedrawWindow($FGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func Close()
    _GDIPlus_GraphicsDispose($FGraphic)
    _GDIPlus_ImageDispose($FImage)
    _GDIPlus_ShutDown()
    Exit
    EndFunc

    [/autoit]

    Wäre schön, wenn jemand das zum laufen bringen könnte. Wahrscheinlich müsste die ganze Datei neu geschrieben werden.
    Als header.png könnt ihr ja einfach irgendein PNG-Bild mit transparenz verwenden.

  • Zitat

    Soll ich mir also noch die GDIpProgress.au3 downloaden, obwohl ich garnicht eine Progressbar machen will, sondern einfach nur ein PNG-Bild auf transparentem Untergrund?


    Na aber selbstverständlich! Es ist ja nicht so als ob man dir ein Beispiel für eine Lösung deines Problems geben wollte, mit einem Script das nicht unbedingt nur mit ProgressBars funktioniert.... Mal ganz abgesehen davon, dass es nicht wirklich viel Arbeit ist diese UDF herunterzuladen nur um zu sehen wie das Script funktioniert.