GUI Transparent machen

  • Hallo Leute,

    ich versuche zurzeit ein Aero-Fenster nachzubauen indem ich eine GUI erstelle und mit GDI+ eine PNG draufpinsel.
    Das funktioniert zwar aber ich bekomm den GUI-Hintergrund nicht weg. Vielleicht weiss einer Rat. ;)
    Weiterhin versuche ich noch die GUI-Titelleiste wegzubekommen.

    Hier mal der Quelltext:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    _GDIPlus_Startup()

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

    #region - GUI Create
    HotKeySet("{Esc}","_close")
    HotKeySet("{Home}","WM_PAINT")
    Opt("GUIOnEventMode",1)
    $gui = GUICreate('Test Gui in GDI+',800,800,80,80,$GUI_SS_DEFAULT_GUI,$WS_EX_TRANSPARENT)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
    $hImg = _GDIPlus_ImageLoadFromFile(@ScriptDir&"\Unbenannt-1.png")

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

    GUISetOnEvent($GUI_EVENT_CLOSE,"_close")
    GUIRegisterMsg(0x000F,"WM_PAINT")
    GUISetState()
    #endregion

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

    While 1
    Sleep(100)
    WEnd

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic,$hImg,0,0,800,800)
    EndFunc

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

    Func _close()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImg)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Danke schonmal ;)

    Daniel

  • Hab ich schon probiert... funktioniert auch nur ist dann die ganze GUI transparent und somit auch die PNG.
    Danke trotzdem für deinen Tipp ;)

  • Wenn du Win Vista oder 7 hast, kannst du ja das echte Glass verwenden, die DLLCalls hab ich schon mal irgendwo gesehen.

  • Ineluki:
    Habe ich schon aber nichts brauchbares gefunden.

    @progandy:
    Ich benutze Win7 und hab auch die DllCalls da aber da ist das problem dass die Button- bzw. Labelbeschriftungen nicht sichtbar sind und ich keine Ahnung von Dll's hab sodass ich das ändern könnte.

    @Sprenger:
    Diesen Thread habe ich auch gelesen allerdings nichts gefunden was mir hilft.

    Habt bitte Nachsicht ist mein erstes Script mit GDI+ ;)

  • @progandy:
    Ich benutze Win7 und hab auch die DllCalls da aber da ist das problem dass die Button- bzw. Labelbeschriftungen nicht sichtbar sind und ich keine Ahnung von Dll's hab sodass ich das ändern könnte.


    Du kannst das Fenster zweiteilen. Einmal den Hintergrund und einmal WS_EX_LAYERED + WS_EX_MDICHILD dazu, das die Controls aufnimmt.

    Spoiler anzeigen
    [autoit]

    #include<WindowsConstants.au3>
    #include<WinAPI.au3>
    $hGUI = GUICreate("Master", 300, 400)
    GUISetBkColor(0xFF0000)
    GUISetState()
    ; set glass to $hGUI

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

    $hControlGUI = GUICreate("Controls", 300, 400, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI)
    GUISetBkColor(0xABCDEF)
    GUICtrlCreateLabel("test", 10, 10, 100, 200)
    _WinAPI_SetLayeredWindowAttributes($hControlGUI, 0xABCDEF)
    GUISetState()

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

    While GUIGetMsg() <> -3
    WEnd

    [/autoit]
  • @progandy :
    hat super geklappt vielen Dank.
    Nun hab ich noch ein weiteres Problem.
    Der Button den ich in der zweiten darübergelegten GUI (also die control Gui) kreiert hab, lässt sich nicht anklicken.

    Ansonsten sieht das Teil prima aus.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include "VistaGlass.au3"

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

    HotKeySet("{Esc}","_exit")

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

    Opt("GUIOnEventMode",1)
    $hGUI = GUICreate("Master", 300, 400)
    GUISetBkColor(0xFF0000)
    GUISetState()
    ; set glass to $hGUI

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

    $checkDWM = _Vista_ICE()

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

    If $checkDWM <> 0 Then
    _Vista_ApplyGlass($hGUI)
    EndIf

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

    $hControlGUI = GUICreate("Controls", 300, 400, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI)
    GUISetBkColor(0xABCDEF)
    GUICtrlCreateLabel("test", 10, 10, 100, 200)
    GUICtrlCreateButton("Test-Button",20,20)
    GUICtrlSetOnEvent(-1,"_msgbox")
    _WinAPI_SetLayeredWindowAttributes($hControlGUI, 0xABCDEF)
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _msgbox()
    MsgBox(64,"","Klappt")
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    VistaGlass.au3 wird gebraucht. Die UDF funktioniert nur mit Windows 7 und Vista. (Bei Vista müssen ein paar Änderungen vorgenommen werden in Zeile 50, 83 und 122)

    LG
    Daniel

  • vielleicht schreib mal bei guictrlsetonEvent() das Handle von dem Button, das du ihm aber vorher noch geben musst??

  • Also bei mir klappt alles bestens

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include "VistaGlass.au3"

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

    $hGUI = GUICreate("Master", 300, 400)
    GUISetBkColor(0xFF0000)
    GUISetState()
    ; set glass to $hGUI

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

    $checkDWM = _Vista_ICE()

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

    If $checkDWM <> 0 Then
    _Vista_ApplyGlass($hGUI)
    EndIf

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

    $hControlGUI = GUICreate("Controls", 300, 400, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI)
    GUISetBkColor(0xABCDEF)
    $hallo=GUICtrlCreateButton("Test-Button",20,20)
    _WinAPI_SetLayeredWindowAttributes($hControlGUI, 0xABCDEF)
    GUISetState()

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

    While 1
    $msg=GUIGetMsg()
    Select
    Case $msg=$GUI_EVENT_CLOSE
    Exit
    Case $msg = $hallo
    MsgBox(0,"","hallo")
    EndSelect
    WEnd

    [/autoit]