"Schwebende" Button - Skriptbeispiel

    • Offizieller Beitrag

    Hi,
    ich hab gerade die neue Version 3.3.0.0 angeschaut und fand ein Winapi-Skript ganz interessant. Ich habe das Bsp. mal etwas entschlackt und leicht verändert.
    Ergebnis ist eine nicht sichbare GUI - nur die Button werden angezeigt. Das Skript ist jetzt für GUI mit POPUP-Style angepaßt. Soll die Titelleiste angezeigt werden, müssen die Parts für die Systemmetrics wieder integriert werden (s. Bsp. bei _WinAPI_CreateRoundRectRgn).

    Spoiler anzeigen
    [autoit]

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

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

    Global $aButton[5]

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

    $gui = GUICreate("Test Windows regions", 150, 150, @DesktopWidth-170, -1, $WS_POPUP, $WS_EX_TOPMOST)
    $aButton[0] = GUICtrlCreateButton("Button 1", 0, 0, 150)
    $aButton[1] = GUICtrlCreateButton("Button 2", 0, 30, 150)
    $aButton[2] = GUICtrlCreateButton("Button 3", 0, 60, 150)
    $aButton[3] = GUICtrlCreateButton("Button 4", 0, 90, 150)
    $aButton[4] = GUICtrlCreateButton("Exit", 0, 120, 150)
    GUISetState(@SW_SHOW)

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

    $pos = WinGetPos($gui)
    _GuiHole($gui, 0, 0, 150, 150)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $aButton[4]
    ExitLoop
    Case $aButton[0]
    MsgBox(0, '', 'Button1 geklickt')
    Case $aButton[1]
    MsgBox(0, '', 'Button2 geklickt')
    Case $aButton[2]
    MsgBox(0, '', 'Button3 geklickt')
    Case $aButton[3]
    MsgBox(0, '', 'Button4 geklickt')
    EndSwitch
    WEnd

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

    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, $aButton)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole

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

    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]
  • Wenn ich das Scrip starte zeigt er folgendes an:

    Spoiler anzeigen

    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3(48,72) : WARNING: $RGN_OR: possibly used before declaration.
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3(48,72) : ERROR: $RGN_OR: undeclared global variable.
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3(35,53) : ERROR: _WinAPI_CreateRectRgn(): undefined function.
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3(39,47) : ERROR: _WinAPI_SetWindowRgn(): undefined function.
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3(48,72) : ERROR: _WinAPI_CombineRgn(): undefined function.
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Hendrik\Favoriten\Eigene Dateien\AutoIt\4.au3 - 4 error(s), 1 warning(s)

    mfg. Jam00

    • Offizieller Beitrag

    Lies mal die 1. Post genau . Achte mal auf die Autoitversion .

    Edit:

    BugFix woher hast du die 3.3.0.0 ? Im Englischen Forum und auf der Downloadseite steht zwar das es die gibt, ist aber kein Downloadlink zu finden .

    Edit2: Hat sich erledigt. Habe nach einer Beta gesucht. Is ja keine Beta .Ist von Vorteil wenn man richtig liest . :P8)

    • Offizieller Beitrag

    GtaSpider ich bemerke da keinen Unterschied. Ich versteh auch nicht den rechten Sinn der 2 Zeilen. Die Vars $inner_rgn und $outer_rgn werden zwar in der Func als Local declariert , aber ich sehe nicht das Ihnen ein Wert zugewiesen wird .Oder hab ich Christbaumkugeln auf den Augen ? ;(

    Edit: Im Original Hilfescript steht das in der Func _GuiHole:

    [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)

    [/autoit]

    also denke ich mal das brauch man im Script von BugFix nicht da die Zeilen nicht enthalten sind .