Gui Tabs einzeln löschen

  • Hallo,

    eine Frage zu Gui Tabs:
    Wie kann man bestimmte Tabs ähnlich
    wie bei Firefox beim anklicken löschen?

    autoit.de/wcf/attachment/13501/

    [autoit]


    #include <GuiTab.au3>
    #include <GUIConstantsEx.au3>
    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 440, 192, 124)
    $Tab1 = GUICtrlCreateTab(80, 80, 481, 305)
    Local $tabitems[10] = [ _
    GUICtrlCreateTabItem("Eins") , _
    GUICtrlCreateTabItem("Zwei") , _
    GUICtrlCreateTabItem("Drei") , _
    GUICtrlCreateTabItem("Vier") , _
    GUICtrlCreateTabItem("Fünf"), _
    GUICtrlCreateTabItem("sechs") , _
    GUICtrlCreateTabItem("sieben") , _
    GUICtrlCreateTabItem("acht") , _
    GUICtrlCreateTabItem("neun") , _
    GUICtrlCreateTabItem("zehn")]
    GUICtrlCreateTabItem("")
    $Button1 = GUICtrlCreateButton("Button1", 456, 40, 75, 25)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    MsgBox(4160, "Information", "Lösche TAB ")
    ;For $i = 2 To UBound($tabitems) - 1
    _GUICtrlTab_DeleteItem($Tab1, 3)
    ;Next
    EndSwitch
    WEnd

    [/autoit]

    also nicht mit einem Button!

    Grüße
    Ilse ;)

  • Hier ist meine Lösung dafür, die jedoch weder kleine "x" zeichnet,
    noch bei ausgewählten Tabs funktioniert...
    Vielleicht reicht dieser Ansatz ja für weiteres:

    Spoiler anzeigen
    [autoit]

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

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 440, 192, 124)
    $Tab1 = GUICtrlCreateTab(80, 80, 481, 305)
    ;ggf. kann man via GDI+ ein kleines "x" auf die Tabs zeichnen!?
    Local $tabitems[10] = [ _
    GUICtrlCreateTabItem("Eins") , _
    GUICtrlCreateTabItem("Zwei") , _
    GUICtrlCreateTabItem("Drei") , _
    GUICtrlCreateTabItem("Vier") , _
    GUICtrlCreateTabItem("Fünf"), _
    GUICtrlCreateTabItem("sechs") , _
    GUICtrlCreateTabItem("sieben") , _
    GUICtrlCreateTabItem("acht") , _
    GUICtrlCreateTabItem("neun") , _
    GUICtrlCreateTabItem("zehn")]
    GUICtrlCreateTabItem("")
    $Button1 = GUICtrlCreateButton("Button1", 456, 40, 75, 25)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg(1) ; Arrayvariante
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Tab1 ; Wird _nur_ bei nicht fokussierten, angeklickten Tabs aufgerufen!
    $nMsg[3] -= 80 ; 80 ist x-Position vom Tab
    $nMsg[4] -= 80 ; 80 ist y-Position vom Tab
    For $i=0 To _GUICtrlTab_GetItemCount($Tab1)-1 ; alle Tabs überprüfen
    $pos = _GUICtrlTab_GetItemRect($Tab1,$i) ; Position des aktuellen Tabs
    $x = Abs($nMsg[3]+5-$pos[2]) ; Abstand vom Rechten Rand zum Mausklick ermitteln
    $y = Abs($nMsg[4]+8-$pos[3]) ; die Summanden (x: 5, y: 8) sind durchs !Testen! entstanden
    If $x < 4 And $y < 8 Then
    ; Falls der Abstand vom Mausklick und rechter Rand ziemlich gering ist
    ; Auch diese Werte (4,8) sind "ertestet" und müssen ggf. angepasst werden!
    _GUICtrlTab_DeleteItem($Tab1,_GUICtrlTab_GetCurSel($Tab1)) ; löscht aktuelles
    _GUICtrlTab_SetCurSel($Tab1,0) ; aktiviert das erste
    ExitLoop
    EndIf
    Next

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

    Case $Button1
    MsgBox(4160, "Information", "Lösche TAB ")
    ;For $i = 2 To UBound($tabitems) - 1
    _GUICtrlTab_DeleteItem($Tab1, 3)
    ;Next
    EndSwitch
    WEnd

    [/autoit]


    PS: Vorschläge:
    -Mit GDI+ kann man (wahrscheinlich) kleine "x"'e zeichnen
    -Im switch($nMsg) könnte man im Else Teil die Position nochmal
    überprüfen und somit auch das aktive Tab schließen lassen

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Hallo XovoxKingdom,

    merci für deine Hilfe.
    Klappt irgendwie nicht.

    Weiß du vielleicht wie ich den aktuellen Tab,
    also der Tab der angeklickt wurde löschen kann?

    ;) Ilse

  • Hallo Ilse nimm mal ein tab ins Visier und geht links an den rand zum nächsten Tabiten genau an den Rand und klicke mal dann verschwindet der aktuelle tab und der Fokus geht auf Tab1
    also bei mir geht es

  • Hallo Osiris,

    stimmt das geht. Aber intuitiv ist das leider nicht!
    Gibt es nicht vielleicht eine fertige Funktion die das
    vielleicht etwas eleganter löst?

    Oder vielleicht per icon im Tab das man
    anklicken kann.
    Mach mich mal auf die Suche.

    Grüße
    Ilse ;)

    • Offizieller Beitrag

    Hier mal eine Variante von mir:
    Ist das TabItem aktiv und du bist mit der Maus auf dem Register wird ein x-Button eingeblendet mit dem das TabItem gelöscht werden kann. Das letzte ist nicht löschbar.
    Kurioserweise ist die Positionsmessung der TabItem für einzelne Item nicht korrekt (z.B. Item 'sieben' wird bei mir mit falscher Größe ausgegeben). Aber als Ansatz vielleicht nützlich.

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiTab.au3>
    #include <StaticConstants.au3>
    #include <StructureConstants.au3>
    #include <TabConstants.au3>
    #include <WinAPI.au3>

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

    Global $btCloseTABItem, $iTabItem, $tTabItem, $iItemCount, $tmpItem, $fIsButton = False

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 440, 192, 124)
    $Tab1 = GUICtrlCreateTab(80, 80, 481, 305)
    Local $tabitems[10] = [ _
    GUICtrlCreateTabItem("Eins") , _
    GUICtrlCreateTabItem("Zwei") , _
    GUICtrlCreateTabItem("Drei") , _
    GUICtrlCreateTabItem("Vier") , _
    GUICtrlCreateTabItem("Fünf"), _
    GUICtrlCreateTabItem("sechs") , _
    GUICtrlCreateTabItem("sieben") , _
    GUICtrlCreateTabItem("acht") , _
    GUICtrlCreateTabItem("neun") , _
    GUICtrlCreateTabItem("zehn")]
    GUICtrlCreateTabItem("")
    $btCloseTABItem = GUICtrlCreateButton('x', 1, 1, 10, 10, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xFF6611)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    $tmpItem = -1
    $iItemCount = _GUICtrlTab_GetItemCount($Tab1)
    For $i = 0 To $iItemCount -1
    If _MouseOverTabItem($Form1, $Tab1, $i) Then
    $tmpItem = $i
    ExitLoop
    EndIf
    Next
    If $iTabItem <> $tmpItem Then
    GUICtrlSetState($btCloseTABItem, $GUI_HIDE)
    $fIsButton = False
    $iTabItem = $tmpItem
    EndIf
    ; Löschbutton nur Anzeigen bei min. 2 TabItem und aktivem TabItem
    If $iTabItem > -1 And $iItemCount > 1 And (Not $fIsButton) And GUICtrlRead($Tab1) = $iTabItem Then _ShowCloseButtonOnTabItem($Form1, $Tab1, $iTabItem)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btCloseTABItem
    _GUICtrlTab_DeleteItem($Tab1, $iTabItem)
    GUICtrlSetState($btCloseTABItem, $GUI_HIDE)
    $fIsButton = False
    EndSwitch
    WEnd

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

    Func _ShowCloseButtonOnTabItem($GUI, $TabID, $iTabItem)
    Local $aSize = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem)
    Local $posRight = $aSize[2]
    Local $x = $posRight -10
    Local $y = $aSize[1] +2
    ControlMove($Form1, '', $btCloseTABItem, $x, $y)
    GUICtrlSetState($btCloseTABItem, BitOR($GUI_SHOW,$GUI_FOCUS,$GUI_ONTOP))
    $fIsButton = True
    EndFunc

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

    Func _MouseOverTabItem($GUI, $TabID, $iTabItem)
    If Not BitAND(WinGetState($GUI), 8) Then Return False
    Local $old = Opt('MouseCoordMode', 2)
    Local $posM = MouseGetPos(), $tMouse = DllStructCreate($tagPOINT)
    DllStructSetData($tMouse, 1, $posM[0])
    DllStructSetData($tMouse, 2, $posM[1])
    Opt('MouseCoordMode', $old)
    Local $tTabItem = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, 1)
    If _WinAPI_PtInRect($tTabItem, $tMouse) Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>_MouseOverTabItem

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

    ;===============================================================================
    ; Function Name: _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
    ; Description: Returns the coordinates of a TabItem relatively to the GUI co-ordinates
    ; Parameter(s): $GUI - window handle
    ; $TabID - Tab ID (not handle!)
    ; $iTabItem - TabItem index
    ; $iReturnType - Return type array=0 (default), RECT-structure=1
    ; Return Value(s): Array or structure with coordinates of a TabItem (left, top, right, bottom)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
    Local $hWnd = GUICtrlGetHandle($TabID)
    Local $TabPos = ControlGetPos($GUI, '', $TabID)
    Local $tRECT = DllStructCreate("int Left;int Top;int Right;int Bottom")
    Local $pRect = DllStructGetPtr($tRECT)
    GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
    Local $posLeft = $TabPos[0]+2, $posTop = $TabPos[1]+2
    Local $width = (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
    Local $height = DllStructGetData($tRECT,4) - DllStructGetData($tRECT,2)
    If $iTabItem > 0 Then
    For $i = 0 To $iTabItem -1
    GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
    $posLeft += (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
    Next
    EndIf
    If $iReturnType Then
    DllCall("user32", 'long', 'SetRect', 'ptr', $pRECT, 'long', $posLeft, _
    'long', $posTop, 'long', $posLeft+$width, 'long', $posTop +$height)
    Return $tRECT
    Else
    Local $aOut[4] = [$posLeft, $posTop, $posLeft +$width, $posTop +$height]
    Return $aOut
    EndIf
    EndFunc ;==>_GUICtrlTab_GetItemRectRelativ

    [/autoit]
  • Hallo Bugfix,

    ich brauch nochmal deine Hilfe.
    Ich habe versucht deinen Code in dieses
    Script einzubauen, aber es hagelt nur so mit Fehlermeldungen.

    Hier mal der Code wo dein Code rein soll:

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    #include <IE.au3>
    _IEErrorHandlerRegister ()

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

    Dim $oIE[1]
    $oIE[0] = _IECreateEmbedded()
    Dim $Tab[1]

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

    $gui = GUICreate("Browser",800,600)
    $NewTab = GUICtrlCreateButton("Neuer Tab",20,20,80,25)
    $input = GUICtrlCreateInput("",120,20,400,25)
    $TabParent = GUICtrlCreateTab(20,60,760,520)
    $Tab[0] = GUICtrlCreateTabItem("Tab")
    GUICtrlCreateObj($oIE[0],40,100,700,460)

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

    GUISetState()

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

    _IENavigate($oIE[0],"http://www.google.de")
    GUICtrlSetData($input,_IEPropertyGet($oIE[0],"locationurl"))

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

    While GUIGetMsg()<>-3 * Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $NewTab
    $iIE = UBound($oIE)
    _ArrayAdd($Tab,GUICtrlCreateTabItem("Tab"&$iIE))
    _ArrayAdd($oIE,_IECreateEmbedded())
    GUICtrlCreateObj($oIE[$iIE],40,100,700,460)
    _IENavigate($oIE[$iIE],"http://www.google.de")
    Case $input
    $selected = GUICtrlRead($TabParent)
    _IENavigate($oIE[$selected],GUICtrlRead($input))
    WinSetTitle($gui,"",_IEPropertyGet($oIE[$selected],"locationname"))

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

    Case $TabParent
    $selected = GUICtrlRead($TabParent)
    WinSetTitle($gui,"",_IEPropertyGet($oIE[$selected],"locationname"))
    GUICtrlSetData($input,_IEPropertyGet($oIE[$selected],"locationurl"))
    EndSwitch
    WEnd

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

    Könntest du bitte nochmal drübersehen?
    Liegt bestimmt an den Arrays.
    Ich hatte die Funktionen reinkopiert und soweit alles
    angepasst, ging aber alles nicht.

    Liebe Grüße
    Ilse ;)

    Noch ein kleines anderes Problem:
    Wenn ich meinen Code versuche mit hier dem Forum (SPOILER)
    zu veröffentlichen, dann wird die Syntax nicht korrekt angezeigt!
    Da sind Smileys drin. Seltsam Ich kopiere von Scite in

    Edit BugFix: Du mußt erst auf SPOILER-Tag klicken, DANN auf AUTOIT-Tag und dann den Code dazwischen einfügen:
    [ spoiler ][ autoit ] CODE [ /autoit ][ /spoiler ]

    Spoiler anzeigen


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiTab.au3>
    #include <StaticConstants.au3>
    #include <StructureConstants.au3>
    #include <TabConstants.au3>
    #include <WinAPI.au3>

    Global $btCloseTABItem, $iTabItem, $tTabItem, $iItemCount, $tmpItem, $fIsButton = False

    #region ### START Koda GUI section ### Form=
    $gui = GUICreate("Form1", 615, 440, 192, 124)
    $Tab1 = GUICtrlCreateTab(80, 80, 481, 305)
    Local $Tab[10] = [ _
    GUICtrlCreateTabItem("Eins") , _
    GUICtrlCreateTabItem("Zwei") , _
    GUICtrlCreateTabItem("Drei") , _
    GUICtrlCreateTabItem("Vier") , _
    GUICtrlCreateTabItem("Fünf"), _
    GUICtrlCreateTabItem("sechs") , _
    GUICtrlCreateTabItem("sieben") , _
    GUICtrlCreateTabItem("acht") , _
    GUICtrlCreateTabItem("neun") , _
    GUICtrlCreateTabItem("zehn")]
    GUICtrlCreateTabItem("")
    $btCloseTABItem = GUICtrlCreateButton('x', 1, 1, 10, 10, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xFF6611)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

    While 1

    $tmpItem = -1
    $iItemCount = _GUICtrlTab_GetItemCount($Tab1)
    For $i = 0 To $iItemCount -1
    If _MouseOverTabItem($gui, $Tab1, $i) Then
    Msgbox(0,"","")
    $tmpItem = $i
    ExitLoop
    EndIf
    Next
    If $iTabItem <> $tmpItem Then
    GUICtrlSetState($btCloseTABItem, $GUI_HIDE)
    $fIsButton = False
    $iTabItem = $tmpItem
    EndIf
    ; Löschbutton nur Anzeigen bei min. 2 TabItem und aktivem TabItem
    If $iTabItem > -1 And $iItemCount > 1 And (Not $fIsButton) And GUICtrlRead($Tab1) = $iTabItem Then _ShowCloseButtonOnTabItem($gui, $Tab1, $iTabItem)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btCloseTABItem
    _GUICtrlTab_DeleteItem($Tab1, $iTabItem)
    GUICtrlSetState($btCloseTABItem, $GUI_HIDE)
    $fIsButton = False
    EndSwitch
    WEnd

    Func _ShowCloseButtonOnTabItem($GUI, $TabID, $iTabItem)
    Local $aSize = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem)
    Local $posRight = $aSize[2]
    Local $x = $posRight -10
    Local $y = $aSize[1] +2
    ControlMove($gui, '', $btCloseTABItem, $x, $y)
    GUICtrlSetState($btCloseTABItem, BitOR($GUI_SHOW,$GUI_FOCUS,$GUI_ONTOP))
    $fIsButton = True
    EndFunc

    Func _MouseOverTabItem($GUI, $TabID, $iTabItem)
    If Not BitAND(WinGetState($GUI), 8) Then Return False
    Local $old = Opt('MouseCoordMode', 2)
    Local $posM = MouseGetPos(), $tMouse = DllStructCreate($tagPOINT)
    DllStructSetData($tMouse, 1, $posM[0])
    DllStructSetData($tMouse, 2, $posM[1])
    Opt('MouseCoordMode', $old)
    Local $tTabItem = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, 1)
    If _WinAPI_PtInRect($tTabItem, $tMouse) Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>_MouseOverTabItem

    ;===============================================================================
    ; Function Name: _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
    ; Description: Returns the coordinates of a TabItem relatively to the GUI co-ordinates
    ; Parameter(s): $GUI - window handle
    ; $TabID - Tab ID (not handle!)
    ; $iTabItem - TabItem index
    ; $iReturnType - Return type array=0 (default), RECT-structure=1
    ; Return Value(s): Array or structure with coordinates of a TabItem (left, top, right, bottom)
    ; Author(s): BugFix (bugfix@autoit.de)
    ;===============================================================================
    Func _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
    Local $hWnd = GUICtrlGetHandle($TabID)
    Local $TabPos = ControlGetPos($GUI, '', $TabID)
    Local $tRECT = DllStructCreate("int Left;int Top;int Right;int Bottom")
    Local $pRect = DllStructGetPtr($tRECT)
    GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
    Local $posLeft = $TabPos[0]+2, $posTop = $TabPos[1]+2
    Local $width = (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
    Local $height = DllStructGetData($tRECT,4) - DllStructGetData($tRECT,2)
    If $iTabItem > 0 Then
    For $i = 0 To $iTabItem -1
    GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
    $posLeft += (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
    Next
    EndIf
    If $iReturnType Then
    DllCall("user32", 'long', 'SetRect', 'ptr', $pRECT, 'long', $posLeft, _
    'long', $posTop, 'long', $posLeft+$width, 'long', $posTop +$height)
    Return $tRECT
    Else
    Local $aOut[4] = [$posLeft, $posTop, $posLeft +$width, $posTop +$height]
    Return $aOut
    EndIf
    EndFunc ;==>_GUICtrlTab_GetItemRectRelativ

    Einmal editiert, zuletzt von BugFix (17. Juni 2011 um 09:31)