Что нового

[Элементы GUI] Автоматическое изменение Checked у дочерних элементов TreeView

shefanya

Новичок
Сообщения
1
Репутация
1
Необходимо чтобы при изменении Галочки устанавливались или снимались галки у дочерних Элементов

Была Проблема не мог поймать событие изменение Галки

Пример смотрите ниже



Код:
#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
 
Верх