|  |  | 
 |  |  | #pragma once | 
 |  |  |  | 
 |  |  | #include "wobject/xcontrol.hpp" | 
 |  |  | #include "win32/win.hpp" | 
 |  |  |  | 
 |  |  | typedef struct _TREEITEM{} *HTREEITEM; | 
 |  |  |  | 
 |  |  | #define TVI_ROOT                ((HTREEITEM)(ULONG_PTR)-0x10000) | 
 |  |  | #define TVI_FIRST               ((HTREEITEM)(ULONG_PTR)-0x0FFFF) | 
 |  |  | #define TVI_LAST                ((HTREEITEM)(ULONG_PTR)-0x0FFFE) | 
 |  |  | #define TVI_SORT                ((HTREEITEM)(ULONG_PTR)-0x0FFFD) | 
 |  |  |  | 
 |  |  | #define TVIF_TEXT               0x0001 | 
 |  |  | #define TVIF_IMAGE              0x0002 | 
 |  |  | #define TVIF_PARAM              0x0004 | 
 |  |  | #define TVIF_STATE              0x0008 | 
 |  |  | #define TVIF_HANDLE             0x0010 | 
 |  |  | #define TVIF_SELECTEDIMAGE      0x0020 | 
 |  |  | #define TVIF_CHILDREN           0x0040 | 
 |  |  | #define TVIF_INTEGRAL           0x0080 | 
 |  |  |  | 
 |  |  | #define TVIF_STATEEX            0x0100 | 
 |  |  | #define TVIF_EXPANDEDIMAGE      0x0200 | 
 |  |  |  | 
 |  |  | #define TVIS_SELECTED           0x0002 | 
 |  |  | #define TVIS_CUT                0x0004 | 
 |  |  | #define TVIS_DROPHILITED        0x0008 | 
 |  |  | #define TVIS_BOLD               0x0010 | 
 |  |  | #define TVIS_EXPANDED           0x0020 | 
 |  |  | #define TVIS_EXPANDEDONCE       0x0040 | 
 |  |  | #define TVIS_EXPANDPARTIAL      0x0080 | 
 |  |  |  | 
 |  |  | #define TVIS_OVERLAYMASK        0x0F00 | 
 |  |  | #define TVIS_STATEIMAGEMASK     0xF000 | 
 |  |  | #define TVIS_USERMASK           0xF000 | 
 |  |  |  | 
 |  |  | #define TVGN_ROOT               0x0000 | 
 |  |  | #define TVGN_NEXT               0x0001 | 
 |  |  | #define TVGN_PREVIOUS           0x0002 | 
 |  |  | #define TVGN_PARENT             0x0003 | 
 |  |  | #define TVGN_CHILD              0x0004 | 
 |  |  | #define TVGN_FIRSTVISIBLE       0x0005 | 
 |  |  | #define TVGN_NEXTVISIBLE        0x0006 | 
 |  |  | #define TVGN_PREVIOUSVISIBLE    0x0007 | 
 |  |  | #define TVGN_DROPHILITE         0x0008 | 
 |  |  | #define TVGN_CARET              0x0009 | 
 |  |  | #define TVGN_LASTVISIBLE        0x000A | 
 |  |  | #define TVGN_NEXTSELECTED       0x000B | 
 |  |  |  | 
 |  |  |  #define TV_FIRST 0x1100  | 
 |  |  |  | 
 |  |  | #ifdef XWIN | 
 |  |  | struct SCROLLINFO  | 
 |  |  | { | 
 |  |  |     int cbSize; | 
 |  |  |     int fMask; | 
 |  |  |     int  nMin; | 
 |  |  |     int  nMax; | 
 |  |  |     int nPage; | 
 |  |  |     int  nPos; | 
 |  |  |     int  nTrackPos; | 
 |  |  | }; | 
 |  |  | #endif | 
 |  |  |  | 
 |  |  |  | 
 |  |  | struct tvitem  | 
 |  |  | { | 
 |  |  |     int mask; | 
 |  |  |     HTREEITEM hItem; | 
 |  |  |     int state; | 
 |  |  |     int stateMask; | 
 |  |  |     string pszText; | 
 |  |  |     int cchTextMax; | 
 |  |  |     int iImage; | 
 |  |  |     int iSelectedImage; | 
 |  |  |     int cChildren; | 
 |  |  |     LPARAM lParam; | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | struct tvinsertstruct  | 
 |  |  | { | 
 |  |  |     HTREEITEM hParent; | 
 |  |  |     HTREEITEM hInsertAfter; | 
 |  |  |     tvitem  item; | 
 |  |  | }; | 
 |  |  |      | 
 |  |  |  | 
 |  |  | struct NMTREEVIEW : public NMHDR | 
 |  |  | { | 
 |  |  |     int action; | 
 |  |  |     tvitem itemOld; | 
 |  |  |     tvitem itemNew; | 
 |  |  |     xpoint ptDrag; | 
 |  |  | }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | struct TVNNMHDR : public NMHDR | 
 |  |  | { | 
 |  |  |     HTREEITEM FromItem; | 
 |  |  |     HTREEITEM ToItem; | 
 |  |  |     xpoint pt; | 
 |  |  |     string PopupMenu; | 
 |  |  | };	 | 
 |  |  |  | 
 |  |  | struct NMTVDISPINFO : public NMHDR | 
 |  |  | { | 
 |  |  |     tvitem    item; | 
 |  |  | };	 | 
 |  |  |  | 
 |  |  | struct TVHITTESTINFO { | 
 |  |  |     xpoint     pt; | 
 |  |  |     int      flags; | 
 |  |  |     HTREEITEM hItem; | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | class xtreeview:  public xcontrol | 
 |  |  | { | 
 |  |  | public: | 
 |  |  |     xtreeview() :xcontrol(nullptr) {} | 
 |  |  |     xtreeview(void* implptr) :xcontrol(implptr) {} | 
 |  |  | public: | 
 |  |  |     HTREEITEM GetSelectedItem() | 
 |  |  |     { | 
 |  |  |             int TVM_GETNEXTITEM = TV_FIRST + 10; | 
 |  |  |  | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(), TVM_GETNEXTITEM, TVGN_CARET,0);				  | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     xstring GetItemLabel(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |              int TVM_GETITEM = TV_FIRST + 62; | 
 |  |  |          | 
 |  |  |             tvitem tvi ; | 
 |  |  |             tvi.hItem = hItem; | 
 |  |  |             tvi.mask = TVIF_TEXT; | 
 |  |  |              | 
 |  |  |             wchar_t buf[255]=L""; | 
 |  |  |             tvi.pszText = buf; | 
 |  |  |             tvi.cchTextMax = 255; | 
 |  |  |             SendMessage(GetHWND(),  TVM_GETITEM, 0,(LPARAM)&tvi); | 
 |  |  |             return tvi.pszText;  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int SetItemLabel(HTREEITEM hItem,string label) | 
 |  |  |     { | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63; | 
 |  |  |                  | 
 |  |  |             tvitem tvi ; | 
 |  |  |             tvi.hItem = hItem; | 
 |  |  |             tvi.mask = TVIF_TEXT; | 
 |  |  |             tvi.pszText = label; | 
 |  |  |             tvi.cchTextMax =9999;//label.length()+ 1; | 
 |  |  |  | 
 |  |  |             SendMessage(GetHWND(),  TVM_SETITEM, 0,(LPARAM)&tvi); | 
 |  |  |             return 1;  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     LPARAM GetItemData(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVM_GETITEM = TV_FIRST + 62; | 
 |  |  |                  | 
 |  |  |             //ref tvitem tvi =new tvitem; | 
 |  |  |             tvitem tvi; | 
 |  |  |             tvi.hItem = hItem; | 
 |  |  |  | 
 |  |  |             wchar_t buf[255]; | 
 |  |  |             tvi.pszText = buf; | 
 |  |  |             tvi.cchTextMax = 255; | 
 |  |  |             tvi.mask = TVIF_PARAM|TVIF_TEXT; | 
 |  |  |  | 
 |  |  |             SendMessage(GetHWND(),  TVM_GETITEM, 0,(LPARAM)&tvi); | 
 |  |  |             return  tvi.lParam; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     int SetItemData(HTREEITEM hItem,LPARAM value) | 
 |  |  |     { | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63; | 
 |  |  |              | 
 |  |  |             tvitem tvi ; | 
 |  |  |             tvi.hItem = hItem; | 
 |  |  |             tvi.mask = TVIF_PARAM; | 
 |  |  |             tvi.lParam = value; | 
 |  |  |              | 
 |  |  |             SendMessage(GetHWND(),  TVM_SETITEM, 0,(LPARAM)&tvi); | 
 |  |  |             return 1; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int DeleteItem( HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVM_DELETEITEM = TV_FIRST + 1; | 
 |  |  |                  | 
 |  |  |             SendMessage(GetHWND(),  TVM_DELETEITEM, 0,(LPARAM)hItem); | 
 |  |  |             return 1;  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int ExpandItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVE_COLLAPSE       =     0x0001; | 
 |  |  |             int TVE_EXPAND         =     0x0002; | 
 |  |  |             int TVE_TOGGLE         =     0x0003; | 
 |  |  |             int TVE_EXPANDPARTIAL  =     0x4000; | 
 |  |  |             int TVE_COLLAPSERESET  =     0x8000; | 
 |  |  |  | 
 |  |  |             int TVM_EXPAND = TV_FIRST + 2; | 
 |  |  |  | 
 |  |  |             SendMessage(GetHWND(), TVM_EXPAND, TVE_EXPAND|TVE_EXPANDPARTIAL ,(LPARAM)hItem); | 
 |  |  |             return 1; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int ExpandItem(HTREEITEM hItem, int flag) | 
 |  |  |     { | 
 |  |  |             int TVM_EXPAND = TV_FIRST + 2; | 
 |  |  |  | 
 |  |  |             return SendMessage(GetHWND(),  TVM_EXPAND, (WPARAM)flag ,(LPARAM)hItem); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM GetItem(HTREEITEM hItem,int code) | 
 |  |  |     { | 
 |  |  |             int TVM_GETNEXTITEM = TV_FIRST + 10 ; | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(),  TVM_GETNEXTITEM, code,(LPARAM)hItem);	 | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     HTREEITEM GetRootItem() | 
 |  |  |     { | 
 |  |  |             return GetItem(NULL,TVGN_ROOT); | 
 |  |  |     } | 
 |  |  |     HTREEITEM GetNextItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_NEXT); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetPrevItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_PREVIOUS ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetParentItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_PARENT  ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetChildItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |              return GetItem(hItem,TVGN_CHILD  ); | 
 |  |  |     }  | 
 |  |  |      | 
 |  |  |     HTREEITEM GetFirstVisibleItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |              return GetItem(hItem,TVGN_FIRSTVISIBLE  ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetNextVisibleItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_NEXTVISIBLE   ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_PREVIOUSVISIBLE   ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetDropHiliteItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_DROPHILITE   ); | 
 |  |  |     }  | 
 |  |  |  | 
 |  |  |     HTREEITEM GetCaretItem() | 
 |  |  |     { | 
 |  |  |             return GetItem(NULL,TVGN_CARET   ); | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetLastVisibleItem(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             return GetItem(hItem,TVGN_LASTVISIBLE   ); | 
 |  |  |     }  | 
 |  |  |  | 
 |  |  |     int ExpandItemEx(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVE_EXPAND = 0x2; | 
 |  |  |             int TVM_EXPAND = 0x1102;			 | 
 |  |  |             return SendMessage(GetHWND(),TVM_EXPAND,TVE_EXPAND,(LPARAM)hItem);	 | 
 |  |  |     } | 
 |  |  |     int CloseItemEx(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVE_COLLAPSE = 0x1; | 
 |  |  |             int TVM_EXPAND = 0x1102;			 | 
 |  |  |             return SendMessage(GetHWND(),TVM_EXPAND,TVE_COLLAPSE,(LPARAM)hItem);	 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int ExpandItemAll(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             ExpandItemEx(hItem); | 
 |  |  |             HTREEITEM hcItem =GetChildItem(hItem); | 
 |  |  |             if(hcItem) | 
 |  |  |             { | 
 |  |  |                 ExpandItemAll(hcItem); | 
 |  |  |                 while(GetNextItem(hcItem)) | 
 |  |  |                 { | 
 |  |  |                     hcItem = GetNextItem(hcItem); | 
 |  |  |                     ExpandItemAll(hcItem); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return 1; | 
 |  |  |     } | 
 |  |  |                  | 
 |  |  |     HTREEITEM InsertItem(HTREEITEM hItem,HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0) | 
 |  |  |     { | 
 |  |  |         int TVM_INSERTITEM = TV_FIRST + 50; | 
 |  |  |          tvinsertstruct tvis; | 
 |  |  |         tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_HANDLE; | 
 |  |  |         tvis.item.pszText = label; | 
 |  |  |         tvis.item.cchTextMax = 255; | 
 |  |  |         tvis.item.lParam = data; | 
 |  |  |         tvis.item.iImage = image; | 
 |  |  |         tvis.item.iSelectedImage =  image; | 
 |  |  |  | 
 |  |  |         tvis.hParent = hItem; | 
 |  |  |         HTREEITEM hItemAfter  = 0; | 
 |  |  |         if(hBeforeItem) | 
 |  |  |         { | 
 |  |  |             hItemAfter = GetItem(hBeforeItem,TVGN_PREVIOUS ); | 
 |  |  |         } | 
 |  |  |         if(hItemAfter ==0) hItemAfter = TVI_FIRST; | 
 |  |  |         tvis.hInsertAfter = hItemAfter; | 
 |  |  |          | 
 |  |  |         HTREEITEM h; | 
 |  |  |         h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis); | 
 |  |  |         return h; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertItem(HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0) | 
 |  |  |     { | 
 |  |  |             //int TVI_ROOT  = 0 - 65536; | 
 |  |  |             HTREEITEM hItem= GetParentItem(hBeforeItem); | 
 |  |  |             if(hItem==0) hItem = TVI_ROOT; | 
 |  |  |             return InsertItem(hItem, hBeforeItem,label,data,image); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertItem(string label,LPARAM data,int image = 0) | 
 |  |  |     { | 
 |  |  |             HTREEITEM hBeforeItem = GetCaretItem(); | 
 |  |  |             return InsertItem(hBeforeItem,label,data,image); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int SetItemChild1(HTREEITEM hItem, int cchild) | 
 |  |  |     { | 
 |  |  |         return SetItemChild(hItem, cchild); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int SetItemChild(HTREEITEM hItem, int cchild) | 
 |  |  |     { | 
 |  |  |         int TVM_SETITEM = TV_FIRST + 63; | 
 |  |  |  | 
 |  |  |         tvitem tvi; | 
 |  |  |         tvi.hItem = hItem; | 
 |  |  |         tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ; | 
 |  |  |         tvi.cChildren = cchild; | 
 |  |  |         SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi); | 
 |  |  |         return 1;			 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertChildItem(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0) | 
 |  |  |     { | 
 |  |  |         return InsertChildItem(hItem, label, ele.ptr(), image); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertChildItem(HTREEITEM hItem,string label,LPARAM data,int image = 0) | 
 |  |  |     { | 
 |  |  |             HTREEITEM h; | 
 |  |  |             int TVM_INSERTITEM = TV_FIRST + 50; | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63; | 
 |  |  |  | 
 |  |  |             tvinsertstruct tvis; | 
 |  |  |             tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; | 
 |  |  |             tvis.item.pszText = label; | 
 |  |  |             tvis.item.cchTextMax = 255; | 
 |  |  |             tvis.item.lParam = data; | 
 |  |  |             tvis.item.iImage = image; | 
 |  |  |             tvis.item.iSelectedImage =  image; | 
 |  |  |  | 
 |  |  |             tvis.hParent = hItem; | 
 |  |  |             tvis.hInsertAfter = TVI_LAST; | 
 |  |  |              | 
 |  |  |             h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis); | 
 |  |  |  | 
 |  |  |             tvitem tvi; | 
 |  |  |             tvi.hItem = hItem; | 
 |  |  |             tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ; | 
 |  |  |             tvi.cChildren = 1; | 
 |  |  |             SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi); | 
 |  |  |  | 
 |  |  |             return h; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertChildItemEx(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0, int image2 = 0) | 
 |  |  |     { | 
 |  |  |         return InsertChildItemEx(hItem, label, ele.ptr(), image,image2); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM InsertChildItemEx(HTREEITEM hItem,string label,LPARAM data,int image = 0,int image2 = 0) | 
 |  |  |     { | 
 |  |  |         int TVM_INSERTITEM = TV_FIRST + 50; | 
 |  |  |          | 
 |  |  |         tvinsertstruct tvis; | 
 |  |  |         tvis.hParent = hItem; | 
 |  |  |         tvis.hInsertAfter = TVI_LAST; | 
 |  |  |          | 
 |  |  |         tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; | 
 |  |  |         tvis.item.pszText = label; | 
 |  |  |         tvis.item.cchTextMax = 255; | 
 |  |  |         tvis.item.lParam = data; | 
 |  |  |         tvis.item.iImage = image; | 
 |  |  |         tvis.item.iSelectedImage =  image2; | 
 |  |  |          | 
 |  |  |         //LPTV_INSERTSTRUCT lpis; | 
 |  |  |         HTREEITEM h; | 
 |  |  |         h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0, (LPARAM)&tvis); | 
 |  |  |         return h; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     int GetChecked(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12); | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62); | 
 |  |  |              | 
 |  |  |             tvitem xitem; | 
 |  |  |             xitem.mask =  TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN; | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK; | 
 |  |  |             xitem.hItem = hItem; | 
 |  |  |  | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem); | 
 |  |  |             int s = xitem.state; | 
 |  |  |             //trace("%d=%d", s, s / 4096); | 
 |  |  |             if ((s / 4096) > 1)  //4096=2^12  打勾 | 
 |  |  |                 return 1; | 
 |  |  |             else  | 
 |  |  |                 return 0;	 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int SetChecked(HTREEITEM hItem, int check) | 
 |  |  |     { | 
 |  |  |             int TVM_SETITEMA = (TV_FIRST + 13); | 
 |  |  |             int TVM_SETITEMW = (TV_FIRST + 63); | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62); | 
 |  |  |             | 
 |  |  |             tvitem xitem; | 
 |  |  |             xitem.mask =  TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN | TVIF_IMAGE | TVIF_PARAM; | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK; | 
 |  |  |             xitem.hItem = hItem; | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem); | 
 |  |  |             if (check == 1)  //打勾 | 
 |  |  |                 xitem.state = 4096 * 2; //INDEXTOSTATEIMAGEMASK(2); | 
 |  |  |             else | 
 |  |  |                 xitem.state = 4096; //INDEXTOSTATEIMAGEMASK(1); | 
 |  |  |              | 
 |  |  |             return SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     HTREEITEM ItemFocus(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVM_SELECTITEM = 0x110b; | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(),TVM_SELECTITEM,TVGN_CARET,(LPARAM)hItem); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int ItemEdit(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             ItemFocus(hItem); | 
 |  |  |             int TVM_EDITLABEL   =   (TV_FIRST   +   65) ; | 
 |  |  |             //int TVM_EDITLABEL   =   (TV_FIRST   +   14) ; | 
 |  |  |             return SendMessage(GetHWND(), TVM_EDITLABEL, 0, (LPARAM)hItem);			 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int GetItemImage(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12); | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62); | 
 |  |  |              | 
 |  |  |             tvitem xitem; | 
 |  |  |             xitem.mask =  TVIF_IMAGE; | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK; | 
 |  |  |             xitem.hItem = hItem; | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem); | 
 |  |  |             return xitem.iImage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int SetItemImage(HTREEITEM hItem, int image) | 
 |  |  |     { | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12); | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62); | 
 |  |  |             int TVM_SETITEMW = (TV_FIRST + 63); | 
 |  |  |               | 
 |  |  |             tvitem xitem; | 
 |  |  |             xitem.mask =  TVIF_IMAGE | TVIF_SELECTEDIMAGE; | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK; | 
 |  |  |             xitem.hItem = hItem; | 
 |  |  |             xitem.iImage = image; | 
 |  |  |             xitem.iSelectedImage =  image; | 
 |  |  |             SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem); | 
 |  |  |             return 1; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int GetItemChild1(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |         return GetItemChild(hItem); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     int GetItemChild(HTREEITEM hItem) | 
 |  |  |     { | 
 |  |  |         int TVM_GETITEMW = (TV_FIRST + 62); | 
 |  |  |  | 
 |  |  |         tvitem xitem; | 
 |  |  |         xitem.hItem = hItem; | 
 |  |  |         xitem.mask = TVIF_CHILDREN|TVIF_HANDLE ; | 
 |  |  |         xitem.stateMask = TVIS_STATEIMAGEMASK; | 
 |  |  |         SendMessage(GetHWND(), TVM_GETITEMW, 0,(LPARAM)&xitem); | 
 |  |  |         return xitem.cChildren; | 
 |  |  |     } | 
 |  |  | #if 0 | 
 |  |  |     string PopupMenu(string str) | 
 |  |  |     { | 
 |  |  |        return (str)SendMessage(GetHWND(), 0x402, (WPARAM)str, 0); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     string PopupMenu(KXMLDOMElement e) | 
 |  |  |     { | 
 |  |  |         return PopupMenu(e.xml); | 
 |  |  |     } | 
 |  |  | #endif | 
 |  |  |  | 
 |  |  |     void SetLineAtRoot(bool value) | 
 |  |  |     { | 
 |  |  |  | 
 |  |  |         int GWL_STYLE_ = -16; | 
 |  |  |         int TVS_LINESATROOT_ = 0x0004; | 
 |  |  |         int style = GetWindowLong(GetHWND(), GWL_STYLE_); | 
 |  |  |         if (value) | 
 |  |  |             SetWindowLong(GetHWND(), GWL_STYLE_, style | TVS_LINESATROOT_); | 
 |  |  |         else | 
 |  |  |             SetWindowLong(GetHWND(), GWL_STYLE_, style & ~TVS_LINESATROOT_); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | #pragma once
 | 
 |  |  | 
 | 
 |  |  | #include "wobject/xcontrol.hpp"
 | 
 |  |  | #include "win32/win.hpp"
 | 
 |  |  | 
 | 
 |  |  | typedef struct _TREEITEM{} *HTREEITEM;
 | 
 |  |  | 
 | 
 |  |  | #define TVI_ROOT                ((HTREEITEM)(ULONG_PTR)-0x10000)
 | 
 |  |  | #define TVI_FIRST               ((HTREEITEM)(ULONG_PTR)-0x0FFFF)
 | 
 |  |  | #define TVI_LAST                ((HTREEITEM)(ULONG_PTR)-0x0FFFE)
 | 
 |  |  | #define TVI_SORT                ((HTREEITEM)(ULONG_PTR)-0x0FFFD)
 | 
 |  |  | 
 | 
 |  |  | #define TVIF_TEXT               0x0001
 | 
 |  |  | #define TVIF_IMAGE              0x0002
 | 
 |  |  | #define TVIF_PARAM              0x0004
 | 
 |  |  | #define TVIF_STATE              0x0008
 | 
 |  |  | #define TVIF_HANDLE             0x0010
 | 
 |  |  | #define TVIF_SELECTEDIMAGE      0x0020
 | 
 |  |  | #define TVIF_CHILDREN           0x0040
 | 
 |  |  | #define TVIF_INTEGRAL           0x0080
 | 
 |  |  | 
 | 
 |  |  | #define TVIF_STATEEX            0x0100
 | 
 |  |  | #define TVIF_EXPANDEDIMAGE      0x0200
 | 
 |  |  | 
 | 
 |  |  | #define TVIS_SELECTED           0x0002
 | 
 |  |  | #define TVIS_CUT                0x0004
 | 
 |  |  | #define TVIS_DROPHILITED        0x0008
 | 
 |  |  | #define TVIS_BOLD               0x0010
 | 
 |  |  | #define TVIS_EXPANDED           0x0020
 | 
 |  |  | #define TVIS_EXPANDEDONCE       0x0040
 | 
 |  |  | #define TVIS_EXPANDPARTIAL      0x0080
 | 
 |  |  | 
 | 
 |  |  | #define TVIS_OVERLAYMASK        0x0F00
 | 
 |  |  | #define TVIS_STATEIMAGEMASK     0xF000
 | 
 |  |  | #define TVIS_USERMASK           0xF000
 | 
 |  |  | 
 | 
 |  |  | #define TVGN_ROOT               0x0000
 | 
 |  |  | #define TVGN_NEXT               0x0001
 | 
 |  |  | #define TVGN_PREVIOUS           0x0002
 | 
 |  |  | #define TVGN_PARENT             0x0003
 | 
 |  |  | #define TVGN_CHILD              0x0004
 | 
 |  |  | #define TVGN_FIRSTVISIBLE       0x0005
 | 
 |  |  | #define TVGN_NEXTVISIBLE        0x0006
 | 
 |  |  | #define TVGN_PREVIOUSVISIBLE    0x0007
 | 
 |  |  | #define TVGN_DROPHILITE         0x0008
 | 
 |  |  | #define TVGN_CARET              0x0009
 | 
 |  |  | #define TVGN_LASTVISIBLE        0x000A
 | 
 |  |  | #define TVGN_NEXTSELECTED       0x000B
 | 
 |  |  | 
 | 
 |  |  |  #define TV_FIRST 0x1100  | 
 |  |  | 
 | 
 |  |  | #ifdef XWIN
 | 
 |  |  | struct SCROLLINFO  | 
 |  |  | {
 | 
 |  |  |     int cbSize;
 | 
 |  |  |     int fMask;
 | 
 |  |  |     int  nMin;
 | 
 |  |  |     int  nMax;
 | 
 |  |  |     int nPage;
 | 
 |  |  |     int  nPos;
 | 
 |  |  |     int  nTrackPos;
 | 
 |  |  | };
 | 
 |  |  | #endif
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | struct tvitem  | 
 |  |  | {
 | 
 |  |  |     int mask;
 | 
 |  |  |     HTREEITEM hItem;
 | 
 |  |  |     int state;
 | 
 |  |  |     int stateMask;
 | 
 |  |  |     string pszText;
 | 
 |  |  |     int cchTextMax;
 | 
 |  |  |     int iImage;
 | 
 |  |  |     int iSelectedImage;
 | 
 |  |  |     int cChildren;
 | 
 |  |  |     LPARAM lParam;
 | 
 |  |  | };
 | 
 |  |  | 
 | 
 |  |  | struct tvinsertstruct  | 
 |  |  | {
 | 
 |  |  |     HTREEITEM hParent;
 | 
 |  |  |     HTREEITEM hInsertAfter;
 | 
 |  |  |     tvitem  item;
 | 
 |  |  | };
 | 
 |  |  |      | 
 |  |  | 
 | 
 |  |  | struct NMTREEVIEW : public NMHDR
 | 
 |  |  | {
 | 
 |  |  |     int action;
 | 
 |  |  |     tvitem itemOld;
 | 
 |  |  |     tvitem itemNew;
 | 
 |  |  |     xpoint ptDrag;
 | 
 |  |  | };
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | struct TVNNMHDR : public NMHDR
 | 
 |  |  | {
 | 
 |  |  |     HTREEITEM FromItem;
 | 
 |  |  |     HTREEITEM ToItem;
 | 
 |  |  |     xpoint pt;
 | 
 |  |  |     string PopupMenu;
 | 
 |  |  | };	 | 
 |  |  | 
 | 
 |  |  | struct NMTVDISPINFO : public NMHDR
 | 
 |  |  | {
 | 
 |  |  |     tvitem    item;
 | 
 |  |  | };	 | 
 |  |  | 
 | 
 |  |  | struct TVHITTESTINFO {
 | 
 |  |  |     xpoint     pt;
 | 
 |  |  |     int      flags;
 | 
 |  |  |     HTREEITEM hItem;
 | 
 |  |  | };
 | 
 |  |  | 
 | 
 |  |  | class xtreeview:  public xcontrol
 | 
 |  |  | {
 | 
 |  |  | public:
 | 
 |  |  |     xtreeview() :xcontrol(nullptr) {}
 | 
 |  |  |     xtreeview(void* implptr) :xcontrol(implptr) {}
 | 
 |  |  | public:
 | 
 |  |  |     HTREEITEM GetSelectedItem()
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETNEXTITEM = TV_FIRST + 10;
 | 
 |  |  | 
 | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(), TVM_GETNEXTITEM, TVGN_CARET,0);				  | 
 |  |  |     }
 | 
 |  |  |      | 
 |  |  |     xstring GetItemLabel(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |              int TVM_GETITEM = TV_FIRST + 62;
 | 
 |  |  |          | 
 |  |  |             tvitem tvi ;
 | 
 |  |  |             tvi.hItem = hItem;
 | 
 |  |  |             tvi.mask = TVIF_TEXT;
 | 
 |  |  |              | 
 |  |  |             wchar_t buf[255]=L"";
 | 
 |  |  |             tvi.pszText = buf;
 | 
 |  |  |             tvi.cchTextMax = 255;
 | 
 |  |  |             SendMessage(GetHWND(),  TVM_GETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  |             return tvi.pszText;  | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetItemLabel(HTREEITEM hItem,string label)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63;
 | 
 |  |  |                  | 
 |  |  |             tvitem tvi ;
 | 
 |  |  |             tvi.hItem = hItem;
 | 
 |  |  |             tvi.mask = TVIF_TEXT;
 | 
 |  |  |             tvi.pszText = label;
 | 
 |  |  |             tvi.cchTextMax =9999;//label.length()+ 1;
 | 
 |  |  | 
 | 
 |  |  |             SendMessage(GetHWND(),  TVM_SETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  |             return 1;  | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     LPARAM GetItemData(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETITEM = TV_FIRST + 62;
 | 
 |  |  |                  | 
 |  |  |             //ref tvitem tvi =new tvitem;
 | 
 |  |  |             tvitem tvi;
 | 
 |  |  |             tvi.hItem = hItem;
 | 
 |  |  | 
 | 
 |  |  |             wchar_t buf[255];
 | 
 |  |  |             tvi.pszText = buf;
 | 
 |  |  |             tvi.cchTextMax = 255;
 | 
 |  |  |             tvi.mask = TVIF_PARAM|TVIF_TEXT;
 | 
 |  |  | 
 | 
 |  |  |             SendMessage(GetHWND(),  TVM_GETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  |             return  tvi.lParam;
 | 
 |  |  |     }
 | 
 |  |  |      | 
 |  |  |     int SetItemData(HTREEITEM hItem, KXMLDOMElement value)
 | 
 |  |  |     {
 | 
 |  |  |         return  SetItemData(hItem, (LPARAM)value.ptr());
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetItemData(HTREEITEM hItem,LPARAM value)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63;
 | 
 |  |  |              | 
 |  |  |             tvitem tvi ;
 | 
 |  |  |             tvi.hItem = hItem;
 | 
 |  |  |             tvi.mask = TVIF_PARAM;
 | 
 |  |  |             tvi.lParam = value;
 | 
 |  |  |              | 
 |  |  |             SendMessage(GetHWND(),  TVM_SETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  |             return 1;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int DeleteItem( HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_DELETEITEM = TV_FIRST + 1;
 | 
 |  |  |                  | 
 |  |  |             SendMessage(GetHWND(),  TVM_DELETEITEM, 0,(LPARAM)hItem);
 | 
 |  |  |             return 1;  | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int ExpandItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVE_COLLAPSE       =     0x0001;
 | 
 |  |  |             int TVE_EXPAND         =     0x0002;
 | 
 |  |  |             int TVE_TOGGLE         =     0x0003;
 | 
 |  |  |             int TVE_EXPANDPARTIAL  =     0x4000;
 | 
 |  |  |             int TVE_COLLAPSERESET  =     0x8000;
 | 
 |  |  | 
 | 
 |  |  |             int TVM_EXPAND = TV_FIRST + 2;
 | 
 |  |  | 
 | 
 |  |  |             SendMessage(GetHWND(), TVM_EXPAND, TVE_EXPAND|TVE_EXPANDPARTIAL ,(LPARAM)hItem);
 | 
 |  |  |             return 1;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int ExpandItem(HTREEITEM hItem, int flag)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_EXPAND = TV_FIRST + 2;
 | 
 |  |  | 
 | 
 |  |  |             return SendMessage(GetHWND(),  TVM_EXPAND, (WPARAM)flag ,(LPARAM)hItem);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM GetItem(HTREEITEM hItem,int code)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETNEXTITEM = TV_FIRST + 10 ;
 | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(),  TVM_GETNEXTITEM, code,(LPARAM)hItem);	 | 
 |  |  |     }
 | 
 |  |  |      | 
 |  |  |     HTREEITEM GetRootItem()
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(NULL,TVGN_ROOT);
 | 
 |  |  |     }
 | 
 |  |  |     HTREEITEM GetNextItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_NEXT);
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetPrevItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_PREVIOUS );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetParentItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_PARENT  );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetChildItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |              return GetItem(hItem,TVGN_CHILD  );
 | 
 |  |  |     }  | 
 |  |  |      | 
 |  |  |     HTREEITEM GetFirstVisibleItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |              return GetItem(hItem,TVGN_FIRSTVISIBLE  );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetNextVisibleItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_NEXTVISIBLE   );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetPrevVisibleItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_PREVIOUSVISIBLE   );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetDropHiliteItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_DROPHILITE   );
 | 
 |  |  |     }  | 
 |  |  | 
 | 
 |  |  |     HTREEITEM GetCaretItem()
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(NULL,TVGN_CARET   );
 | 
 |  |  |     }  | 
 |  |  |     HTREEITEM GetLastVisibleItem(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             return GetItem(hItem,TVGN_LASTVISIBLE   );
 | 
 |  |  |     }  | 
 |  |  | 
 | 
 |  |  |     int ExpandItemEx(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVE_EXPAND = 0x2;
 | 
 |  |  |             int TVM_EXPAND = 0x1102;			 | 
 |  |  |             return SendMessage(GetHWND(),TVM_EXPAND,TVE_EXPAND,(LPARAM)hItem);	 | 
 |  |  |     }
 | 
 |  |  |     int CloseItemEx(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVE_COLLAPSE = 0x1;
 | 
 |  |  |             int TVM_EXPAND = 0x1102;			 | 
 |  |  |             return SendMessage(GetHWND(),TVM_EXPAND,TVE_COLLAPSE,(LPARAM)hItem);	 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int ExpandItemAll(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             ExpandItemEx(hItem);
 | 
 |  |  |             HTREEITEM hcItem =GetChildItem(hItem);
 | 
 |  |  |             if(hcItem)
 | 
 |  |  |             {
 | 
 |  |  |                 ExpandItemAll(hcItem);
 | 
 |  |  |                 while(GetNextItem(hcItem))
 | 
 |  |  |                 {
 | 
 |  |  |                     hcItem = GetNextItem(hcItem);
 | 
 |  |  |                     ExpandItemAll(hcItem);
 | 
 |  |  |                 }
 | 
 |  |  |             }
 | 
 |  |  |             return 1;
 | 
 |  |  |     }
 | 
 |  |  |                  | 
 |  |  |     HTREEITEM InsertItem(HTREEITEM hItem,HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0)
 | 
 |  |  |     {
 | 
 |  |  |         int TVM_INSERTITEM = TV_FIRST + 50;
 | 
 |  |  |          tvinsertstruct tvis;
 | 
 |  |  |         tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_HANDLE;
 | 
 |  |  |         tvis.item.pszText = label;
 | 
 |  |  |         tvis.item.cchTextMax = 255;
 | 
 |  |  |         tvis.item.lParam = data;
 | 
 |  |  |         tvis.item.iImage = image;
 | 
 |  |  |         tvis.item.iSelectedImage =  image;
 | 
 |  |  | 
 | 
 |  |  |         tvis.hParent = hItem;
 | 
 |  |  |         HTREEITEM hItemAfter  = 0;
 | 
 |  |  |         if(hBeforeItem)
 | 
 |  |  |         {
 | 
 |  |  |             hItemAfter = GetItem(hBeforeItem,TVGN_PREVIOUS );
 | 
 |  |  |         }
 | 
 |  |  |         if(hItemAfter ==0) hItemAfter = TVI_FIRST;
 | 
 |  |  |         tvis.hInsertAfter = hItemAfter;
 | 
 |  |  |          | 
 |  |  |         HTREEITEM h;
 | 
 |  |  |         h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis);
 | 
 |  |  |         return h;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertItem(HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0)
 | 
 |  |  |     {
 | 
 |  |  |             //int TVI_ROOT  = 0 - 65536;
 | 
 |  |  |             HTREEITEM hItem= GetParentItem(hBeforeItem);
 | 
 |  |  |             if(hItem==0) hItem = TVI_ROOT;
 | 
 |  |  |             return InsertItem(hItem, hBeforeItem,label,data,image);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertItem(string label,LPARAM data,int image = 0)
 | 
 |  |  |     {
 | 
 |  |  |             HTREEITEM hBeforeItem = GetCaretItem();
 | 
 |  |  |             return InsertItem(hBeforeItem,label,data,image);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetItemChild1(HTREEITEM hItem, int cchild)
 | 
 |  |  |     {
 | 
 |  |  |         return SetItemChild(hItem, cchild);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetItemChild(HTREEITEM hItem, int cchild)
 | 
 |  |  |     {
 | 
 |  |  |         int TVM_SETITEM = TV_FIRST + 63;
 | 
 |  |  | 
 | 
 |  |  |         tvitem tvi;
 | 
 |  |  |         tvi.hItem = hItem;
 | 
 |  |  |         tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ;
 | 
 |  |  |         tvi.cChildren = cchild;
 | 
 |  |  |         SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  |         return 1;			 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertChildItem(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0)
 | 
 |  |  |     {
 | 
 |  |  |         return InsertChildItem(hItem, label, ele.ptr(), image);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertChildItem(HTREEITEM hItem,string label,LPARAM data,int image = 0)
 | 
 |  |  |     {
 | 
 |  |  |             HTREEITEM h;
 | 
 |  |  |             int TVM_INSERTITEM = TV_FIRST + 50;
 | 
 |  |  |             int TVM_SETITEM = TV_FIRST + 63;
 | 
 |  |  | 
 | 
 |  |  |             tvinsertstruct tvis;
 | 
 |  |  |             tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
 | 
 |  |  |             tvis.item.pszText = label;
 | 
 |  |  |             tvis.item.cchTextMax = 255;
 | 
 |  |  |             tvis.item.lParam = data;
 | 
 |  |  |             tvis.item.iImage = image;
 | 
 |  |  |             tvis.item.iSelectedImage =  image;
 | 
 |  |  | 
 | 
 |  |  |             tvis.hParent = hItem;
 | 
 |  |  |             tvis.hInsertAfter = TVI_LAST;
 | 
 |  |  |              | 
 |  |  |             h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis);
 | 
 |  |  | 
 | 
 |  |  |             tvitem tvi;
 | 
 |  |  |             tvi.hItem = hItem;
 | 
 |  |  |             tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ;
 | 
 |  |  |             tvi.cChildren = 1;
 | 
 |  |  |             SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
 | 
 |  |  | 
 | 
 |  |  |             return h;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertChildItemEx(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0, int image2 = 0)
 | 
 |  |  |     {
 | 
 |  |  |         return InsertChildItemEx(hItem, label, ele.ptr(), image,image2);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM InsertChildItemEx(HTREEITEM hItem,string label,LPARAM data,int image = 0,int image2 = 0)
 | 
 |  |  |     {
 | 
 |  |  |         int TVM_INSERTITEM = TV_FIRST + 50;
 | 
 |  |  |          | 
 |  |  |         tvinsertstruct tvis;
 | 
 |  |  |         tvis.hParent = hItem;
 | 
 |  |  |         tvis.hInsertAfter = TVI_LAST;
 | 
 |  |  |          | 
 |  |  |         tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
 | 
 |  |  |         tvis.item.pszText = label;
 | 
 |  |  |         tvis.item.cchTextMax = 255;
 | 
 |  |  |         tvis.item.lParam = data;
 | 
 |  |  |         tvis.item.iImage = image;
 | 
 |  |  |         tvis.item.iSelectedImage =  image2;
 | 
 |  |  |          | 
 |  |  |         //LPTV_INSERTSTRUCT lpis;
 | 
 |  |  |         HTREEITEM h;
 | 
 |  |  |         h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0, (LPARAM)&tvis);
 | 
 |  |  |         return h;
 | 
 |  |  |     }
 | 
 |  |  |      | 
 |  |  |     int GetChecked(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12);
 | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62);
 | 
 |  |  |              | 
 |  |  |             tvitem xitem;
 | 
 |  |  |             xitem.mask =  TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN;
 | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK;
 | 
 |  |  |             xitem.hItem = hItem;
 | 
 |  |  | 
 | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
 | 
 |  |  |             int s = xitem.state;
 | 
 |  |  |             //trace("%d=%d", s, s / 4096);
 | 
 |  |  |             if ((s / 4096) > 1)  //4096=2^12  打勾
 | 
 |  |  |                 return 1;
 | 
 |  |  |             else  | 
 |  |  |                 return 0;	 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetChecked(HTREEITEM hItem, int check)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_SETITEMA = (TV_FIRST + 13);
 | 
 |  |  |             int TVM_SETITEMW = (TV_FIRST + 63);
 | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62);
 | 
 |  |  |             | 
 |  |  |             tvitem xitem;
 | 
 |  |  |             xitem.mask =  TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN | TVIF_IMAGE | TVIF_PARAM;
 | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK;
 | 
 |  |  |             xitem.hItem = hItem;
 | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
 | 
 |  |  |             if (check == 1)  //打勾
 | 
 |  |  |                 xitem.state = 4096 * 2; //INDEXTOSTATEIMAGEMASK(2);
 | 
 |  |  |             else
 | 
 |  |  |                 xitem.state = 4096; //INDEXTOSTATEIMAGEMASK(1);
 | 
 |  |  |              | 
 |  |  |             return SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     HTREEITEM ItemFocus(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_SELECTITEM = 0x110b;
 | 
 |  |  |             return (HTREEITEM)SendMessage(GetHWND(),TVM_SELECTITEM,TVGN_CARET,(LPARAM)hItem);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int ItemEdit(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             ItemFocus(hItem);
 | 
 |  |  |             int TVM_EDITLABEL   =   (TV_FIRST   +   65) ;
 | 
 |  |  |             //int TVM_EDITLABEL   =   (TV_FIRST   +   14) ;
 | 
 |  |  |             return SendMessage(GetHWND(), TVM_EDITLABEL, 0, (LPARAM)hItem);			 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int GetItemImage(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12);
 | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62);
 | 
 |  |  |              | 
 |  |  |             tvitem xitem;
 | 
 |  |  |             xitem.mask =  TVIF_IMAGE;
 | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK;
 | 
 |  |  |             xitem.hItem = hItem;
 | 
 |  |  |             SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
 | 
 |  |  |             return xitem.iImage;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int SetItemImage(HTREEITEM hItem, int image)
 | 
 |  |  |     {
 | 
 |  |  |             int TVM_GETITEMA = (TV_FIRST + 12);
 | 
 |  |  |             int TVM_GETITEMW = (TV_FIRST + 62);
 | 
 |  |  |             int TVM_SETITEMW = (TV_FIRST + 63);
 | 
 |  |  |               | 
 |  |  |             tvitem xitem;
 | 
 |  |  |             xitem.mask =  TVIF_IMAGE | TVIF_SELECTEDIMAGE;
 | 
 |  |  |             xitem.stateMask = TVIS_STATEIMAGEMASK;
 | 
 |  |  |             xitem.hItem = hItem;
 | 
 |  |  |             xitem.iImage = image;
 | 
 |  |  |             xitem.iSelectedImage =  image;
 | 
 |  |  |             SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem);
 | 
 |  |  |             return 1;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int GetItemChild1(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |         return GetItemChild(hItem);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     int GetItemChild(HTREEITEM hItem)
 | 
 |  |  |     {
 | 
 |  |  |         int TVM_GETITEMW = (TV_FIRST + 62);
 | 
 |  |  | 
 | 
 |  |  |         tvitem xitem;
 | 
 |  |  |         xitem.hItem = hItem;
 | 
 |  |  |         xitem.mask = TVIF_CHILDREN|TVIF_HANDLE ;
 | 
 |  |  |         xitem.stateMask = TVIS_STATEIMAGEMASK;
 | 
 |  |  |         SendMessage(GetHWND(), TVM_GETITEMW, 0,(LPARAM)&xitem);
 | 
 |  |  |         return xitem.cChildren;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     xstring PopupMenu(string str)
 | 
 |  |  |     {
 | 
 |  |  |        return (string)SendMessage(GetHWND(), 0x402, (WPARAM)str, 0);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     string PopupMenu(KXMLDOMElement e)
 | 
 |  |  |     {
 | 
 |  |  |         return PopupMenu(e.xml());
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     void SetLineAtRoot(bool value)
 | 
 |  |  |     {
 | 
 |  |  | 
 | 
 |  |  |         int GWL_STYLE_ = -16;
 | 
 |  |  |         int TVS_LINESATROOT_ = 0x0004;
 | 
 |  |  |         int style = GetWindowLong(GetHWND(), GWL_STYLE_);
 | 
 |  |  |         if (value)
 | 
 |  |  |             SetWindowLong(GetHWND(), GWL_STYLE_, style | TVS_LINESATROOT_);
 | 
 |  |  |         else
 | 
 |  |  |             SetWindowLong(GetHWND(), GWL_STYLE_, style & ~TVS_LINESATROOT_);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | }; |