- Offizieller Beitrag
Hi,
ich bin fast schon an mir selbst verzweifelt, weil ich einen Fehler nicht fand. Dabei kommt der Fehler von den oben genannten Funktionen.
Im folgenden Bsp. könnt ihr es selbst testen:
Der Code dient dazu, bei Rechtsklick festzustellen über welchem Tabitem der Rechtsklick erfolgt, da dabei das Item nicht aktiviert wird.
Klickt mit re. Maustaste in die Mitte der Tabbezeichnung (Buchstabe 'a'), dann wird mit _GUICtrlTab_GetItemRect() die Abmessung/Position des Tabitem ermittelt. Bei 'Tab 0' wird dort left=2, top=2 zurückgegeben obwohl das Tab an Position 8,8 erstellt wurde!
Laut Rect-Funktion befindet man sich bereits bei Schriftende eines Tabs im nächsten Tab. :wacko:
(Die beiden Funktionen sind identisch - nur gibt eine ein Array und die andere eine Struktur zurück.)
Hat jemand dafür eine Erklärung/ Lösung parat?
Spoiler anzeigen
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
$Form1 = GUICreate("Test", 297, 341, 210, 144)
$Tab = GUICtrlCreateTab(8, 8, 280, 240)
$hTab = GUICtrlGetHandle($Tab)
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, $hTab, $i) Then
WinSetTitle($Form1, '', 'Right clicked Index: ' & $i)
$rect = _GUICtrlTab_GetItemRect($hTab, $i)
GUICtrlSetData($labelRect, 'ItemRECT: ' & $rect[0] & ', ' & $rect[1] & ', ' & $rect[2] & ', ' & $rect[3])
ExitLoop
EndIf
Next
EndSwitch
WEnd
Func _MouseOverTabItem($GUI, $hWnd, $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_GetItemRectEx($hWnd, $iTabItem)
If _WinAPI_PtInRect($tTabItem, $tMouse) Then
Return True
Else
Return False
EndIf
EndFunc ;==>_MouseOverTabItem