Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] GUICtrlCreateTreeView - Определение нажатия на элемент или на чекбокс (http://forum.oszone.net/showthread.php?t=344462)

-TRM- 18-03-2020 15:50 2913712

GUICtrlCreateTreeView - Определение нажатия на элемент или на чекбокс
 
Приветствую, как для примера приведу пример от MrCreatoR
Код:

#include <GUIConstants.au3>

Global $iTotal_Items = 10
Global $TVItemsID_Array[$iTotal_Items + 1]

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)
GUICtrlSetColor($SelAll_TVItem, 0xC0C0C0)

For $i = 1 To $iTotal_Items
    $TVItemsID_Array[$i] = GUICtrlCreateTreeViewItem("Item " & $i, $SelAll_TVItem)
Next

GUICtrlSetState($SelAll_TVItem, $GUI_EXPAND)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $SelAll_TVItem
            Local $State = $GUI_UNCHECKED
           
            If BitAND(GUICtrlRead($SelAll_TVItem), $GUI_CHECKED) Then
                $State = $GUI_CHECKED
                GUICtrlSetColor($SelAll_TVItem, 0x0)
                GUICtrlSetState($SelAll_TVItem, $GUI_DEFBUTTON + $GUI_CHECKED)
            Else
                GUICtrlSetColor($SelAll_TVItem, 0xC0C0C0)
                GUICtrlSetState($SelAll_TVItem, $GUI_UNCHECKED)
            EndIf

            For $a = 1 To UBound($TVItemsID_Array) - 1
                GUICtrlSetState($TVItemsID_Array[$a], $State)
            Next
        Case $TVItemsID_Array[1] To $TVItemsID_Array[$iTotal_Items]
           
           
            If AllIsUnChecked() Then
                GUICtrlSetColor($SelAll_TVItem, 0xC0C0C0)
                GUICtrlSetState($SelAll_TVItem, $GUI_UNCHECKED)
            ElseIf AllIsChecked() Then
                GUICtrlSetColor($SelAll_TVItem, 0x0)
                GUICtrlSetState($SelAll_TVItem, $GUI_DEFBUTTON + $GUI_CHECKED)
            Else
                GUICtrlSetColor($SelAll_TVItem, 0x696969)
                GUICtrlSetState($SelAll_TVItem, $GUI_CHECKED)
            EndIf
    EndSwitch
WEnd

Func AllIsUnChecked()
    For $i = 1 To UBound($TVItemsID_Array) - 1
        If BitAND(GUICtrlRead($TVItemsID_Array[$i]), $GUI_CHECKED) Then Return False
    Next

    Return True
EndFunc

Func AllIsChecked()
    For $i = 1 To UBound($TVItemsID_Array) - 1
        If BitAND(GUICtrlRead($TVItemsID_Array[$i]), $GUI_UNCHECKED) Then Return False
    Next

    Return True
EndFunc

Возможно ли определять - было нажато на название раздела или на сам чекбокс т.к. если выделить Item 5 и потом просто нажать на само название Select all - выделяются все элементы (как бы это предотвратить т.к. не было нажатия на сам чекбокс) ?

iglezz 18-03-2020 19:33 2913753

Можно сохранить состояние чекбокса "Select all" и действовать через него (состояние)
Скрытый текст
Код:

#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



Время: 14:37.

Время: 14:37.
© OSzone.net 2001-