Wie Breite von Tab-Objekt und GUI dynamisch ändern

  • habe ein Tab control in meiner GUI welches ich dynamisch in der Breite ändern möchte je nachdem welches Tab gedrückt wurde.
    Leider ändert _GUICtrlTab_SetItemSize jedoch nur die Größe der Tabs selbst, nicht jedoch das ganze Tab-Objekt.


    Das gleiche würde ich gerne mir der GUI auch tun.
    d.h. Main Window soll in Breite variiert werden.


    Wäre schön wenn mir hier jemand einen Tip geben könnte.
    Björn

    3 Mal editiert, zuletzt von Tueftler (1. August 2012 um 15:39)

  • Spoiler anzeigen
    [autoit]

    #include <GuiTab.au3>
    #include <GUIConstantsEx.au3>

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

    Opt("GUIResizeMode", $GUI_DOCKBORDERS)

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

    Global $hGui = GUICreate("Test", 500, 500)

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

    Global $nTab = GUICtrlCreateTab(10, 10, 480, 480)
    Global $hTab = GUICtrlGetHandle(-1)
    Global $nItem1 = GUICtrlCreateTabItem("Tab1")
    Global $nItem2 = GUICtrlCreateTabItem("Tab2")
    Global $nItem3 = GUICtrlCreateTabItem("Tab3")
    Global $nItem4 = GUICtrlCreateTabItem("Tab4")
    GUICtrlCreateTabItem("")

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

    Global $aWidth[4] = [480, 550, 200, 400]

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

    GUISetState()

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

    Global $sMsg, $iTab
    Global $iBorderY, $iBorderX
    _SystemGetWindowBorder($iBorderY, $iBorderX)

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

    While 1
    $sMsg = GUIGetMsg()
    Switch $sMsg
    Case -3
    Exit
    Case $nTab
    $iTab = _GUICtrlTab_GetCurSel($hTab)
    WinMove($hGui, "", Default, Default, $aWidth[$iTab] + 20 + $iBorderX, 500 + $iBorderY)
    EndSwitch
    WEnd

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

    Func _SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder)
    ; == by BugFix
    Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45
    Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]]
    Local $dll = DllOpen("user32.dll"), $aRet
    For $i = 0 To 4
    $aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0])
    If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0]
    Next
    DllClose($dll)
    $_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1]
    $_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1]
    EndFunc

    [/autoit]