Код:
#include <GUIConstants.au3>
Global $iTotal_Items = 10
Global $TVItemsID_Array[$iTotal_Items + 1]
Global $SelAll_State
GUICreate("TreeView Check All", 460, 300)
$TreeView = GUICtrlCreateTreeView(20, 20, 420, 260, _
BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES), $WS_EX_DLGMODALFRAME + $WS_EX_CLIENTEDGE)
$SelAll_TVItem = GUICtrlCreateTreeViewItem("Select all", $TreeView)
For $i = 1 To $iTotal_Items
$TVItemsID_Array[$i] = GUICtrlCreateTreeViewItem("Item " & $i, $SelAll_TVItem)
Next
GUICtrlSetState($SelAll_TVItem, $GUI_EXPAND)
$SelAll_State = BitAND(GUICtrlRead($SelAll_TVItem), $GUI_CHECKED) ? $GUI_CHECKED : $GUI_UNCHECKED
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $SelAll_TVItem
Local $checked = BitAND(GUICtrlRead($SelAll_TVItem), $GUI_CHECKED) ? $GUI_CHECKED : $GUI_UNCHECKED
If $SelAll_State <> $checked Then
If GetChecksState() = 1 Then
Switch_Checks($GUI_UNCHECKED)
Switch_SelAll($GUI_UNCHECKED)
Else
Switch_Checks($GUI_CHECKED)
Switch_SelAll($GUI_CHECKED)
EndIf
EndIf
Case $TVItemsID_Array[1] To $TVItemsID_Array[$iTotal_Items]
If GetChecksState() = -1 Then
Switch_SelAll($GUI_UNCHECKED)
Else
Switch_SelAll($GUI_CHECKED)
EndIf
EndSwitch
Sleep(20)
WEnd
Func Switch_SelAll($checkState)
Local $setState = BitAND($checkState, $GUI_CHECKED) ? $GUI_CHECKED : $GUI_UNCHECKED
$SelAll_State = $setState
GUICtrlSetState($SelAll_TVItem, $setState)
EndFunc
Func Switch_Checks($checkState)
For $a = 1 To UBound($TVItemsID_Array) - 1
GUICtrlSetState($TVItemsID_Array[$a], $checkState)
Next
EndFunc
Func GetChecksState()
Local $count = 0
Local $items = UBound($TVItemsID_Array) - 1
For $i = 1 To $items
If BitAND(GUICtrlRead($TVItemsID_Array[$i]), $GUI_CHECKED) Then $count += 1
Next
If $count = 0 Then Return -1
If $count = $items Then Return 1
Return 0
EndFunc