$include "windowssdk.inc" $include "commctrl.inc" autodefine "off" WINDOW d1 UINT TreeBkColor 'UINT TvLastHitItems UINT TVhWnd 'handle to tree UINT handle[15] 'item handles OpenWindow d1,0,0,300,300,@caption,d1,"TV Demo",&handler CONTROL d1,@TREEVIEW,"Static",10,10,272,248,0x50800027|TVS_CHECKBOXES,1 TVhWnd = GetDlgItem(d1.hWnd, 1) AddItems() TreeBkColor = rgb(210,210,210) SetWindowColor d1, TreeBkColor SendMessage d1, TVM_SETINDENT, 8, 0, 1 SendMessageA(TVhWnd, TVM_SETBKCOLOR, 0, TreeBkColor) SendMessageA(TVhWnd, TVM_SETLINECOLOR, 0, 0) SendMessageA(TVhWnd, TVM_SETTEXTCOLOR, 0, 0x8FFFFF) starttimer d1,100 'TreeView_Collapse(TVhWnd, handle[0]) TreeView_SetCheckState(TVhWnd, handle[0], 1) TreeView_SetCheckState(TVhWnd, handle[1], 1) TreeView_SetCheckState(TVhWnd, handle[2], 1) TreeView_SetItemState(TVhWnd, handle[0], TVIS_BOLD, TVIS_BOLD) TreeView_SetItemState(TVhWnd, handle[3], TVIS_BOLD, TVIS_BOLD) TreeView_SetItemState(TVhWnd, handle[6], TVIS_BOLD, TVIS_BOLD) WaitUntil d1.hWnd=0 end sub TreeView_SetItemState(HWND hWndTV,HTREEITEM hItem,UINT state,UINT stateMask),UINT TVITEM tvi tvi.mask = TVIF_STATE tvi.hItem = hItem tvi.state = state tvi.stateMask = stateMask return SendMessageA(hWndTV, TVM_SETITEM, 0, &tvi) endsub sub TreeView_SetCheckState(HWND hWndTV,HTREEITEM hItem,BOOL fCheck),UINT return TreeView_SetItemState(hWndTV, hItem, INDEXTOSTATEIMAGEMASK(IIF(fCheck,2,1)), TVIS_STATEIMAGEMASK) endsub sub TreeView_GetCheckState(HWND hWndTV, HTREEITEM hItem),UINT return (SendMessageA(hWndTV, TVM_GETITEMSTATE, hItem, TVIS_STATEIMAGEMASK) >> 12) -1 endsub Sub handler(),INT POINT pt Select @message Case @idcreate CenterWindow d1 Case @idtimer setcaption d1, "item [0] checked: "+str$(TreeView_GetCheckState(TVhWnd, handle[0])) Case @IDCLOSEWINDOW CloseWindow d1 Case @IDCONTROL Select @CONTROLID Case 1 Select @NOTIFYCODE Case NM_CUSTOMDRAW Return TVSubclass(*@lParam) case @nmrclick GetCursorPos(&pt) ScreenToCLient(d1.hWnd, &pt) contextmenu d1, pt.x, pt.y menuitem "nix! :)", 0, 1000 endmenu EndSelect EndSelect EndSelect Return 0 EndSub Sub TVSubclass(lParam:NMTVCUSTOMDRAW),uint Select lParam.nmcd.dwDrawStage Case CDDS_PREPAINT ' Need to process this case and set pResult to CDRF_NOTIFYITEMDRAW, ' otherwise parent will never receive CDDS_ITEMPREPAINT notification. Return CDRF_NOTIFYITEMDRAW Case CDDS_ITEMPREPAINT Select lParam.iLevel Case 0 :' painting all 0-level items blue IF (lParam.nmcd.uItemState & (CDIS_FOCUS | CDIS_SELECTED)) lParam.clrText = RGB(0, 0, 0) lParam.clrTextBk = RGB(0, 255, 0) Else lParam.clrText = RGB(0, 0, 255) Endif Return CDRF_NEWFONT Case 1 :' painting all 1-level items red IF (lParam.nmcd.uItemState & (CDIS_FOCUS | CDIS_SELECTED)) lParam.clrText = RGB(0, 0, 0) lParam.clrTextBk = RGB(255, 255, 0) Else lParam.clrText = RGB(255, 0, 0) Endif Return CDRF_NEWFONT Case 2 :' painting all 2-level items green IF (lParam.nmcd.uItemState & (CDIS_FOCUS | CDIS_SELECTED)) lParam.clrText = RGB(0, 0, 0) lParam.clrTextBk = RGB(0, 255, 255) Else lParam.clrText = RGB(255, 255, 0) Endif Return CDRF_NEWFONT EndSelect Return CDRF_NEWFONT EndSelect Return CDRF_DODEFAULT EndSub 'sub tvIsChildOf(HTREEITEM child, HTREEITEM parent),BOOL ' while (child) ' child = SendMessageA(TVhWnd, TVM_GETNEXTITEM, TVGN_PARENT, child) ' if (child = parent) then return true ' wend ' return false 'endsub Sub AddItems handle[0] = tvInsertItem(d1, 1, "root item 1", 0) handle[1] = tvInsertItem(d1, 1, "subitem 1.1", handle[0]) handle[2] = tvInsertItem(d1, 1, "subitem 1.1.1", handle[1]) handle[3] = tvInsertItem(d1, 1, "root item 2", 0) handle[4] = tvInsertItem(d1, 1, "subitem 2.1", handle[3]) handle[5] = tvInsertItem(d1, 1, "subitem 2.1.1", handle[4]) handle[6] = tvInsertItem(d1, 1, "root item 3", 0) handle[7] = tvInsertItem(d1, 1, "subitem 3.1", handle[6]) handle[8] = tvInsertItem(d1, 1, "subitem 3.2", handle[6]) handle[9] = tvInsertItem(d1, 1, "subitem 3.3", handle[6]) handle[10] = tvInsertItem(d1, 1, "subitem 3.4", handle[6]) handle[11] = tvInsertItem(d1, 1, "subitem 3.2.1", handle[8]) handle[12] = tvInsertItem(d1, 1, "subitem 3.2.2", handle[8]) handle[13] = tvInsertItem(d1, 1, "subitem 3.2.3", handle[8]) handle[14] = tvInsertItem(d1, 1, "subitem 3.2.4", handle[8]) SendMessageA(TVhWnd, TVM_EXPAND, TVE_EXPAND, handle[0]) SendMessageA(TVhWnd, TVM_EXPAND, TVE_EXPAND, handle[1]) SendMessageA(TVhWnd, TVM_EXPAND, TVE_EXPAND, handle[3]) SendMessageA(TVhWnd, TVM_EXPAND, TVE_EXPAND, handle[4]) SendMessageA(TVhWnd, TVM_EXPAND, TVE_EXPAND, handle[6]) EndSub