_WinAPI_CreateRectRgn Kein Transparent button sondern dauerhafte Transparenz

  • Hallo Leute,

    habe diesen Code aus dem Beispiel für die _WinAPI_CreateRectRgn Funktion

    Ich will die Funktion des $btn_transparent dauerhaft und ohne das ich es extra anklicken muss, es soll schon beim öffnen der GUI transparent sein.

    Weis aber nicht wie ich das Anstellen soll.

    Wäre nett wenn mir jemand helfen könnte.

    Danke

    [autoit]


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

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

    ; Ermittelt die Höhe des Fenstertitels und die Breite des Fensterrahmens - kann je nach XP-Thema variieren.
    Global $htit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
    Global $frame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)

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

    $gui = GUICreate("Teste Fensterregionen", 350, 210)
    $btn_transparent = GUICtrlCreateButton("Transparente Region", 100, 120, 150)
    $btn_exit = GUICtrlCreateButton("Beenden", 100, 150, 150)
    GUISetState(@SW_SHOW)

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

    $pos = WinGetPos($gui) ; Ermittelt die Größe des gesamten Fensters (weil keine Client-Größe bei GUICreate angegeben wurde)
    Global $width = $pos[2]
    Global $height = $pos[3]

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $btn_exit
    ExitLoop

    Case $msg = $btn_transparent ; Transparent
    _GuiHole($gui, 40, 40, 260, 170)

    EndSelect
    WEnd

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

    ; Macht den inneren Bereich transparent (aber Regionen für die Controls werden eingefügt)
    Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn

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

    $outer_rgn = _WinAPI_CreateRectRgn(0, 0, $width, $height)
    $inner_rgn = _WinAPI_CreateRectRgn($i_x, $i_y, $i_x + $i_sizew, $i_y + $i_sizeh)
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_CombineRgn($combined_rgn, $outer_rgn, $inner_rgn, $RGN_DIFF)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $btn_transparent)
    _AddCtrlRegion($combined_rgn, $btn_exit)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole

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

    ; Fügt den Bereich eines Controls einer Region hinzu, dabei werden
    ; Die Größe des Fenstertitels und des Fensterrahmens berücksichtigt.
    Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn

    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0] + $frame, $ctrl_pos[1] + $htit + $frame, _
    $ctrl_pos[0] + $ctrl_pos[2] + $frame, $ctrl_pos[1] + $ctrl_pos[3] + $htit + $frame)
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    EndFunc ;==>_AddCtrlRegion

    [/autoit][autoit][/autoit][autoit][/autoit]
    • Offizieller Beitrag

    Was hindert dich daran die Func _GUIHole nicht schon vor der Schleife aufzurufen?

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2011-06-22 23:01:36
    #EndRegion

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

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

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

    ; Ermittelt die Höhe des Fenstertitels und die Breite des Fensterrahmens - kann je nach XP-Thema variieren.
    Global $htit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
    Global $frame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)

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

    $gui = GUICreate("Teste Fensterregionen", 350, 210)
    $btn_transparent = GUICtrlCreateButton("Transparente Region", 100, 120, 150)
    $btn_exit = GUICtrlCreateButton("Beenden", 100, 150, 150)
    GUISetState(@SW_SHOW)

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

    $pos = WinGetPos($gui) ; Ermittelt die Größe des gesamten Fensters (weil keine Client-Größe bei GUICreate angegeben wurde)
    Global $width = $pos[2]
    Global $height = $pos[3]
    _GuiHole($gui, 40, 40, 260, 170)
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $btn_exit
    ExitLoop

    Case $msg = $btn_transparent ; Transparent
    _GuiHole($gui, 40, 40, 260, 170)

    EndSelect
    WEnd

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

    ; Macht den inneren Bereich transparent (aber Regionen für die Controls werden eingefügt)
    Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn

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

    $outer_rgn = _WinAPI_CreateRectRgn(0, 0, $width, $height)
    $inner_rgn = _WinAPI_CreateRectRgn($i_x, $i_y, $i_x + $i_sizew, $i_y + $i_sizeh)
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_CombineRgn($combined_rgn, $outer_rgn, $inner_rgn, $RGN_DIFF)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $btn_transparent)
    _AddCtrlRegion($combined_rgn, $btn_exit)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole

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

    ; Fügt den Bereich eines Controls einer Region hinzu, dabei werden
    ; Die Größe des Fenstertitels und des Fensterrahmens berücksichtigt.
    Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn

    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0] + $frame, $ctrl_pos[1] + $htit + $frame, _
    $ctrl_pos[0] + $ctrl_pos[2] + $frame, $ctrl_pos[1] + $ctrl_pos[3] + $htit + $frame)
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    EndFunc ;==>_AddCtrlRegion

    [/autoit]