The #NM_CUSTOMDRAW code is from Sparkie (thanks), and is used to delete some checkboxes. Works fine.
BTW: Looping through all treegadget items to find the itemnr in the #TVN_ITEMCHANGING code is the only way ??
Code: Select all
EnableExplicit
Enumeration
#Window
#Tree
#Image1
#Image2
EndEnumeration
; This one is not present in 5.62 ??
CompilerIf Not Defined(TVN_ITEMCHANGING, #PB_Constant)
#TVN_ITEMCHANGING = -417
CompilerEndIf
Declare Main()
Declare Callback_Window(HWnd.i, uMsg.i, WParam.i, LParam.i)
Procedure Main()
Protected Exit.b
Protected Event.i
OpenWindow(#Window, 0, 0, 150, 300, "Tree Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowCallback(@Callback_Window(), #Window)
; Tree ItemData :
; ItemData = #Null => No checkbox
; ItemData = pointer to a structure => Checkbox
TreeGadget(#Tree, 10, 10, 130, 280, #PB_Tree_AlwaysShowSelection | #PB_Tree_CheckBoxes | #PB_Tree_ThreeState)
AddGadgetItem(#Tree, 0, "Parent 1", ImageID(#Image1), 0)
SetGadgetItemData(#Tree, 0, #Null)
AddGadgetItem(#Tree, 1, "Child 1", ImageID(#Image2), 1)
SetGadgetItemData(#Tree, 1, $ABBA1)
AddGadgetItem(#Tree, 2, "Child 2", ImageID(#Image2), 1)
SetGadgetItemData(#Tree, 2, $ABBA2)
AddGadgetItem(#Tree, 3, "Parent 2", ImageID(#Image1), 0)
SetGadgetItemData(#Tree, 0, #Null)
AddGadgetItem(#Tree, 4, "Child 3", ImageID(#Image2), 1)
SetGadgetItemData(#Tree, 4, $DEADBEEF1)
AddGadgetItem(#Tree, 5, "Child 4", ImageID(#Image2), 1)
SetGadgetItemData(#Tree, 5, $DEADBEEF2)
SetGadgetItemState(#Tree, 0, #PB_Tree_Expanded | #PB_Tree_Selected)
SetGadgetItemState(#Tree, 3, #PB_Tree_Expanded | #PB_Tree_Selected)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Exit = #True
EndSelect
Until Exit
EndProcedure
Procedure Callback_Window(HWnd.i, uMsg.i, WParam.i, LParam.i)
Protected *pNmhdr.NMHDR
Protected *pNmtvcustomdraw.NMTVCUSTOMDRAW
Protected *pNmtvitemchange.NMTVITEMCHANGE
Protected Tv_Item.TV_ITEM
Protected Gadget.i
Protected ItemNr.i
Protected ItemData.i
Protected LoopCnt.i
Protected HItem.i
Select uMsg
Case #WM_NOTIFY
*pNmhdr = LParam
Select *pNmhdr\code
Case #NM_CUSTOMDRAW
; for *all* treegadgets - every item that has a #Null as data, do not draw checkbox...
Gadget = GetDlgCtrlID_(*pNmhdr\hwndFrom)
If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Tree
*pNmtvcustomdraw = LParam
ItemNr = *pNmtvcustomdraw\nmcd\lItemlParam
; #Null means no checkbox, so prevent the checkbox from displaying
ItemData = GetGadgetItemData(Gadget, ItemNr)
If Not ItemData
Tv_Item\mask = #TVIF_HANDLE | #TVIF_STATE
Tv_Item\hItem = GadgetItemID(Gadget, ItemNr)
Tv_Item\state = 0
Tv_Item\stateMask = #TVIS_STATEIMAGEMASK
SendMessage_(*pNmhdr\hwndFrom, #TVM_SETITEM, 0, @Tv_Item)
EndIf
EndIf
Case #TVN_ITEMCHANGING
; for *all* treegadgets - every item that has a ??? as data, do not change checkbox...
Gadget = GetDlgCtrlID_(*pNmhdr\hwndFrom)
If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Tree
*pNmtvitemchange = LParam
; Only look for state changes...
If *pNmtvitemchange\uChanged = #TVIF_STATE And ((*pNmtvitemchange\uStateNew & #TVIS_STATEIMAGEMASK) <> (*pNmtvitemchange\uStateOld & #TVIS_STATEIMAGEMASK))
; Get the handle for the selected item and search the item *number*
HItem = SendMessage_(*pNmhdr\hwndFrom, #TVM_GETNEXTITEM, #TVGN_CARET, *pNmtvitemchange\hItem)
For LoopCnt = 0 To CountGadgetItems(Gadget) - 1
If GadgetItemID(Gadget, LoopCnt) = HItem
ItemNr = LoopCnt
;Debug "uStateOld = " + Str(((*pNmtvitemchange\uStateOld & #TVIS_STATEIMAGEMASK) >> 12) & 15)
;Debug "uStateNew = " + Str(((*pNmtvitemchange\uStateNew & #TVIS_STATEIMAGEMASK) >> 12) & 15)
Debug "----------------"
Debug "ItemNr = " + Str(ItemNr)
Debug "uStateOld = " + Str(*pNmtvitemchange\uStateOld)
Debug "uStateNew = " + Str(*pNmtvitemchange\uStateNew)
EndIf
Next
;If ItemNr = 2 : ProcedureReturn #True : EndIf
EndIf
EndIf
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
UsePNGImageDecoder()
LoadImage(#Image1, #PB_Compiler_Home + "examples\sources\Data\Toolbar\Open.png")
LoadImage(#Image2, #PB_Compiler_Home + "examples\sources\Data\Toolbar\Save.png")
Main()
End