mal wieder transparente Controls in GUI

  • Hey Leute,

    ich bräuchte mal wieder eure Hilfe, unzwar habe ich eine GUI die ist aber als WS_POPUP. Der habe ich per GDI+ einen Hintergrund (.png) gegeben, nun möcht die Controls transparent haben, so das ich nicht diese grauen Flächen dortdrum habe.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    Global Const $AC_SRC_ALPHA = 1
    Global $pngSrcSettingsBK = "config.png"

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

    HotKeySet("{ESC}", "_Exit")

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

    $Config_GUI = GUICreate("Einstellungen", 600, 450, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    _GDIPlus_Startup()
    $hImageSettingsBK = _GDIPlus_ImageLoadFromFile($pngSrcSettingsBK)
    _SetBitmap($Config_GUI,$hImageSettingsBK, 255)
    GUICtrlCreateButton("OK", 20, 200, 110, 30)
    GUICtrlCreateRadio("Test", 20, 250, 100, 20)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _SetBitmap($hGUI, $hImageBK, $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($hImageBK)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImageBK))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImageBK))
    $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 ;==>SetBitmap

    [/autoit]

    PNG ist im Anhang.

    Einmal editiert, zuletzt von m-obi (11. Januar 2010 um 08:50)

  • Leider klappt es damit auch nicht. Habe auch con eine Child-Gui gemacht für die Controls, klappt aber auch nicht. Kann man irgendwie das mit GDI+ erstellte Bild disabeln?

    Edit: Hab es nun doch geschafft :D , unzwar mit _WinAPI_SetLayeredWindowAttributes von Progandy.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    Global Const $AC_SRC_ALPHA = 1
    Global $pngSrcSettingsBK = "config.png"

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

    HotKeySet("{ESC}", "_Exit")

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

    _GDIPlus_Startup()
    $hImageSettingsBK = _GDIPlus_ImageLoadFromFile($pngSrcSettingsBK)

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

    $Config_GUI = GUICreate("Einstellungen", 600, 450, -1, -1, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_LAYERED))
    _SetBitmap($Config_GUI,$hImageSettingsBK, 255)
    GUISetState()

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

    $Config_GUI_Ctrl = GUICreate("", 600, 450, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $Config_GUI)
    GUISetBkColor(0x585858)
    _WinAPI_SetLayeredWindowAttributes($Config_GUI_Ctrl,0x585858)
    GUICtrlCreateButton("OK", 50, 200, 110, 30)
    $Radio = GUICtrlCreateRadio("Test", 50, 250, 100, 20)
    GUICtrlSetColor($Radio, 0xff0000)
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Exit()
    _GDIPlus_ImageDispose($hImageSettingsBK)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _SetBitmap($hGUI, $hImageBK, $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($hImageBK)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImageBK))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImageBK))
    $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 ;==>SetBitmap

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

    Nun will er aber nicht die Textfarbe von dem Radio-Ctrl nicht verändern, wieso?

    Edit2: Ok habe nun auch dies gelöst mit:

    [autoit]

    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
    $Radio = GUICtrlCreateRadio("Test", 50, 250, 100, 20)
    GUICtrlSetColor(-1, 0xffffff)
    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 3)

    [/autoit]

    Wieso immer so umständlich. *Kopfschüttel*

    3 Mal editiert, zuletzt von m-obi (11. Januar 2010 um 08:49)

  • Hallo m-obi,

    siehe Hilfe: [quote]Checkbox, Radio, Group or Progress controls cannot be painted if the "Windows XP/Vista style" is used./quote]
    Du kannst aber ein Raadiocontrol ohne Text erstellen und dahinter ein Label plazieren,

    mfg (Auto)Bert