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
#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
[/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 ###
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
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
Func _MouseOverTabItem($GUI, $TabID, $iTabItem)
If Not BitAND(WinGetState($GUI),
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 ([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