_GUIAutoSize() - für die Faulen unter uns

  • Hallo,

    das war mein Einstieg in das Forum. Inzwischen habe ich mich etwas mehr in AutoIt eingearbeitet, aber ich bin auch eigentlich immer noch zu faul, beim Erstellen eines GUI immer wieder nachzurechnen.

    Hier kommt deshalb eine neue, "AutoIt-likere" Version der Funktion _GUIAutoSize(). Der Funktionskopf enthält eine meiner Meinung nach ausreichende Beschreibung.

    Demo:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "GUIAutoSize.au3"

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

    Opt('MustDeclareVars', 1)
    Dim $Button_1, $Group_1, $Radio_1, $Radio_2, $Radio_3
    Dim $Radio_4, $Radio_5, $Radio_6, $Input_1, $Input_2
    Dim $hGUI, $ButttonText

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

    Opt("GUIOnEventMode", 1)
    Opt("GUICoordMode", 1)
    Opt("GUIResizeMode", $GUI_DOCKALL)

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

    $hGUI = GUICreate("_GUIAutoSize Demo")
    GUISetBkColor(0x80A0FF)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitApp")
    $Button_1 = GUICtrlCreateButton("Inputs einblenden", 20, 20, 120, 40)
    GUICtrlSetOnEvent(-1, "Button_1_Clicked")
    $Group_1 = GUICtrlCreateGroup("Group 1", 20, 90, 165, 160)
    GUIStartGroup()
    $Radio_1 = GUICtrlCreateRadio("Radio &0", 40, 120, 70, 20)
    $Radio_2 = GUICtrlCreateRadio("Radio &1", 40, 150, 60, 20)
    $Radio_3 = GUICtrlCreateRadio("Radio &2", 40, 180, 60, 20)
    GUIStartGroup()
    $Radio_4 = GUICtrlCreateRadio("Radio &A", 110, 120, 70, 20)
    $Radio_5 = GUICtrlCreateRadio("Radio &B", 110, 150, 60, 20)
    $Radio_6 = GUICtrlCreateRadio("Radio &C", 110, 180, 60, 20)
    GUIStartGroup()
    $Input_1 = GUICtrlCreateInput("Input 1", 200, 20, 160)
    $Input_2 = GUICtrlCreateInput("Input 2", 200, 50)
    GUICtrlSetState($Radio_1, $GUI_CHECKED)
    GUICtrlSetState($Radio_6, $GUI_CHECKED)
    GUICtrlSetState($Button_1, $GUI_FOCUS + $GUI_DEFBUTTON)
    GUICtrlSetState($Input_1, $GUI_HIDE)
    GUICtrlSetState($Input_2, $GUI_HIDE)

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

    _GUIAutoSize($hGUI, "C", "C")

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

    GUISetState(@SW_SHOW)

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

    While True
    Sleep(1000)
    WEnd

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

    Func Button_1_Clicked()
    $ButttonText = GUICtrlRead($Button_1)
    If $ButttonText = "Inputs einblenden" Then
    GUICtrlSetState($Input_1, $GUI_SHOW)
    GUICtrlSetState($Input_2, $GUI_SHOW)
    GUICtrlSetData($Button_1, "Inputs ausblenden")
    Else
    GUICtrlSetState($Input_1, $GUI_HIDE)
    GUICtrlSetState($Input_2, $GUI_HIDE)
    GUICtrlSetData($Button_1, "Inputs einblenden")
    EndIf
    _GuiAutoSize($hGUI)
    EndFunc ;==>Button_1_Clicked

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

    Func ExitApp()
    GUIDelete()
    Exit
    EndFunc ;==>ExitApp

    [/autoit]


    _GUIAutoSize.au3:

    Spoiler anzeigen
    [autoit]

    #include-once
    ; #INDEX# =======================================================================================================================
    ; Title .........: GUIAutoSize
    ; AutoIt Version : 3.3.6.1
    ; Description ...: Funktionen für die automatische Größenanpassung eines GUI.
    ; Author(s) .....: Großvater
    ; Dll ...........:
    ; ===============================================================================================================================

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

    ; #CURRENT# =====================================================================================================================
    ; _GUIAutoSize
    ; ===============================================================================================================================

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUIAutoSize
    ; Description ...: Passt die Größe eines GUI an die sichtbaren Controls an.
    ; Der Abstand zum rechten Fensterrand wird dem minimalen linken,
    ; der Abstand zum unteren Fensterrand dem minimalen oberen angeglichen.
    ; Controls, die per GUICtrlSetState($CtrlID, $GUI_HIDE) ausgeblendet
    ; wurden oder denen auf andere Weise der Style $WS_VISIBLE entzogen
    ; wurde, werden nicht berücksichtigt. Sie können so am rechten oder
    ; unteren Rand ein- und ausgeblendet werden.
    ; Syntax.........: _GuiAutoSize($hGUI [, $GUIX = Default [, $GUIY = Default]])
    ; Parameters ....: $hGUI - HWND des GUI
    ; $GUIX - X-Position der linken oberen Ecke des GUI:
    ; |n - Integer: Neue Position (Bildschirmkoordinaten in Pixeln)
    ; |"C" - String: Das GUI wird horizontal zentriert (center)
    ; |Default - Keine Änderung der Position
    ; $GUIY - Y-Position der linken oberen Ecke des GUI:
    ; |n - Integer: Neue Position (Bildschirmkoordinaten in Pixeln)
    ; |"C" - String: Das GUI wird vertikal zentriert (center)
    ; |Default - Keine Änderung der Position
    ; Return values .: Bei erfolgreicher Ausführung: True
    ; Im Fehlerfall: False, @error wird auf 1 gesetzt und @extended auf
    ; |1 : Parameter $hGUI ist ungültig
    ; |2 : Fehler beim DLLCall "GetWindow"
    ; |3 : Keine Controls für die Größenberechnung gefunden
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......: Das GUI muss mit der Option Opt("GUIResizeMode", $GUI_DOCKALL) und sollte ohne
    ; Parameter für Breite und Höhe in der Funktion GUICreate() erstellt werden.
    ; Anderenfalls können einige Controls bei der Größenanpassung verschoben werden,
    ; weil das GUI die Aktion als Resize behandelt.
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUIAutoSize($hGUI, $GUIX = Default, $GUIY = Default)
    Local Const $GW_CHILD = 0x5
    Local Const $GW_HWNDNEXT = 0x2
    Local Const $GWL_STYLE = 0xFFFFFFF0
    Local Const $WS_VISIBLE = 0x10000000
    Local $aClient, $aHwnd, $aID, $aPos, $aStyle, $NCW, $NCH
    ; ---------------------------------------------------------------------------------------------------------------------------
    ; Dimensionen des NonClient-Bereichs des Fensters ermitteln
    If Not IsHWnd($hGUI) Then Return SetError(1, 1, False)
    $aPos = WinGetPos($hGUI)
    $aClient = WinGetClientSize($hGUI)
    $NCW = $aPos[2] - $aClient[0]
    $NCH = $aPos[3] - $aClient[1]
    ; ---------------------------------------------------------------------------------------------------------------------------
    ; Positionen der Controls ermitteln
    Local $aSize[4] = [999999, 999999, 0, 0]
    $aHwnd = DllCall("User32.dll", "HWND", "GetWindow", "HWND", $hGUI, "UInt", $GW_CHILD)
    If @error Or $aHwnd[0] = 0 Then Return SetError(1, 2, False)
    While $aHwnd[0]
    $aStyle = DllCall("User32.dll", "Long", "GetWindowLong", "HWND", $aHwnd[0], "Int", $GWL_STYLE)
    If BitAND($aStyle[0], $WS_VISIBLE) = $WS_VISIBLE Then
    $aID = DllCall("User32.dll", "Int", "GetDlgCtrlID", "HWND", $aHwnd[0])
    $aPos = ControlGetPos($hGUI, "", $aID[0])
    $aPos[2] += $aPos[0]
    $aPos[3] += $aPos[1]
    If $aPos[0] < $aSize[0] Then $aSize[0] = $aPos[0]
    If $aPos[1] < $aSize[1] Then $aSize[1] = $aPos[1]
    If $aPos[2] > $aSize[2] Then $aSize[2] = $aPos[2]
    If $aPos[3] > $aSize[3] Then $aSize[3] = $aPos[3]
    EndIf
    $aHwnd = DllCall("User32.dll", "HWND", "GetWindow", "HWND", $aHwnd[0], "UInt", $GW_HWNDNEXT)
    If @error Then Return SetError(1, 2, False)
    WEnd
    If $aSize[0] = 999999 Then Return SetError(1, 3, False)
    ; ---------------------------------------------------------------------------------------------------------------------------
    ; Fenster anpassen
    Local $GUIW = $aSize[2] + $aSize[0] + $NCW
    Local $GUIH = $aSize[3] + $aSize[1] + $NCH
    If $GUIX = "C" Then $GUIX = (@DesktopWidth - $GUIW) / 2
    If $GUIY = "C" Then $GUIY = (@DesktopHeight - $GUIH) / 2
    WinMove($hGUI, "", $GUIX, $GUIY, $GUIW, $GUIH, 1)
    Return True
    EndFunc ;==>_GUIAutoSize

    [/autoit]
    • Offizieller Beitrag

    Interessantes Script, das kann man immer brauchen. Kommt gleich in meine Sammlung. :thumbup:

    Wenn jemand Interesse an einem weiteren GUI Exchanger hat, mir ist da noch was in die Finger gefallen.
    http://www.autoitscript.com/forum/topic/11…-version-30910/