Jump to content
Sign in to follow this  
DjDeep00

Treeview with Checkboxes Help

Recommended Posts

DjDeep00

Thanks to Holger...I have most of the functionality that I want working but for some reason after I choose my child treeview items and then click on the parent all the checkboxes get wiped out. Please Holger or somebody please tell what I am doing wrong...Here is the script..

#include <GUIConstants.au3>
#include <Array.au3>

$TV_FIRST               = 0x1100
$TVM_GETNEXTITEM        = $TV_FIRST + 10
$TVM_GETITEM            = $TV_FIRST + 12
$TVGN_NEXT              = 0x0001
$TVGN_PARENT            = 0x0003
$TVGN_CHILD             = 0x0004
$TVGN_CARET             = 0x0009
$TVIF_PARAM             = 0x0004


GUICreate("Treeview Checkbox Test",200,200)

$Parent="A|B|C"
$Parent_Split=StringSplit($Parent,"|")

$Child="Child1|Child2|Child3"
$Child_Split=StringSplit($Child,"|")

Global $Treeview=GUICtrlCreateTreeView(20,20,150,150,BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)

Dim $Tree_Parent_Split[$Parent_Split[0]+1]
Dim $Tree_Child_Split[$Child_Split[0]+1]

For $x=1 to $Parent_Split[0]

$Tree_Parent_Split[$x]=GUICtrlCreateTreeViewItem($Parent_Split[$x],$Treeview)
    
        For $y=1 to $Child_Split[0]
        
        $Tree_Child_Split[$y]=GUICtrlCreateTreeViewItem($Child_Split[$y],$Tree_Parent_Split[$x])
                    
        Next


Next


GUISetState()

While 1

    $Msg = GUIGetMsg()
    
    Select
        Case $Msg = $GUI_EVENT_CLOSE
            ExitLoop
        
        
        Case $Msg >= $Tree_Parent_Split[1]
            If BitAnd(GUICtrlRead($Msg), $GUI_INDETERMINATE) Then ContinueLoop; Do nothing when in indeterminate state
            $hItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
            
            If $hItem > 0 Then
                $hChildItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
                If $hChildItem > 0 Then CheckChilds($Treeview, $hChildItem, BitAnd(GUICtrlRead($Msg), $GUI_CHECKED))
                
                $hParentItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
                If $hParentItem > 0 Then GetParents($Treeview, $hParentItem, BitAnd(GUICtrlRead($Msg), $GUI_CHECKED))
            EndIf
    
    EndSelect



WEnd


Func CheckChilds($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        $arr = GUICtrlRead($nItem ,1)
        GUICtrlSetState($nItem, $nCheck * -3 + $GUI_UNCHECKED)
    ; Same like: GUICtrlSetState($nItem, BitOr(BitAnd($nCheck, $GUI_UNCHECKED), BitAnd($nCheck, $GUI_CHECKED)))
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then CheckChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Check/set state of the parent items until root
;**********************************************************

Func GetParents($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        $nState = $nCheck * -3 + $GUI_UNCHECKED
        $nCheckState = $nState
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheckState)
        $nItem = GetItemID($nCtrl, $hItem)
        $arInfo = GUICtrlRead($nItem,1)
        If $nCheckState Then
            GUICtrlSetState($nItem, $nState)
        Else
            GUICtrlSetState($nItem, $GUI_INDETERMINATE)
        EndIf
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Gets state of the child items in the subtree
;**********************************************************

Func GetChilds($nCtrl, $hItem, ByRef $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        If Not BitAnd(GUICtrlRead($nItem), $nCheck) Then
            $nCheck = 0
            ExitLoop
        EndIf
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Returns the CtrlID by a given treeitem-handle
;**********************************************************

Func GetItemID($Ctrl, $hItem)
    $nID    = 0
    $hTree  = ControlGetHandle("", "", $Ctrl)
    
    $TVITEM = DllStructCreate ("uint;int;uint;uint;ptr;int;int;int;int;int")
    If @error Then
        DllStructDelete ($TVITEM)
        Return $nID
    EndIf
    DllStructSetData ($TVITEM, 1, $TVIF_PARAM)
    DllStructSetData ($TVITEM, 2, $hItem)

    $nResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hTree, "int", $TVM_GETITEM, "int", 0, "ptr", DllStructGetPtr($TVITEM))
    If ($nResult[0]) Then
        $nID = DllStructGetData($TVITEM, 10)
    EndIf
    
;DllStructDelete($TVITEM)
    
    Return $nID
EndFunc

Thanks

Share this post


Link to post
Share on other sites
MHz

Thanks to Holger...I have most of the functionality that I want working but for some reason after I choose my child treeview items and then click on the parent all the checkboxes get wiped out. Please Holger or somebody please tell what I am doing wrong...Here is the script..

I do not see the issue using AutoIt 3.2.4.9. DllStructDelete() does not exist anymore and the variables at the top of your script are already defined as Global Const variables in the includes.

#include <GUIConstants.au3>
#include <Array.au3>

GUICreate("Treeview Checkbox Test",200,200)

$Parent="A|B|C"
$Parent_Split=StringSplit($Parent,"|")

$Child="Child1|Child2|Child3"
$Child_Split=StringSplit($Child,"|")

Global $Treeview=GUICtrlCreateTreeView(20,20,150,150,BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)

Dim $Tree_Parent_Split[$Parent_Split[0]+1]
Dim $Tree_Child_Split[$Child_Split[0]+1]

For $x=1 to $Parent_Split[0]

$Tree_Parent_Split[$x]=GUICtrlCreateTreeViewItem($Parent_Split[$x],$Treeview)
    
        For $y=1 to $Child_Split[0]
        
        $Tree_Child_Split[$y]=GUICtrlCreateTreeViewItem($Child_Split[$y],$Tree_Parent_Split[$x])
                    
        Next


Next


GUISetState()

While 1

    $Msg = GUIGetMsg()
    
    Select
        Case $Msg = $GUI_EVENT_CLOSE
            ExitLoop
        
        
        Case $Msg >= $Tree_Parent_Split[1]
            If BitAnd(GUICtrlRead($Msg), $GUI_INDETERMINATE) Then ContinueLoop; Do nothing when in indeterminate state
            $hItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
            
            If $hItem > 0 Then
                $hChildItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
                If $hChildItem > 0 Then CheckChilds($Treeview, $hChildItem, BitAnd(GUICtrlRead($Msg), $GUI_CHECKED))
                
                $hParentItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
                If $hParentItem > 0 Then GetParents($Treeview, $hParentItem, BitAnd(GUICtrlRead($Msg), $GUI_CHECKED))
            EndIf
    
    EndSelect



WEnd


Func CheckChilds($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        $arr = GUICtrlRead($nItem ,1)
        GUICtrlSetState($nItem, $nCheck * -3 + $GUI_UNCHECKED)
    ; Same like: GUICtrlSetState($nItem, BitOr(BitAnd($nCheck, $GUI_UNCHECKED), BitAnd($nCheck, $GUI_CHECKED)))
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then CheckChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Check/set state of the parent items until root
;**********************************************************

Func GetParents($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        $nState = $nCheck * -3 + $GUI_UNCHECKED
        $nCheckState = $nState
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheckState)
        $nItem = GetItemID($nCtrl, $hItem)
        $arInfo = GUICtrlRead($nItem,1)
        If $nCheckState Then
            GUICtrlSetState($nItem, $nState)
        Else
            GUICtrlSetState($nItem, $GUI_INDETERMINATE)
        EndIf
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Gets state of the child items in the subtree
;**********************************************************

Func GetChilds($nCtrl, $hItem, ByRef $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        If Not BitAnd(GUICtrlRead($nItem), $nCheck) Then
            $nCheck = 0
            ExitLoop
        EndIf
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc


;**********************************************************
; Returns the CtrlID by a given treeitem-handle
;**********************************************************

Func GetItemID($Ctrl, $hItem)
    $nID    = 0
    $hTree    = ControlGetHandle("", "", $Ctrl)
    
    $TVITEM = DllStructCreate ("uint;int;uint;uint;ptr;int;int;int;int;int")
    If @error Then
        $TVITEM = 0
        Return $nID
    EndIf
    DllStructSetData ($TVITEM, 1, $TVIF_PARAM)
    DllStructSetData ($TVITEM, 2, $hItem)

    $nResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hTree, "int", $TVM_GETITEM, "int", 0, "ptr", DllStructGetPtr($TVITEM))
    If ($nResult[0]) Then
        $nID = DllStructGetData($TVITEM, 10)
    EndIf
    
;DllStructDelete($TVITEM)
    
    Return $nID
EndFunc

:)

Share this post


Link to post
Share on other sites
DjDeep00

MHZ...Thanks for the quick reply...I was using a very old beta but after trying the code using the new beta (3.2.3.14)..I still can't get it to work...Here is exactly what I am doing...

1. Click on the + to expand A (Don't check A)

2. Check items "Child2" and "Child3".

3. Click on the - to collapse A (Don't check A)

4. Now click on the + to expand A again and your checked items are unchecked.

I hope you are able to reproduce this. :)

Thanks.

Share this post


Link to post
Share on other sites
MHz

...and your checked items are unchecked.

Oh, yes, see it now. They are unchecked when collapsed again. You wipe out description led to other ideas. Will look more into it.

And AutoIt public release version is latest.

:)

Edit:

There is a issue with the CheckChilds() function changing the state of the checkboxes. I have commented the call to the function in the message loop to solve.

#include <GUIConstants.au3>
#include <Array.au3>

GUICreate("Treeview Checkbox Test", 200, 200)

$Parent = "A|B|C"
$Parent_Split = StringSplit($Parent, "|")

$Child = "Child1|Child2|Child3"
$Child_Split = StringSplit($Child, "|")

Global $Treeview = GUICtrlCreateTreeView(20, 20, 150, 150, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)

Dim $Tree_Parent_Split[$Parent_Split[0] + 1]
Dim $Tree_Child_Split[$Child_Split[0] + 1]

For $x = 1 To $Parent_Split[0]

    $Tree_Parent_Split[$x] = GUICtrlCreateTreeViewItem($Parent_Split[$x], $Treeview)

    For $y = 1 To $Child_Split[0]

        $Tree_Child_Split[$y] = GUICtrlCreateTreeViewItem($Child_Split[$y], $Tree_Parent_Split[$x])

    Next

Next


GUISetState()

While 1

    $Msg = GUIGetMsg()

    Select
        Case $Msg = $GUI_EVENT_CLOSE
            ExitLoop

        Case $Msg >= $Tree_Parent_Split[1]
            If BitAND(GUICtrlRead($Msg), $GUI_INDETERMINATE) Then ContinueLoop; Do nothing when in indeterminate state
            $hItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0)

            If $hItem > 0 Then
                $hChildItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
;~              If $hChildItem > 0 Then CheckChilds($Treeview, $hChildItem, BitAND(GUICtrlRead($Msg), $GUI_CHECKED))

                $hParentItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
                If $hParentItem > 0 Then GetParents($Treeview, $hParentItem, BitAND(GUICtrlRead($Msg), $GUI_CHECKED))
            EndIf

    EndSelect

WEnd


Func CheckChilds($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        $arr = GUICtrlRead($nItem, 1)
        GUICtrlSetState($nItem, $nCheck * - 3 + $GUI_UNCHECKED)
        ; Same like: GUICtrlSetState($nItem, BitOr(BitAnd($nCheck, $GUI_UNCHECKED), BitAnd($nCheck, $GUI_CHECKED)))
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then CheckChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc   ;==>CheckChilds


;**********************************************************
; Check/set state of the parent items until root
;**********************************************************

Func GetParents($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        $nState = $nCheck * - 3 + $GUI_UNCHECKED
        $nCheckState = $nState
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheckState)
        $nItem = GetItemID($nCtrl, $hItem)
        $arInfo = GUICtrlRead($nItem, 1)
        If $nCheckState Then
            GUICtrlSetState($nItem, $nState)
        Else
            GUICtrlSetState($nItem, $GUI_INDETERMINATE)
        EndIf
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
    WEnd
EndFunc   ;==>GetParents


;**********************************************************
; Gets state of the child items in the subtree
;**********************************************************

Func GetChilds($nCtrl, $hItem, ByRef $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        If Not BitAND(GUICtrlRead($nItem), $nCheck) Then
            $nCheck = 0
            ExitLoop
        EndIf
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc   ;==>GetChilds


;**********************************************************
; Returns the CtrlID by a given treeitem-handle
;**********************************************************

Func GetItemID($Ctrl, $hItem)
    $nID = 0
    $hTree = ControlGetHandle("", "", $Ctrl)

    $TVITEM = DllStructCreate("uint;int;uint;uint;ptr;int;int;int;int;int")
    If @error Then
        $TVITEM = 0
        Return $nID
    EndIf
    DllStructSetData($TVITEM, 1, $TVIF_PARAM)
    DllStructSetData($TVITEM, 2, $hItem)

    $nResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hTree, "int", $TVM_GETITEM, "int", 0, "ptr", DllStructGetPtr($TVITEM))
    If ($nResult[0]) Then
        $nID = DllStructGetData($TVITEM, 10)
    EndIf

    ;DllStructDelete($TVITEM)

    Return $nID
EndFunc   ;==>GetItemID
Edited by MHz

Share this post


Link to post
Share on other sites
MHz

Here, I added some functions from Holger's TriStateTreeviewLib.au3 that I have used before and the result seems ok. Holger even uses pictures in it to make the main branch checkbox look indeterminate. Worth a look.

#include <GUIConstants.au3>
#include <Array.au3>

GUICreate("Treeview Checkbox Test", 200, 200)

$Parent = "A|B|C"
$Parent_Split = StringSplit($Parent, "|")

$Child = "Child1|Child2|Child3"
$Child_Split = StringSplit($Child, "|")

Global $Treeview = GUICtrlCreateTreeView(20, 20, 150, 150, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)

Dim $Tree_Parent_Split[$Parent_Split[0] + 1]
Dim $Tree_Child_Split[$Child_Split[0] + 1]

For $x = 1 To $Parent_Split[0]

    $Tree_Parent_Split[$x] = GUICtrlCreateTreeViewItem($Parent_Split[$x], $Treeview)

    For $y = 1 To $Child_Split[0]

        $Tree_Child_Split[$y] = GUICtrlCreateTreeViewItem($Child_Split[$y], $Tree_Parent_Split[$x])

    Next

Next


GUISetState()

While 1

    $Msg = GUIGetMsg()

    Select
        Case $Msg = $GUI_EVENT_CLOSE
            ExitLoop

        Case $Msg >= $Tree_Parent_Split[1]
            If BitAND(GUICtrlRead($Msg), $GUI_INDETERMINATE) Then ContinueLoop; Do nothing when in indeterminate state
            $hItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0)

            If $hItem > 0 Then
                $hChildItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
                If $hChildItem > 0 Then CheckChildItems($Treeview, $hChildItem, BitAND(GUICtrlRead($Msg), $GUI_CHECKED))

                $hParentItem = GUICtrlSendMsg($Treeview, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
                If $hParentItem > 0 Then GetParents($Treeview, $hParentItem, BitAND(GUICtrlRead($Msg), $GUI_CHECKED))
            EndIf

    EndSelect

WEnd

;**********************************************************
; Helper functions
;**********************************************************
Func CheckChildItems($hWnd, $hItem, $nState)
    Local $hChild = SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
    
    While $hChild > 0
        SetItemState($hWnd, $hChild, $nState)
        CheckChildItems($hWnd, $hChild, $nState)
            
        $hChild = SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_NEXT, $hChild)
    WEnd
EndFunc
Func SendMessage($hWnd, $Msg, $wParam, $lParam)
    $nResult = DllCall("user32.dll", "int", "SendMessage", _
                                            "hwnd", $hWnd, _
                                            "int", $Msg, _
                                            "int", $wParam, _
                                            "int", $lParam)
    Return $nResult[0]
EndFunc
Func SetItemState($hWnd, $hItem, $nState)
    $nState = BitShift($nState, -12)
    
    Local $tvItem = DllStructCreate("uint;dword;uint;uint;ptr;int;int;int;int;int;int")
    
    DllStructSetData($tvItem, 1, $TVIF_STATE)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 3, $nState)
    DllStructSetData($tvItem, 4, $TVIS_STATEIMAGEMASK)
    
    SendMessage($hWnd, $TVM_SETITEM, 0, DllStructGetPtr($tvItem))
EndFunc
;~ Func CheckChilds($nCtrl, $hItem, $nCheck)
;~  While $hItem > 0
;~      $nItem = GetItemID($nCtrl, $hItem)
;~      $arr = GUICtrlRead($nItem, 1)
;~      GUICtrlSetState($nItem, $nCheck * - 3 + $GUI_UNCHECKED)
;~      ; Same like: GUICtrlSetState($nItem, BitOr(BitAnd($nCheck, $GUI_UNCHECKED), BitAnd($nCheck, $GUI_CHECKED)))
;~      $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
;~      If $hChildItem > 0 Then CheckChilds($nCtrl, $hChildItem, $nCheck)
;~      $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
;~  WEnd
;~ EndFunc   ;==>CheckChilds


;**********************************************************
; Check/set state of the parent items until root
;**********************************************************

Func GetParents($nCtrl, $hItem, $nCheck)
    While $hItem > 0
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        $nState = $nCheck * - 3 + $GUI_UNCHECKED
        $nCheckState = $nState
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheckState)
        $nItem = GetItemID($nCtrl, $hItem)
        $arInfo = GUICtrlRead($nItem, 1)
        If $nCheckState Then
            GUICtrlSetState($nItem, $nState)
        Else
            GUICtrlSetState($nItem, $GUI_INDETERMINATE)
        EndIf
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
    WEnd
EndFunc   ;==>GetParents


;**********************************************************
; Gets state of the child items in the subtree
;**********************************************************

Func GetChilds($nCtrl, $hItem, ByRef $nCheck)
    While $hItem > 0
        $nItem = GetItemID($nCtrl, $hItem)
        If Not BitAND(GUICtrlRead($nItem), $nCheck) Then
            $nCheck = 0
            ExitLoop
        EndIf
        $hChildItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
        If $hChildItem > 0 Then GetChilds($nCtrl, $hChildItem, $nCheck)
        $hItem = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_NEXT, $hItem)
    WEnd
EndFunc   ;==>GetChilds


;**********************************************************
; Returns the CtrlID by a given treeitem-handle
;**********************************************************

Func GetItemID($Ctrl, $hItem)
    $nID = 0
    $hTree = ControlGetHandle("", "", $Ctrl)

    $TVITEM = DllStructCreate("uint;int;uint;uint;ptr;int;int;int;int;int")
    If @error Then
        $TVITEM = 0
        Return $nID
    EndIf
    DllStructSetData($TVITEM, 1, $TVIF_PARAM)
    DllStructSetData($TVITEM, 2, $hItem)

    $nResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hTree, "int", $TVM_GETITEM, "int", 0, "ptr", DllStructGetPtr($TVITEM))
    If ($nResult[0]) Then
        $nID = DllStructGetData($TVITEM, 10)
    EndIf

    ;DllStructDelete($TVITEM)

    Return $nID
EndFunc   ;==>GetItemID

:)

Share this post


Link to post
Share on other sites
DjDeep00

MHz...Thanks for helping me out with this...The only one thing that is not working rite now is if you check the parent, the child items dont get selected. Also how would you read the treeview control?...Meaning is there some function that would return an array of all the items that are check in the treeview?...

Thanks.

Share this post


Link to post
Share on other sites
MHz

Try these changes with the Tri-State checkboxes.

GuiScript.zip

:)

Share this post


Link to post
Share on other sites
DjDeep00

Thanks again MHz...The only thing left now is to read whatever I checked....Let me fool around with that...Just a warning...I might bug you again. :)

Share this post


Link to post
Share on other sites
MHz

Use GuiCtrlRead() to see if they are checked. You can also use advanced parameter of GuiCtrlRead() to read the text from the item.

A treeview control can hold lots of items so would suggest arrays to handle them in loops to process. Also have a good look through the standard UDFs for handling treeviews as you may certainly will need to use them.

:)

Share this post


Link to post
Share on other sites
DjDeep00

Use GuiCtrlRead() to see if they are checked. You can also use advanced parameter of GuiCtrlRead() to read the text from the item.

A treeview control can hold lots of items so would suggest arrays to handle them in loops to process. Also have a good look through the standard UDFs for handling treeviews as you may certainly will need to use them.

:rolleyes:

Mhz...When you manually check one of the child items of a Parent, the parent has the picture inside the checkbox to show you that only one of the child items is selected...How can I do this by using Guictrlsetstate or is there another way?

Share this post


Link to post
Share on other sites
MHz

Mhz...When you manually check one of the child items of a Parent, the parent has the picture inside the checkbox to show you that only one of the child items is selected...How can I do this by using Guictrlsetstate or is there another way?

So are you asking for a method of setting a child item as checked/unchecked within the script and to set the parent to the correct state to reflect the change?

Share this post


Link to post
Share on other sites
DjDeep00

MHz....sorry for delayed response...yes that is exactly what I am trying todo. I am fooling around with Guictrlsetstate and _GUICtrlTreeViewGetParentID. I think i have figured it out. Let me see if I can cook it up myself and if I get stuck..then i will bug you MHz...thanks again.

Share this post


Link to post
Share on other sites
randallc

I am fooling around with Guictrlsetstate and _GUICtrlTreeViewGetParentID. I think i have figured it out. Let me see if I can cook it up myself

Hi, that wold be useful to see if you get it going.

TIA and Best, Randall!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×