| | |
| | | #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_); |
| | | } |
| | | |
| | | #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_);
|
| | | }
|
| | |
|
| | | }; |