I hope this code displays ok on this new forum.

Code:
#COMPILE EXE #DIM ALL #INCLUDE "win32api.inc" #INCLUDE "Commctrl.inc" 'Include file statements '======================================================================== %ID_TREE = 100 TYPE itemRef_UDT hItem AS LONG parent AS LONG subDirs AS BYTE done AS BYTE END TYPE GLOBAL hTree AS LONG GLOBAL numItems AS LONG GLOBAL maxDim AS LONG GLOBAL item() AS STRING GLOBAL itemRef() AS itemRef_UDT DECLARE FUNCTION TVInsertItem(LONG, LONG, STRING, BYTE) AS LONG DECLARE FUNCTION getItemNo(LONG) AS LONG DECLARE FUNCTION subDirsExist(STRING) AS BYTE DECLARE SUB getNextDirs(LONG) '======================================================================== FUNCTION PBMAIN() LOCAL hMain AS LONG DIALOG NEW PIXELS, 0, "my TreeView", , , 400, 300,%WS_SYSMENU OR %WS_MINIMIZEBOX TO hMain 'add treeview common control CONTROL ADD "SysTreeView32", hMain, %ID_TREE, "", 0, 0, 400, 300, _ %WS_CHILD OR %WS_VISIBLE OR %TVS_HASBUTTONS OR %TVS_HASLINES OR _ %TVS_LINESATROOT OR %TVS_SHOWSELALWAYS, %WS_EX_CLIENTEDGE DIALOG SHOW MODAL hMain CALL mainProc END FUNCTION CALLBACK FUNCTION mainProc() LOCAL i, m, n, hTreeItem, hItem, hParent, hChild AS LONG LOCAL s AS STRING, szTxt AS ASCIIZ*64 LOCAL lpNmh AS NMHDR PTR LOCAL lpTV AS NM_TREEVIEW PTR LOCAL treeItem AS TV_ITEM LOCAL TVdi AS TV_DISPINFO SELECT CASE CBMSG CASE %WM_INITDIALOG maxDim = 2000 DIM item(maxDim) DIM itemRef(maxDim) 'find the first level children of C:\ item(0) = "C:": getNextDirs 0 'display the folders and files CONTROL HANDLE CBHNDL, %ID_TREE TO hTree itemRef(0).hItem = TVInsertItem(hTree, 0, "C:\", 1) FOR i = 1 TO numItems s = PARSE$(item(i), "\", -1) hParent = itemRef(itemRef(i).parent).hItem hChild = TVInsertItem(hTree, hParent, s, itemRef(i).subDirs) itemRef(i).hItem = hChild NEXT i 'open with first level folders... the children of C:\ SendMessage hTree, %TVM_EXPAND, %TVE_EXPAND, itemRef(0).hItem CASE %WM_PAINT CASE %WM_COMMAND SELECT CASE CBCTL END SELECT CASE %WM_NOTIFY lpNmh = CBLPARAM SELECT CASE @lpNmh.Code CASE %TVN_ITEMEXPANDING 'expand or collapse the treeview node hTreeItem lpTV = CBLPARAM hTreeItem = @lpTV.ItemNew.hItem m = numItems: n = getItemNo(hTreeItem) IF itemRef(n).done THEN EXIT FUNCTION getNextDirs n FOR i = m + 1 TO numItems s = PARSE$(item(i), "\", -1) hParent = itemRef(itemRef(i).parent).hItem hChild = TVInsertItem(hTree, hParent, s, itemRef(i).subDirs) itemRef(i).hItem = hChild NEXT i END SELECT CASE %WM_SYSCOMMAND CASE %WM_DESTROY END SELECT END FUNCTION FUNCTION getItemNo(hTreeItem AS LONG) AS LONG 'get itemNo corresponding to item's handle 'hTreeItem = item handle 'numItems = number of items defined (nodes of treeview) '=================================================================== LOCAL i, n AS LONG FOR i = 1 TO numItems IF itemRef(i).hItem = hTreeItem THEN n = i: EXIT FOR NEXT i FUNCTION = n END FUNCTION FUNCTION TVInsertItem(hTree AS LONG, hParent AS LONG, sTxt AS STRING, b AS BYTE) AS LONG 'insert item into treeview control '-------------------------------------------------------------------------------- 'hTree = handle of treeview control 'hParent = handle of parent to item 'sTxt = string label identifying item 'b = set if children exist for this item '================================================================================ LOCAL tv_insert AS TV_INSERTSTRUCT tv_insert.hParent = hParent tv_insert.Item.Item.mask = %TVIF_TEXT OR %TVIF_CHILDREN tv_insert.Item.Item.pszText = STRPTR(sTxt) tv_insert.Item.Item.cchTextMax = LEN(sTxt) IF b THEN tv_insert.Item.Item.cChildren = 1 FUNCTION = TreeView_InsertItem(hTree, tv_insert) END FUNCTION SUB getNextDirs(itemNo AS LONG) 'find next first level children of itemNo 'update global item(), itemRef(), and numItems '------------------------------------------------------------------- 'item() = array of folder names 'itemRef() = array of folder info UDTs 'numItems = number of nodes identified so far '=================================================================== LOCAL s, sParent AS STRING LOCAL attr, i, k, n, nDim AS LONG DIM sTemp(maxDim) AS STRING sParent = RTRIM$(item(itemNo), "\") + "\" attr = %SUBDIR 'OR %READONLY OR %HIDDEN OR %SYSTEM s = DIR$(sParent, attr) IF LEN(s) THEN k = GETATTR(sParent + s) AND %SUBDIR IF k THEN INCR n: sTemp(n) = s DO s = DIR$: k = 0: IF LEN(s) = 0 THEN EXIT DO k = GETATTR(sParent + s) AND %SUBDIR IF k THEN INCR n: sTemp(n) = s LOOP END IF itemRef(numItems).done = 1 'found n subdirectories of itemNo '... now update numItems, item(), and itemRef() IF n = 0 THEN EXIT SUB numItems = numItems + n nDim = UBOUND(item) IF nDim < numItems THEN 'redim arrays if necessary nDim = numItems + 1000 REDIM PRESERVE item(nDim) REDIM PRESERVE itemRef(nDim) END IF FOR i = 1 TO n s = sParent + sTemp(i) item(numItems - n + i) = s itemRef(numItems - n + i).parent = itemNo itemRef(numItems - n + i).subDirs = subDirsExist(s) NEXT i END SUB FUNCTION subDirsExist(sItem AS STRING) AS BYTE 'return 1 if any children exist for this node 'this function is needed to determine if node needs a [+] button '---------------------------------------------------------------- 'sItem = name of node '================================================================ LOCAL attr, k AS LONG LOCAL s, sParent AS STRING sParent = RTRIM$(sItem, "\") + "\" attr = %SUBDIR 'OR %READONLY OR %HIDDEN OR %SYSTEM s = DIR$(sParent, attr) IF LEN(s) THEN k = GETATTR(sParent + s) AND %SUBDIR DO WHILE LEN(s) AND k = 0 s = DIR$: IF LEN(s) = 0 THEN EXIT DO k = GETATTR(sParent + s) AND %SUBDIR LOOP END IF FUNCTION = SGN(k) END FUNCTION