#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 (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