Resize auf UDF erzeugte Controls

  • Hi,
    ich habe einige UDF erzeugte Controls wie z.B.

    [autoit]

    Global $hTab = _GUICtrlTab_Create($hGUI, 10, 10, 1007, 730)

    [/autoit]

    Meinem Script habe ich

    [autoit]

    Opt("GUIResizeMode",$GUI_DOCKAUTO) ; auto resize all elements

    [/autoit]

    gegönnt.

    So werden alle mit Standardfunktionen erzeugten Controls beim Fenstermaximieren oder skalieren proportional geändert.
    Nur leider werden die UDF-erzeugten Controls nicht vergrößert. Ich habe bisher keine Möglichkeit gefunden dies zu realisieren.

    [autoit]

    GUICtrlSetResizing()

    [/autoit]

    funktioniert nicht mit UDF-erzeugten Controls.

  • Das Problem ist, die Funktion wird von AutoIt bereit gestellt, so das du im Prinzip keinen Einfluss darauf hast. Die Frage ist, warum Controls die mit einer UDF erstellt wurden, ignoriert werden...

    Mit mäßigem Aufwand, kann man eine eigene Auto-Resize Funktion erstellen.

    Mit der Funktion "_WinAPI_EnumChildWindows", bekommt man alle Handle's der Steuerelemente, die auf der Form sind.
    Dann ließt du einfach die Array-Größe aus und machst ne For Next Schleife, in welcher die Größe und Position der Steuerelemente mit Hilfe der Handle's ausgelesen werden und auf die aktuelle Formgröße umberechnet werden. Die Funktion führst du immer dann aus, wenn du ein "$GUI_EVENT_RESIZED" bekommst.

    Das gute daran ist, diese Funktion ist universell für jede Form nutzbar, wenn man sie einmal hat, dann hat man sie.

    Vielleicht gibt es ja auch bereits jemanden, der diese Funktion geschrieben hat?
    Vermutlich eher weniger, da man im Normalfall ja die integrierte Resize Funktion nutzen kann...

    Edit:
    Ja es gibt jemanden, der zumindest schon 80% erledigt hat:
    Siehe hier:
    https://autoit.de/index.php/Thre…istView-Create/

    Wenn du das mit dem ChildEnum kombinierst, hast du eine Funktion in der Tasche, die du auch in Zukunft ohne zusätzlichen Code, auf jeder Form nutzen kannst.

    2 Mal editiert, zuletzt von KloMeister (27. November 2014 um 13:57)

  • ich habe das ganze mal gebaut mit dem automatischen Child Enum. Lustigerweise reagiert die Listview, die mit "_GUICtrlListView_Create" wurde, wiedermal nicht :D .

    Interessant ist auch, dass die Buttons sich zwar in ihrer Position ändern, aber nicht in ihrer Größe... Andere Steuerelemente funktionieren einwandfrei.


    Hier trotzdem der Code, da er ja mit normalen Steuerelementen teils funktioniert (Hilft dir zwar nicht, aber Anderen eventuell):

    Es reicht nun, wenn die beiden unteren Funktionen im Code vorhanden sind.

    Mit der Funktion "Resize_All($FensterGui)" lassen sich nun automatisch alle Steuerelemente die sich auf der Form befinden ansprechen und der Fenstergröße entsprechend resizen. Diese Funktion sollte idealerweise dann mit dem Resize Event ausgelöst werden.


    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <GuiComboBoxEx.au3>
    #Include <GuiListView.au3>
    #include <WinAPISys.au3>

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

    $gui = GUICreate('Test Combo',700,600,-1,-1,$GUI_SS_DEFAULT_GUI + $WS_SIZEBOX)

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

    $Button1 = GUICtrlCreateButton("Button1", 280, 136, 289, 81)
    $Edit1 = GUICtrlCreateEdit("", 8, 136, 209, 81)
    GUICtrlSetData(-1, "Edit1")
    $Group1 = GUICtrlCreateGroup("Group1", 16, 232, 185, 113)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button2 = GUICtrlCreateButton("Button2", 216, 136, 49, 81)
    $List1 = GUICtrlCreateList("", 16, 16, 121, 97)
    $Combo1 = GUICtrlCreateCombo("Combo1", 184, 40, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    $Slider1 = GUICtrlCreateSlider(192, 72, 150, 45)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $lv = _GUICtrlListView_Create($gui, 'Bla|Blub|Tralala', 16,350,658,380)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_RESIZED Then
    _Resize_All($gui)
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

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

    Func _Resize_All ($hForm_Resize)
    Global $szWnd = WinGetPos($hForm_Resize)
    Global $DataChilds = _WinAPI_EnumChildWindows($hForm_Resize)
    Global $ChildArray
    for $ChildArray = 1 to UBound($DataChilds) -1
    Global $szElement = ControlGetPos($hForm_Resize, '', $DataChilds[$ChildArray][1])
    _ResizeCtrl($szWnd, $DataChilds[$ChildArray][1], $hForm_Resize, $szElement)
    next
    EndFunc

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

    ;===============================================================================
    ; Function Name: _ResizeCtrl($hWnd, $hCtrl, $aSzWnd, $aSzCtrl)
    ; ....
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================

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

    Func _ResizeCtrl($hWnd, $hCtrl, $aSzWnd, $aSzCtrl)
    Local $WinSize = WinGetPos($hWnd)
    If @error Then Return SetError(1)
    If ControlGetHandle($hWnd, '', $hCtrl) = '' Then Return SetError(2)
    If (Not IsArray($aSzWnd)) Or (Not IsArray($aSzCtrl)) Then Return SetError(3)
    Local $saveMode = Opt('GUICoordMode',1)
    Local $newWidth = Round($WinSize[2]*($aSzCtrl[2]/$aSzWnd[2]))
    Local $newHeight = Round($WinSize[3]*($aSzCtrl[3]/$aSzWnd[3]))
    Local $newX = Round($WinSize[2]*($aSzCtrl[0]/$aSzWnd[2]))
    Local $newY = Round($WinSize[3]*($aSzCtrl[1]/$aSzWnd[3]))
    ControlMove($hWnd, '', $hCtrl, $newX, $newY, $newWidth, $newHeight)
    Opt('GUICoordMode',$saveMode)
    Return 1
    EndFunc ;==>_ResizeCtrl

    [/autoit]

    Aber im Grunde haben wir wieder das selbe, wie AutoIt schon standardmäßig kann. Kleiner Vorteil daran ist vielleicht, das man diese Funktion auch an fremden Fenstern nutzen könnte.

    3 Mal editiert, zuletzt von KloMeister (27. November 2014 um 15:00)