Transparentes Fenster ohne $WS_EX_layered

  • Heyho,

    um es einem anderen Programm zu ermöglichen ein Fenster eines meiner Programme zu erfassen, welches transparent sein soll (nur controls sichtbar), darf dieses transparente Fenster nicht den Windows-Layered Stil verwenden, da es sonst für das Programm nicht "sichtbar" ist.

    Gibt es eine Möglichkeit ein transparentes Fenster ohne $WS_EX_LAYERED zu erstellen?
    GDI+ verwendet ja ebenfalls ein layered Fenster, jedenfalls soweit ich das gesehen habe.

    Entsprechender Code-Auszug:

    Spoiler anzeigen
    [autoit]

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

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

    $W_Overlay = GUICreate("Overlay", 200, 85, -1, -1,$WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
    GUISetFont(10, 1,"", "Arial")
    $Ovl_Ll_Test = GUICtrlCreateLabel("Test", 16, 24, 40, 16,"",$GUI_WS_EX_PARENTDRAG)

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

    GUISetBkColor (0xE7AF22, $W_Overlay)
    _WinAPI_SetLayeredWindowAttributes($W_Overlay, 0xE7AF22, 255)

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

    GUISetState(@SW_SHOW, $W_Overlay)

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]

    2 Mal editiert, zuletzt von Matricus (16. Januar 2012 um 03:04)

  • Du könntest jedes Control in ein eigenes Fenster mt Größe des Controls zeichnen.

    [autoit]

    GUICreate("Button", 100, 20, 100, 100, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    GUICtrlCreateButton("Button1", 0, 0, 100, 20)
    GUISetState()

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

    GUICreate("Button", 100, 20, 300, 300, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    GUICtrlCreateButton("Button2", 0, 0, 100, 20)
    GUISetState()

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

    GUICreate("Button", 100, 20, 500, 500, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    GUICtrlCreateButton("Button3", 0, 0, 100, 20)
    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

    [/autoit]
  • Das bringt mich doch schon mal weiter, Danke.

    Nun müssen sich die erstellten controls nur noch bewegen lassen, was mit $GUI_WS_EX_Parentdrag kein Problem ist, jedoch bewegt sich dann, logischweise, nur 1 control.
    Wie lasse ich nun diese "controlgruppe" (oder Fenster) sich gemeinsam bewegen als wenn alle im selben Fenster wären?

    Gibt es da eine einfachere Methode als es per Event "nachzuschieben":

    Spoiler anzeigen
    [autoit]

    $W_Overlay_Ll1 = GUICreate("OvlMain", 50, 15, 100, 100, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    $Ovl_Ll_test = GUICtrlCreateLabel("test", 0, 0, 50, 15, "", $GUI_WS_EX_PARENTDRAG)
    GUISetState()
    $W_Overlay_Ll2 = GUICreate("Ovl2", 150, 15, 100, 120, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    $Ovl_Dat_test = GUICtrlCreateLabel("test1", 0, 0, 150 ,15)
    GUISetState()

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

    GUICtrlSetOnEvent($Ovl_Ll_Artist, "_GuiMove")

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

    while 1
    sleep(100)
    wend

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

    Func _GuiMove()
    Local $X. $Y, $aPos

    $aPos = WinGetPos("OvlMain")

    $X = $aPos[0]
    $Y = $aPos[1] + 20

    WinMove("Ovl2", "", $X, $Y)
    EndFunc

    [/autoit]