要求树型控件的子项可以随意拖放,增减.而且可以保存.如果觉得分不够我可以再加,要不给个思路也可以,谢谢!

解决方案 »

  1.   

    脱放功能
    void CTreeDemoDlg::OnBegindragTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    *pResult = 0;
    CImageList* test;
    drag=pNMTreeView->itemNew.hItem;
    //从节点信息建立拖动的图像
    test=m_tree.CreateDragImage(drag);
    //如果无法建立拖动的图像
    if(test==NULL)
    return;
    test->BeginDrag(0,CPoint(0,0));
    //IsDraging:开进行拖拽的标记
    this->IsDraging=1;
    POINT pt=pNMTreeView->ptDrag;
    ClientToScreen(&pt);
    test->DragEnter(NULL,pt);
    //开始捕获鼠标
    SetCapture();
    }void CTreeDemoDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    HTREEITEM tmp;
    UINT flag;
    if(this->IsDraging)
    {
    POINT pt=point;
    ClientToScreen(&pt);
    CImageList::DragMove(pt);
    //判断鼠标是否在节点区域
    if((tmp=m_tree.HitTest(point,&flag))!=NULL)
    {
    //隐藏拖动图像
    CImageList::DragShowNolock(0);
    //记录新的放置节点
    m_tree.SelectDropTarget(tmp);
    drop=tmp;
    //显示拖动图像
    CImageList::DragShowNolock(1);
    }
    }
    CDialog::OnMouseMove(nFlags, point);
    }void CTreeDemoDlg::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    //如果正在进行拖拽
    if(this->IsDraging)
    {
    IsDraging=0;
    //解除在拖拽过程中对树的锁定,隐藏拖拽图像
    CImageList::DragLeave(this);
    CImageList::EndDrag();
    //结束鼠标捕获
    ReleaseCapture();
    m_tree.SelectDropTarget(NULL);
    //如果拖、放的节点一致
    if(drag==drop)
    return;
    //展开目标节点
    m_tree.Expand(drop,TVE_EXPAND);
    //设置新节点信息
    TVINSERTSTRUCT temp;
    temp.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
    temp.item.hItem=drag;
    temp.hParent=drop;
    temp.item.iImage=0;//正常图标
    temp.item.iSelectedImage=1;//选中时图标
    //设置节点标题
    CString text=m_tree.GetItemText(drag);
    temp.item.cchTextMax=text.GetLength();
    temp.item.pszText=text.LockBuffer();
    //在目标节点下插入被拖动的节点
    m_tree.InsertItem(&temp);
    //删除源节点
    m_tree.DeleteItem(drag);
    }
    CDialog::OnLButtonUp(nFlags, point);
    }void CTreeDemoDlg::OnKeydownTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
    *pResult = 0;
    //如果正在进行拖拽
    if(IsDraging)
    {
    //终止鼠标捕获
    ReleaseCapture();
    this->IsDraging=0;
    //清除拖动图像
    m_tree.Invalidate();
    }
    }
      

  2.   

    增减功能:
    void CTreeDemoDlg::OnDelnode() 
    {
    //得到当前选择的节点
    HTREEITEM item=m_tree.GetSelectedItem();
    if(m_tree.ItemHasChildren(item))
    if(MessageBox("该节点下还有其他子节点\r\n是否要删除?","确认",MB_YESNO)==IDNO)
    return;
    //删除节点
    m_tree.DeleteItem(item);
    }
    void CTreeDemoDlg::OnAddnode() 
    {
    //得到当前选择的节点
    HTREEITEM item=m_tree.GetSelectedItem();
    //在当前节点下增加子节点
    m_tree.InsertItem("新增节点",0,1,item);

    }
      

  3.   

    对不起,这两天出差,上网不方便,没有看到。
    节点位置:一个节点由节点的父节点名,自身节点名组成(要求节点名不重复)
    在树上找到父节点,然后把当前节点挂上就行了。
    HTREEITEM hItem = m_tree.GetSelectedItem();//得到当前节点
    CString strItemText = m_TreeCtrl.GetItemText(hItem);//得到节点名称