qianxj2004
9 小时以前 6131814bc90be94feb1eabeb41be845f55082e02
jrj/xframe/xcontrol/xtreeview.hpp
@@ -1,539 +1,539 @@
#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_);
    }
};