#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 struct SCROLLINFO { int cbSize; int fMask; int nMin; int nMax; int nPage; int nPos; int nTrackPos; }; 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); } string 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,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,int 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); } };