Resizing bei Nicht-Standard-Controls, z.B. _GUICtrlListView_Create

    • Offizieller Beitrag

    Hi,
    wie schon einige leidvoll bemerkt haben, funktionieren in den neuen Funktionen die Standardroutinen von AutoIt nicht mehr.
    Somit muß man hier eigene Funktionen erstellen, die diese Funktionalität wiederherstellen.
    Ich habe jetzt die Funktion
    _ResizeCtrl($hWnd, $hCtrl, $aSzWnd, $aSzCtrl) erstellt.
    • $hWnd - Handle/ID des Fensters
    • $hCtrl - Handle/ID des Controls
    • $aSzWnd - Array mit Angaben Fenstergröße [WinGetPos()] bei Erstellung
    • $aSzCtrl - Array mit AngabenControlgröße [ControlGetPos()] bei Erstellung

    Hiermit wird Größe und Position des Controls bei Größenänderung der GUI angepaßt.
    Ich habe mich nur auf die Basisfunktion beschränkt, wer mag kann ja gerne noch um die verschiedenen Dock-Varianten erweitern.
    Auslöser für dir Funktion ist das Ereignis $GUI_EVENT_RESIZED.
    Da die Größenänderung/Positionierung im Verhältnis zu den Parametern der Controlerstellung steht, müssen sowohl Fenster- als auch Controlgrößenangaben an die Funktion übergeben werden.
    Dazu einfach WinGetPos() und ControlGetPos() verwenden, dann sind die Angaben auch gleich im passenden Format.
    Bei Verwendung von GUIGetMsg() muß dann nur abgefragt werden ob $msg = $GUI_EVENT_RESIZED und dann kann die Funktion mit den Parametern aufgerufen werden.
    Im OnEvent-Mode ist für das Ereignis eine parameterlose Funktion anzugeben, die dann ihrerseits _ResizeCtrl() mit Parametern aufruft - Grund: An mit OnEvent ausgelöste Funktionen können keine Parameter übergeben werden.

    Hier mal mit einem Bsp.: Standard-Combo vs. _GUICtrlComboBoxEx_Create und _GUICtrlListView_Create

    Spoiler anzeigen
    [autoit]

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

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

    $gui = GUICreate('Test Combo',700,600,-1,-1,$GUI_SS_DEFAULT_GUI + $WS_SIZEBOX)
    $combo = _GUICtrlComboBoxEx_Create($gui,'',110,10,100)
    GUICtrlCreateLabel('mit: _GUICtrlComboBoxEx_Create()', 250, 13, 150, 40)
    $comboStandard = GUICtrlCreateCombo('',110,110,100)
    GUICtrlCreateLabel('mit: GUICtrlCreateCombo()', 250, 113, 150, 40)
    $lv = _GUICtrlListView_Create($gui, 'Bla|Blub|Tralala', 16,200,658,380)
    GUISetState()
    Global $szWnd = WinGetPos($gui)
    Global $szCombo = ControlGetPos($gui, '', $combo)
    Global $szLV = ControlGetPos($gui, '', $lv)

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

    Do
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_RESIZED Then
    _ResizeCtrl($gui, $combo, $szWnd, $szCombo)
    _ResizeCtrl($gui, $lv, $szWnd, $szLV)
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

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

    ;===============================================================================
    ;
    ; Function Name: _ResizeCtrl($hWnd, $hCtrl, $aSzWnd, $aSzCtrl)
    ; Description:: Move a Control after Resize in relative position to the window there is in
    ; Parameter(s): $hWnd - Handle/ID main-window
    ; $hCtrl - Handle/ID control to move
    ; $aSzWnd - Array with start size of window; $ar[4] = [X position, Y position, Width, Height]
    ; $aSzCtrl - Array with start size of control; $ar[4] = [X position, Y position, Width, Height]
    ; Requirement(s): $GUI_EVENT_RESIZED (get with GUIGetMsg() or in OnEvent-Mode: GUISetOnEvent($GUI_EVENT_RESIZED, 'Func')
    ; Note for OnEventMode:
    ; You need a function that calls _ResizeCtrl() because GUISetOnEvent allows no parameters.
    ; Return Value(s): on Success - 1
    ; on Failure - 0 and set @error
    ; @error = 1 window not found
    ; @error = 2 control not found
    ; @error = 3 array for size window or control not given
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;
    ;===============================================================================
    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]
  • DANKE! Das hab ich gebraucht. BIn grade am testen :)

    Edit: Eig. perfekt bis auf einen kleinen Fehler: Ich habe unter einem ListView einen Button. Wenn ich nun das Fenster großziehe Wird das ListView zwar größer aber nicht großgenug sodass leerer Platz zwischen Button und ListView entsteht. Lässt sich da was machen?

    Einmal editiert, zuletzt von Carsten8 (30. Dezember 2007 um 16:06)