enaiman Posted May 12, 2009 Posted May 12, 2009 Well, I do have a couple issues related to a treeview. First: An OnEvent function cannot be assigned to a tree item created using _GUICtrlTreeView_Add #include <GuiConstantsEx.au3> #include <GuiTreeView.au3> #include <GuiImageList.au3> #include <WindowsConstants.au3> Opt('MustDeclareVars', 1) Opt("GUIOnEventMode", 1) $Debug_TV = False; Check ClassName being passed to functions, set to True and use a handle to another control to see it work Global $Item1, $Item2 Global $hTreeView Global $iStyle = BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES) GUICreate("TreeView", 400, 300) GUISetOnEvent($GUI_EVENT_CLOSE, "_Close") $hTreeView = GUICtrlCreateTreeView(2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE) $Item1 = GUICtrlCreateTreeViewItem("New Item 1", $hTreeView) GUICtrlSetOnEvent($Item1, "Parent1Event") $Item2 = _GUICtrlTreeView_Add($hTreeView, $Item1, "New Item 2") GUICtrlSetOnEvent($Item2, "Parent2Event") GUISetState() While 1 Sleep(100) WEnd Func Parent1Event() MsgBox(0, "", "parent1") EndFunc Func Parent2Event() MsgBox(0, "", "parent2") EndFunc Func _Close() Exit EndFunc You can see that the function Parent1Event is triggered normally while Parent2Event is never called. Since both GUICtrlCreateTreeViewItem and _GUICtrlTreeView_Add return the control handle I wonder why the latter doesn't work? Second: Given a treeveiew with checkboxes, the event is triggered when: - the checkbox is checked/unchecked - the text label is clicked - the node is expanding/collapsing Q: can the event be triggered only by checking/unchecking the checkbox and not by other 2? Any help is highly appreciated. SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script wannabe "Unbeatable" Tic-Tac-Toe Paper-Scissor-Rock ... try to beat it anyway :)
picaxe Posted May 13, 2009 Posted May 13, 2009 Since both GUICtrlCreateTreeViewItem and _GUICtrlTreeView_Add return the control handle I wonder why the latter doesn't work?The problem is that _GUICtrlTreeView_Add returns a handle and GUICtrlSetOnEvent expects a controlid. Authenticity has a solution in this thread.
enaiman Posted May 13, 2009 Author Posted May 13, 2009 @pickaxe Thanks for your help. The link is very useful; I can see why it escaped to my search (I've searched for treeview +checkbox in the title). Now this being clarified ... let's wait for a solution for my second issue SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script wannabe "Unbeatable" Tic-Tac-Toe Paper-Scissor-Rock ... try to beat it anyway :)
picaxe Posted May 14, 2009 Posted May 14, 2009 Q: can the event be triggered only by checking/unchecking the checkbox and not by other 2?That seems like a useful feature. After playing with some help file and forum snippets. I ended up with this, which appears to do what you want.expandcollapse popup#include <GUITreeView.au3> #include <WindowsConstants.au3> #include <GuiConstants.au3> Opt("GUIOnEventMode", 1) Global $hGUI = GUICreate('TreeView', 250, 300) Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES) Global $idTreeView = GUICtrlCreateTreeView(0, 0, 250, 300, $iStyle, $WS_EX_CLIENTEDGE) Global $hTreeView = GUICtrlGetHandle($idTreeView) _GUICtrlTreeView_BeginUpdate($hTreeView) Global $idParent1 = GUICtrlCreateTreeViewItem('Parent1', $idTreeView) Global $hParent1 = GUICtrlGetHandle($idParent1) For $i = 1 To 5 GUICtrlCreateTreeViewItem('Parent1 Child' & $i, $idParent1) Next For $i = 0 To 2 _GUICtrlTreeView_SetCheckedByIndex($hTreeView, $hParent1, $i) Next Global $hParent2 = _GUICtrlTreeView_Add($hTreeView, 0, 'Parent2') For $i = 1 To 5 _GUICtrlTreeView_AddChild($hTreeView, $hParent2, 'Parent2 Child' & $i) Next _GUICtrlTreeView_SetState($hTreeView, $hParent1, $TVIS_EXPANDED) _GUICtrlTreeView_SetState($hTreeView, $hParent2, $TVIS_EXPANDED) _GUICtrlTreeView_EndUpdate($hTreeView) GUISetOnEvent($GUI_EVENT_CLOSE, "TreeEvents") GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "TreeEvents") ;~ GUIRegisterMsg($WM_NOTIFY, 'OnNotify') GUISetState() While 1 Sleep(20) WEnd ;~ Func OnNotify($hwnd, $iMsg, $iwParam, $ilParam) ;~ Local $tNMTV = DllStructCreate($tagNMTREEVIEW, $ilParam) ;~ Local $hwndFrom = DllStructGetData($tNMTV, 'hWndFrom') ;~ Local $iCode = DllStructGetData($tNMTV, 'Code') ;~ If $hwndFrom = $hTreeView And $iCode = $TVN_SELCHANGED Then ;~ ConsoleWrite(_GUICtrlTreeView_GetText($hTreeView, DllStructGetData($tNMTV, 'NewhItem')) & @LF) ;~ EndIf ;~ EndFunc Func TreeEvents() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE _GUICtrlTreeView_Destroy($hTreeView) GUIDelete() Exit Case $GUI_EVENT_PRIMARYDOWN Local $tMPos = _WinAPI_GetMousePos(True, $hTreeView) Local $tHitTest = _GUICtrlTreeView_HitTestEx($hTreeView, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) Local $iFlags = DllStructGetData($tHitTest, "Flags") If BitAND($iFlags, $TVHT_ONITEMSTATEICON) <> 0 Then Local $iItem = _GUICtrlTreeView_HitTestItem($hTreeView, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) ConsoleWrite(_GUICtrlTreeView_GetText($hTreeView, $iItem) & " is checked = " & _GUICtrlTreeView_GetChecked($hTreeView, $iItem) & @LF) EndIf EndSwitch EndFunc
enaiman Posted May 17, 2009 Author Posted May 17, 2009 (edited) @picaxe Thanks alot for your help, it works marvellous. I have to test it with a tree with images to see it it does the same. I needed this feature on treeview because I needed to implement a "smart" checking-unchecking of parents/children. I'm thinking an example would be welcome but I don't want to "steal" your idea so I would like to ask you if you would like do that check/uncheck example. Something like: if a parent is checked/unchecked then it will check/uncheck the children, if a child is checked/unchecked then it will check/uncheck its parent and its own children ... I really apreciate your help, and now I can continue working on that script EDIT: tested with images and it works very well Edited May 18, 2009 by enaiman SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script wannabe "Unbeatable" Tic-Tac-Toe Paper-Scissor-Rock ... try to beat it anyway :)
picaxe Posted May 18, 2009 Posted May 18, 2009 Something like: if a parent is checked/unchecked then it will check/uncheck the children, if a child is checked/unchecked then it will check/uncheck its parent and its own children ...You're welcome, try thisexpandcollapse popup#include <GUITreeView.au3> #include <WindowsConstants.au3> #include <GuiConstants.au3> Opt("GUIOnEventMode", 1) Local $hGUI = GUICreate('TreeView', 300, 400) Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES) Local $idTreeView = GUICtrlCreateTreeView(0, 0, 300, 400, $iStyle, $WS_EX_CLIENTEDGE) Global $hTreeView = GUICtrlGetHandle($idTreeView) _GUICtrlTreeView_BeginUpdate($hTreeView) Local $idParent1 = GUICtrlCreateTreeViewItem('Parent1', $idTreeView) Local $hParent1 = GUICtrlGetHandle($idParent1) $idLevel2 = GUICtrlCreateTreeViewItem('1-1', $idParent1) For $i = 2 To 5 GUICtrlCreateTreeViewItem('1-' & $i, $idParent1) Next $idLevel3 = GUICtrlCreateTreeViewItem('2-1', $idLevel2) For $i = 2 To 5 GUICtrlCreateTreeViewItem('2-' & $i, $idLevel2) Next $idLevel4 = GUICtrlCreateTreeViewItem('3-1', $idLevel3) For $i = 2 To 5 GUICtrlCreateTreeViewItem('3-' & $i, $idLevel3) Next For $i = 1 To 5 GUICtrlCreateTreeViewItem('4-' & $i, $idLevel4) Next Local $idParent2 = GUICtrlCreateTreeViewItem('Parent2', $idTreeView) Local $hParent2 = GUICtrlGetHandle($idParent2) For $i = 1 To 5 GUICtrlCreateTreeViewItem('2-' & $i, $idParent2) Next Local $idParent3 = GUICtrlCreateTreeViewItem('Parent3', $idTreeView) Local $hParent3 = GUICtrlGetHandle($idParent3) For $i = 1 To 5 GUICtrlCreateTreeViewItem('3-' & $i, $idParent3) Next Local $idParent4 = GUICtrlCreateTreeViewItem('Parent4', $idTreeView) Local $hParent4 = GUICtrlGetHandle($idParent4) _GUICtrlTreeView_SetState($hTreeView, $hParent1, $TVIS_EXPANDED) _GUICtrlTreeView_SetState($hTreeView, $hParent2, $TVIS_EXPANDED) _GUICtrlTreeView_SetState($hTreeView, GUICtrlGetHandle($idLevel2), $TVIS_EXPANDED) _GUICtrlTreeView_SetState($hTreeView, GUICtrlGetHandle($idLevel3), $TVIS_EXPANDED) _GUICtrlTreeView_SetState($hTreeView, GUICtrlGetHandle($idLevel4), $TVIS_EXPANDED) _GUICtrlTreeView_EndUpdate($hTreeView) GUISetOnEvent($GUI_EVENT_CLOSE, "TreeEvents") GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "TreeEvents") GUISetState() While 1 Sleep(20) WEnd Func TreeEvents() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE _GUICtrlTreeView_Destroy($hTreeView) GUIDelete() Exit Case $GUI_EVENT_PRIMARYDOWN Local $tMPos = _WinAPI_GetMousePos(True, $hTreeView) Local $tHitTest = _GUICtrlTreeView_HitTestEx($hTreeView, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) Local $iFlags = DllStructGetData($tHitTest, "Flags") Select Case BitAND($iFlags, $TVHT_ONITEMSTATEICON) Local $hItem = _GUICtrlTreeView_HitTestItem($hTreeView, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) Local $fChecked = False If _GUICtrlTreeView_GetChecked($hTreeView, $hItem) Then $fChecked = True _TvCheckbox($hItem, $fChecked) EndSelect EndSwitch EndFunc ;==>TreeEvents Func _TvCheckbox($hTvItem, $fTvCheck) Local $hFirst, $hNext $hTvParent = _GUICtrlTreeView_GetParentHandle($hTreeView, $hTvItem) If $hTvParent = 0 Then $hTvParent = $hTvItem If $hTvParent Then _GUICtrlTreeView_SetChecked($hTreeView, $hTvParent, $fTvCheck) $hFirst = _GUICtrlTreeView_GetFirstChild($hTreeView, $hTvParent) If $hFirst Then $hNext = $hFirst While $hNext _GUICtrlTreeView_SetChecked($hTreeView, $hNext, $fTvCheck) If _GUICtrlTreeView_GetChildren($hTreeView, $hNext) Then _ _TvCheckbox(_GUICtrlTreeView_GetFirstChild($hTreeView, $hNext), $fTvCheck) $hNext = _GUICtrlTreeView_GetNextSibling($hTreeView, $hNext) WEnd EndIf EndFunc ;==>_TvCheckbox
enaiman Posted May 18, 2009 Author Posted May 18, 2009 Nicely done Working on to implement it in my script (mine was a little more "messy") Thanks again SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script wannabe "Unbeatable" Tic-Tac-Toe Paper-Scissor-Rock ... try to beat it anyway :)
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now