Необходимо чтобы при изменении Галочки устанавливались или снимались галки у дочерних Элементов
Была Проблема не мог поймать событие изменение Галки
Пример смотрите ниже
Была Проблема не мог поймать событие изменение Галки
Пример смотрите ниже
Код:
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
$Debug_TV = False ; Check ClassName being passed to functions, set to True and use a handle to another control to see it work
Global $hTreeView
Local $hItemFOCUS,$hItemCheked
_Main()
Func _Main()
Local $hItem, $hImage, $iImage
Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
GUICreate("TreeView Click Item", 400, 300)
$hTreeView = GUICtrlCreateTreeView(2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, "shell32.dll", 110)
_GUIImageList_AddIcon($hImage, "shell32.dll", 131)
_GUIImageList_AddIcon($hImage, "shell32.dll", 165)
_GUIImageList_AddIcon($hImage, "shell32.dll", 168)
_GUIImageList_AddIcon($hImage, "shell32.dll", 137)
_GUIImageList_AddIcon($hImage, "shell32.dll", 146)
_GUICtrlTreeView_SetNormalImageList($hTreeView, $hImage)
_GUICtrlTreeView_BeginUpdate($hTreeView)
For $x = 1 To Random(2, 10, 1)
$iImage = Random(0, 5, 1)
$hItem = _GUICtrlTreeView_Add($hTreeView, 0, StringFormat("[%02d] New Item", $x), $iImage, $iImage)
For $y = 1 To Random(2, 10, 1)
$iImage = Random(0, 5, 1)
_GUICtrlTreeView_AddChild($hTreeView, $hItem, StringFormat("[%02d] New Child", $y), $iImage, $iImage)
Next
Next
_GUICtrlTreeView_EndUpdate($hTreeView)
_GUICtrlTreeView_ClickItem($hTreeView, $hItem, "left", False, 2)
; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>_Main
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTreeView
If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case -2
$hItemFOCUS=__TV_GetItemHandle($hWndFrom)
$hItemCheked=_GUICtrlTreeView_GetChecked($hWndTreeview,$hItemFOCUS)
Case -419
$hItem=__TV_GetItemHandle($hWndFrom)
If $hItemFOCUS=$hItem And $hItemCheked<>_GUICtrlTreeView_GetChecked($hWndTreeview,$hItem) Then
if _GUICtrlTreeView_GetChecked($hWndTreeview,$hItem) Then
ChangeCheckedForChildren($hWndTreeview,$hItem,True)
ChangeCheckedForParent($hWndTreeview,$hItem,True)
Else
ChangeCheckedForChildren($hWndTreeview,$hItem,False)
If not SiblingChecked($hWndTreeview,$hItem) Then
ChangeCheckedForParent($hWndTreeview,$hItem,False)
EndIf
EndIf
EndIf
Case Else
Return 0
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func ChangeCheckedForChildren($hWnd,$hItem,$Checked)
$hItemChild=_GUICtrlTreeView_GetFirstChild($hWnd, $hItem)
While $hItemChild>0
if _GUICtrlTreeView_GetChildren($hWnd, $hItemChild) Then
ChangeCheckedForChildren($hWnd,$hItemChild,$Checked)
EndIf
_GUICtrlTreeView_SetChecked($hWnd, $hItemChild, $Checked )
$hItemChild=_GUICtrlTreeView_GetNextSibling($hWnd, $hItemChild)
WEnd
EndFunc
Func ChangeCheckedForParent($hWnd,$hItem,$Checked)
$hItemParent=_GUICtrlTreeView_GetParentHandle($hWnd, $hItem )
If $hItemParent>0 Then
_GUICtrlTreeView_SetChecked($hWnd, $hItemParent, $Checked )
EndIf
EndFunc
Func SiblingChecked($hWnd,$hItem)
$hItemParent=_GUICtrlTreeView_GetParentHandle($hWnd, $hItem )
if $hItemParent >0 then
$hItemFirstSibling=_GUICtrlTreeView_GetFirstChild($hWnd, $hItemParent )
Else
$hItemFirstSibling=_GUICtrlTreeView_GetFirstItem($hWnd )
EndIf
$Result=_GUICtrlTreeView_GetChecked($hWnd,$hItemFirstSibling)
$hItemNextSibling=_GUICtrlTreeView_GetNextSibling($hWnd, $hItemFirstSibling )
While $hItemNextSibling>0
$Result+=_GUICtrlTreeView_GetChecked($hWnd,$hItemNextSibling)
$hItemNextSibling=_GUICtrlTreeView_GetNextSibling($hWnd, $hItemNextSibling )
WEnd
Return $result
EndFunc
Func __TV_GetItemHandle($hTV)
$tPoint = _WinAPI_GetMousePos(1, $hTV)
$tTVHTI = _GUICtrlTreeView_HitTestEx($hTV, DllStructGetData($tPoint, 1), DllStructGetData($tPoint, 2))
$hItem = DllStructGetData($tTVHTI, 'Item')
Return $hItem
EndFunc