lässt sich die absolute Position des Tabitems doch berechnen und z.B. in ein Array ablegen?
Könnte man machen, ist aber nicht flexibel. Wenn der User z.B. die Möglichkeit hat die Registertitel zu ändern, ändern sich auch die Positionen aller Item.
Ich habe deshalb jetzt eine Funktion erstellt, die die Koordianten relativ zum Fenster ermittelt und bei der Gelegenheit habe ich aus den beiden Funktionen eine gemacht. Ist doch blödsinnig, nur wegen eines anderen Returntypes eine neue Funktion zu verwenden.
So klappt es jetzt:
Spoiler anzeigen
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
$Form1 = GUICreate("Test", 297, 341, 210, 144)
$TabID = GUICtrlCreateTab(18, 18, 280, 240)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$tab1 = GUICtrlCreateTabItem("Tab 0")
$tab2 = GUICtrlCreateTabItem("Tab 1")
$tab3 = GUICtrlCreateTabItem("Tab 2")
$tab4 = GUICtrlCreateTabItem("Tab 3")
GUICtrlCreateTabItem("")
$labelRect = GUICtrlCreateLabel('', 8, 270, 280, 17)
$labelMouse = GUICtrlCreateLabel('', 8, 305, 280, 17)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_SECONDARYUP
For $i = 0 To 3
$old = Opt('MouseCoordMode', 2)
$mouse = MouseGetPos()
Opt('MouseCoordMode', $old)
GUICtrlSetData($labelMouse, 'MousePos: ' & $mouse[0] & ', ' & $mouse[1])
If _MouseOverTabItem($Form1, $TabID, $i) Then
WinSetTitle($Form1, '', 'Right clicked Index: ' & $i)
$rect = _GUICtrlTab_GetItemRectRelativ($Form1, $TabID, $i)
GUICtrlSetData($labelRect, 'ItemRECT: ' & $rect[0] & ', ' & $rect[1] & ', ' & $rect[2] & ', ' & $rect[3])
ExitLoop
EndIf
Next
EndSwitch
WEnd
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: Gibt die Koordinaten eines TabItem relativ zu den GUI-Koordinaten zurück
; Parameter(s): $GUI - Fensterhandle
; $TabID - ID des Tab (nicht Handle!)
; $iTabItem - Tabitem Index
; $iReturnType - Rückgabetyp Array=0 (Standard), RECT-Struktur=1
; Return Value(s): Array oder Struktur mit den TabItem Koordinaten (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 = _GUICtrlTab_GetItemRectEx($hWnd, $iTabItem)
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
$tRECT = _GUICtrlTab_GetItemRectEx($hWnd, $i)
$posLeft += (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
Next
EndIf
If $iReturnType Then
DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), _
'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