Icon in transparente GUI

  • Hallo Leute, ich mal wieder,

    heute quält mich folgendes Problem. Ich würde gern ein transparentes Icon, das in einer dll steckt, als Hintergrundbild für eine GUI nutzen, finde allerdings keine Lösung.
    Hab es bereits mit GDIPLUS versucht (da konnte ich keine dll benutzen) und mit dem Beispiel der schwebende Buttons sehe ich mein Bild leider auch nicht oder nicht transparent.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <WinAPI.au3>
    $gui = GUICreate("Test Windows regions", 256, 256, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    $pic = GUICtrlCreateIcon("resource.dll", 5,0,0,256,256)
    GUISetState(@SW_SHOW)
    $pos = WinGetPos($gui)
    _GuiHole($gui, 0, 0, 150, 150)
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_SECONDARYUP
    ExitLoop
    EndSwitch
    WEnd
    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, $pic)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole
    Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn
    If IsArray($ctrl_id) Then
    For $i = 0 To UBound($ctrl_id) -1
    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id[$i])
    $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($gui, "", $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

    [/autoit]

    Ich hoffe ihr könnt mir ein wenig auf die Sprünge helfen,
    Gruß Gremlin

  • Danke UEZ für deine Antwort,
    leider ist das Neuland für mich. Ich denke mal, damit kann ich das Icon aus der dll herauslösen,
    aber wie bekomme ich es als Hintergrund gesetzt?
    Hab es jetzt so versucht mit GDIPlus, aber zu sehen ist nichts.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIShellEx.au3>
    #include <GDIPlus.au3>
    Global $GUI = GUICreate('',256,256,-1,-1,$WS_POPUP, $WS_EX_CONTROLPARENT+$WS_EX_LAYERED)
    Global $pic = _WinAPI_ShellExtractIcon("resource.dll", 5,256,256)
    _GDIPlus_Startup() ; lade und aktiviere GDI+
    Global $hImageGUIBK = _GDIPlus_ImageLoadFromFile($pic) ; lade Hintergrunddatei per GDI+
    SetBitmap($GUI, $hImageGUIBK, 255) ; setze Alpha vom Fenster des Bildes auf 255 (transparent)

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

    Global $GUIsub = GUICreate("", 256, 256, -1, -1, $WS_POPUP, $WS_EX_LAYERED+ $WS_EX_MDICHILD, $GUI)
    GUISetBkColor(0x585858) ; => hintergrund ebenfalls durchsichtig, damit die buttons direkt auf das Hintergrundbild gesetzt werden
    _WinAPI_SetLayeredWindowAttributes($GUIsub, 0x585858)

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

    GUISetState(@SW_SHOW, $GUI)
    GUISetState(@SW_SHOW, $GUIsub)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_SECONDARYUP
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Global $AC_SRC_ALPHA = 1
    Func SetBitmap($hGUI, $hImage, $iOpacity) ; lade hintergrundbild und mache den hintergrund transparent
    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]

    Muss ich das Icon vorher noch zwischenspeichern (im TEMP o.ä.)?

    Gruß Gremlin

    4 Mal editiert, zuletzt von Gremlin78 (22. Januar 2015 um 21:35)