Hi,
ich habs mal noch etwas umgebaut und eine Funktion eingefügt (_GuiCtrlTab_ItemStateAble) zum wahlweisen Enablen/Disablen eines (mehrerer) beliebigen Tab-Items.
Spoiler anzeigen
#include <GuiConstantsEx.au3>
#include <GuiTab.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
OnAutoItExitRegister('OnAutoItExit')
AdlibRegister('_Check', 50)
Global Const $HC_ACTION = 0
[/autoit] [autoit][/autoit] [autoit]Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)
Global $hHook2 = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
Global $check = False, $IndexMouseOver
Global $aDisableItem[1] = [0] ; == Array zum Speichern der Disable-Item
$Form1 = GUICreate("Testfenster", 297, 341, 210, 144)
$Tab = GUICtrlCreateTab(8, 8, 280, 304)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$tab1 = GUICtrlCreateTabItem("Tab1")
$tab2 = GUICtrlCreateTabItem("Tab2")
$tab3 = GUICtrlCreateTabItem("Tab3")
$tab4 = GUICtrlCreateTabItem("Tab4")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
Global $hookGUI = $Form1, $hookID = $Tab
[/autoit] [autoit][/autoit] [autoit]$countTimer = 0
$fTimer = True
$timer = TimerInit()
While 1
If $fTimer And TimerDiff($timer) >= 5000 Then
$countTimer += 1
$fTimer = False
Switch $countTimer
Case 1
MsgBox(0, '', 'Disable Tab2 für 5 Sekunden')
_GuiCtrlTab_ItemStateAble($Tab, 1, $GUI_DISABLE)
$timer = TimerInit()
$fTimer = True
Case 2
MsgBox(0, '', 'Enable Tab2 wieder')
_GuiCtrlTab_ItemStateAble($Tab, 1, $GUI_ENABLE)
EndSwitch
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _GuiCtrlTab_ItemStateAble($_hWnd, $_iIndex, $_iState) ; == $_iState: $GUI_ENABLE / $GUI_DISABLE
If Not IsHWnd($_hWnd) Then $_hWnd = GUICtrlGetHandle($_hWnd)
Local $iCount = _GUICtrlTab_GetItemCount($_hWnd)
If $_iIndex < 0 Or $_iIndex > $iCount -1 Then Return
If $_iState <> $GUI_ENABLE Then $_iState = $GUI_DISABLE
Switch $_iState
Case $GUI_ENABLE
Local $found = False
For $i = 1 To $aDisableItem[0]
If $aDisableItem[$i] = $i Then
$found = True
ExitLoop
EndIf
Next
If Not $found Then Return
Local $k = 0, $aTmp[$aDisableItem[0]] = [$aDisableItem[0] -1]
For $j = 1 To $aDisableItem[0]
If $j = $i Then ContinueLoop
$k += 1
$aTmp[$k] = $aDisableItem[$j]
Next
$aDisableItem = $aTmp
Case $GUI_DISABLE
For $i = 1 To $aDisableItem[0]
If $aDisableItem[$i] = $_iIndex Then Return
Next
$aDisableItem[0] += 1
ReDim $aDisableItem[$aDisableItem[0]+1]
$aDisableItem[$aDisableItem[0]] = $_iIndex
EndSwitch
EndFunc
Func _MouseProc($nCode, $wParam, $lParam)
Select
Case $nCode < 0
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case Not _MouseOverTabItem($hookGUI, $hookID)
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case $wParam = $WM_LBUTTONDOWN
If $nCode = $HC_ACTION Then
$check = True ; Überprüfung aktivieren
Return -1 ; Mausklick wird ignoriert ==> TabItem noch nicht aktiviert
EndIf
EndSelect
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_MouseProc
Func _KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS, $vkCode
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If ControlGetFocus($Form1) <> 'SysTabControl321' Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
$vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
If $wParam = $WM_KEYDOWN Then
Switch $vkCode
Case 0x25, 0x27
$check = True
Return -1
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProc
Func _Check()
If Not $check Then Return
For $i = 1 To $aDisableItem[0]
If $IndexMouseOver = $i Then
$check = False
Return
EndIf
Next
_GUICtrlTab_SetCurSel(GUICtrlGetHandle($Tab), $IndexMouseOver)
$check = False
EndFunc ;==>_Check
Func _MouseOverTabItem($GUI, $TabID) ; == True wenn Maus über einem der TabItem
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, $iCountItem = _GUICtrlTab_GetItemCount(GUICtrlGetHandle($TabID))
$IndexMouseOver = -1
For $i = 0 To $iCountItem -1
$tTabItem = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $i, 1)
If _WinAPI_PtInRect($tTabItem, $tMouse) Then
$IndexMouseOver = $i
Return True
EndIf
Next
Return False
EndFunc ;==>_MouseOverTabItem
;===============================================================================
; Function Name: _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
; Description: Returns the co-ordinates 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 co-ordinates 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
Func OnAutoItExit()
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_MouseProc)
_WinAPI_UnhookWindowsHookEx($hHook2)
DllCallbackFree($hStub_KeyProc)
EndFunc ;==>OnAutoItExit