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
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "GUIAutoSize.au3"
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
Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
Opt("GUIResizeMode", $GUI_DOCKALL)
$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)
_GUIAutoSize($hGUI, "C", "C")
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While True
Sleep(1000)
WEnd
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
Func ExitApp()
GUIDelete()
Exit
EndFunc ;==>ExitApp
_GUIAutoSize.au3:
Spoiler anzeigen
#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 ...........:
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
; _GUIAutoSize
; ===============================================================================================================================
; #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