GUIAutoSize?

  • Moin,

    wie ihr seht, bin ich neu hier. Ich habe einige Zeit mit AutoHotkey verbracht, will mich jetzt aber mit AutoIt beschäftigen.

    Meine Vorstellung, AutoIt sei im Prinzip eine "modernere" Version von AutoHotkey, stimmt leider nicht 100-prozentig. So gibt es ein paar Sachen, die ich vermisse, u.a. die automatische Größenberechnung des GUI anhand der sichtbaren Controls (Option: AutoSize). Ich habe mit dem Suchbegriff "AutoSize" auch im englischen Forum gesucht, aber nichts passendes gefunden.

    Lange Rede, kurzer Sinn: Gibt es so etwas schon (und wenn ja, wo?) oder muss man sich das selbst schreiben?

    Einmal editiert, zuletzt von Großvater (20. August 2010 um 06:57)

    • Offizieller Beitrag

    Als Erstes Herzlich Willkommen im Forum.

    Meine Vorstellung, AutoIt sei im Prinzip eine "modernere" Version von AutoHotkey, stimmt leider nicht 100-prozentig.


    Das ist nicht ganz richtig. Es ist eine Parallelentwicklung zu AHK mit anderen Schwerpunkten. Was Maus-, Tastatur- u. einige andere Dinge im GUI-Handling betrifft ist AHK ausgereifter. Andere Bereiche sind wiederum in AutoIt wesentlich flexibler und komfortabler.
    Sieh beide als Geschwisterpaar, in dem sich AHK zum Künstler und AutoIt zum Ingenieur entwickelt. Das trifft in etwa den Status. ;)

    AutoSize ist als native Funktion nicht vorhanden. Ich bin mir aber ziemlich sicher, dass jemand dazu schon eine eigene Funktion erstellt hat. Wenn du hier in der Suche nicht fündig wirst, schau auch mal bei unseren Brüdern im EN-Forum nach.

  • Hi,

    sowas würde mich sogar reizen eine Funktion dafür zu schreiben.
    Die größe eines Fensters kann man ja über die _WinApi Befehle abfragen.
    Geht das auch mit Controls?

    Edith sagt: Habs selbst rausgefunden, werd mich mal dranmachen :)

    Gruß

    Prajoss

    "Never touch a running System!"

    Einmal editiert, zuletzt von Prajoss (17. August 2010 um 12:12)

  • Moin,

    erst einmal meinen Dank für die Begrüßung und das Hilfsangebot.

    Ich hätte nicht danach gefragt, wenn ich im EN-Forum etwas gefunden hätte, doch das kann gut an mir liegen, denn die Suche im WWW ist definitiv mein Feind.

    Ich hätte auch nicht gefragt, wenn ich mir nicht schon ein paar Gedanken über das Thema gemacht hätte. So habe ich bei der Umsetzung einen kleinen Vorsprung:

    _GUIAutoSIze()
    [autoit]

    #include-once

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

    #include <Constants.au3>
    #include <WindowsConstants.au3>

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

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

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

    ; #VARIABLES# ===================================================================================================================
    Global $_GuiAutoSize_aPos[4]
    ; ===============================================================================================================================

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

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

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

    ; #INTERNAL_USE_ONLY# ===========================================================================================================
    ;__GUIAutoSize_Callback
    ; ===============================================================================================================================

    [/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 wird dem minamalen oberen angeglichen.
    ; Syntax.........: _GuiAutoSize($hGUI [, $GX = Default [, $GY = Default]])
    ; Parameters ....: $hGUI - HWND des GUI
    ; $GX- Linker Rand des GUI:
    ; |n - Integer: Neue Position (Bildschirmkoordinaten in Pixeln)
    ; |"Center" - String: Das GUI wird horizontal zentriert
    ; |Default - Keine Änderung der Position
    ; $GY- Rechter Rand des GUI:
    ; |n - Integer: Neue Position (Bildschirmkoordinaten in Pixeln)
    ; |"Center" - String: Das GUI wird vertikal zentriert
    ; |Default - Keine Änderung der Position
    ; Return values .: Bei erfolgreicher Ausführung: True, im Fehlerfall: False
    ; Author ........: Großvater
    ; Modified.......:
    ; Remarks .......: Das GUI muss mit der Option Opt("GUIResizeMode", $GUI_DOCKALL) und ohne
    ; Parameter für Breite und Höhe in der Funktion GUICreate() erstellt
    ; werden, sonst verschieben sich einige Controls bei der Größenanpassung,
    ; weil das GUI die Aktion als Resize behandelt.
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _GuiAutoSize($hGUI, $GX = Default, $GY = Default)
    Local Const $tagWINDOWINFO = "DWORD cbSize;" & _
    "long rcWindow[4];" & _
    "long rcClient[4];" & _
    "DWORD dwStyle;" & _
    "DWORD dwExStyle;" & _
    "DWORD dwWindowStatus;" & _
    "UINT cxWindowsBorders;" & _
    "UINT cyWindowsBorders;" & _
    "WORD atomWindowType;" & _
    "WORD wCreatorVersion"
    Local $WINDOWINFO = DllStructCreate($tagWINDOWINFO)
    DllStructSetData($WINDOWINFO, "cbSize", DllStructGetSize($WINDOWINFO))
    DllCall("user32.dll", "none", "GetWindowInfo", _
    "hwnd", $hGUI, _
    "ptr", DllStructGetPtr($WINDOWINFO))
    If @error Then
    SetError(1, 1, False)
    EndIf
    Local $WL, $WT, $WR, $WB ; Window Rect
    $WL = DllStructGetData($WINDOWINFO, "rcWindow", 1)
    $WT = DllStructGetData($WINDOWINFO, "rcWindow", 2)
    $WR = DllStructGetData($WINDOWINFO, "rcWindow", 3)
    $WB = DllStructGetData($WINDOWINFO, "rcWindow", 4)
    Local $CL, $CT, $CR, $CB ; Client Rect
    $CL = DllStructGetData($WINDOWINFO, "rcClient", 1)
    $CT = DllStructGetData($WINDOWINFO, "rcClient", 2)
    $CR = DllStructGetData($WINDOWINFO, "rcClient", 3)
    $CB = DllStructGetData($WINDOWINFO, "rcClient", 4)
    Local $WBX, $WBY ; Window Borders
    $WBX = DllStructGetData($WINDOWINFO, "cxWindowsBorders")
    $WBY = DllStructGetData($WINDOWINFO, "cyWindowsBorders")
    $_GuiAutoSize_aPos[0] = $CR
    $_GuiAutoSize_aPos[1] = $CB
    $_GuiAutoSize_aPos[2] = $CL
    $_GuiAutoSize_aPos[3] = $CT
    Local $hCB = DLLCallbackRegister("__GUIAutoSize_Callback", "int", "HWND;LPARAM")
    DllCall("user32.dll", "int", "EnumChildWindows", _
    "HWND", $hGUI, _
    "ptr", DllCallbackGetPtr($hCB), _
    "LPARAM", 0)
    If @error Then
    DllCallbackFree($hCB)
    SetError(1, 2, False)
    EndIf
    DllCallbackFree($hCB)
    Local $XM, $YM, $GW, $GH
    $XM = $_GuiAutoSize_aPos[0] - $CL
    $YM = $_GuiAutoSize_aPos[1] - $CT
    $GW = $_GuiAutoSize_aPos[2] - $WL + $XM + $WBX
    $GH = $_GuiAutoSize_aPos[3] - $WT + $YM + $WBY
    If $GX = "Center" Then
    $GX = (@DesktopWidth - $GW) / 2
    EndIf
    If $GY = "Center" Then
    $GY = (@DesktopHeight - $GH) / 2
    EndIf
    WinMove($hGUI, "", $GX, $GY, $GW, $GH, 1)
    Return True
    EndFunc
    ; #INTERNAL_USE_ONLY# ===========================================================================================================
    ; Name...........: __GUIAutoSize_Callback
    ; Description ...: Callback-Function für DLLCall "EnumChildWindows"
    ; Syntax.........:
    ; Parameters ....: $hWnd - HWND des Fensters
    ; $lParam - Zusätzlicher Übergabewert der aufrufenden Funktion (hier: 0)
    ; Return values .:
    ; Author ........: Großvater
    ; Modified.......:
    ; Remarks .......: Diese Funktion wird intern innerhalb der Funktion _GUIAutoSize aufgerufen
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func __GUIAutoSize_Callback($hWnd, $lParam)
    Local $aResult
    $aResult = DllCall("user32.dll", "long", "GetWindowLong", _
    "HWND", $hWnd, _
    "int", $GWL_STYLE)
    If BitAND($aResult[0], $WS_VISIBLE) <> $WS_VISIBLE Then
    Return True
    EndIf
    $aResult = WinGetPos($hWnd)
    If @error Then
    SetError(1, 2, False)
    EndIf
    $aResult[2] += $aResult[0]
    $aResult[3] += $aResult[1]
    If $aResult[0] < $_GuiAutoSize_aPos[0] Then
    $_GuiAutoSize_aPos[0] = $aResult[0]
    EndIf
    If $aResult[1] < $_GuiAutoSize_aPos[1] Then
    $_GuiAutoSize_aPos[1] = $aResult[1]
    EndIf
    If $aResult[2] > $_GuiAutoSize_aPos[2] Then
    $_GuiAutoSize_aPos[2] = $aResult[2]
    EndIf
    If $aResult[3] > $_GuiAutoSize_aPos[3] Then
    $_GuiAutoSize_aPos[3] = $aResult[3]
    EndIf
    Return True
    EndFunc

    [/autoit]
    Demo (aus der Hilfe geklaut und abgewandelt)
    [autoit]

    #include <GUIConstantsEx.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 $radioval1, $radioval2, $Msg, $hGUI, $ButttonText

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

    Opt("GUICoordMode", 1)
    Opt("GUIResizeMode", $GUI_DOCKALL)
    $hGUI = GUICreate("_GUIAutoSize Demo")
    ; Create the controls
    $button_1 = GUICtrlCreateButton("Inputs einblenden", 20, 20, 120, 40)
    $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)

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

    ; Set the defaults (radio buttons clicked, default button, etc)
    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)
    ; Init our vars that we will use to keep track of radio events
    $radioval1 = 0; We will assume 0 = first radio button selected, 2 = last button
    $radioval2 = 2

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

    _GUIAutoSize($hGUI, Default, Default)
    GUISetState(@SW_SHOW)

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

    ; Run the GUI until the dialog is closed
    While True
    $Msg = GUIGetMsg()
    Select
    Case $Msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $Msg = $button_1
    $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)
    EndSelect
    WEnd
    GUIDelete()
    Exit

    [/autoit]


    Wie gesagt, ich habe mit AutoIt noch nicht viel Erfahrung, darum wäre ich für jedwede Kritik oder Verbesserungsvorschläge dankbar.