1.Tree和List中当有文件夹Drop时,怎样让Tree和List中的文件夹象浏览器一样高亮显示?
2.能否提供SAMPLE

解决方案 »

  1.   

    //////////////////////*实现实体拖动功能*////////////////////////////////
    //开始拖放操作时触发此消息,做拖放前的准备
    void CMyTreeView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
    {                                           
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; m_hItemDragged = pNMTreeView->itemNew.hItem;
                                         //纪录被拖拽的项
    if (!GetTreeCtrl().ItemHasChildren(m_hItemDragged))
    {                                       //只允许拖拽标示实体的项,既没有孩子的像
    m_bDraging=TRUE;                    //标示已进入拖放状态
    m_pDragImage = GetTreeCtrl().CreateDragImage(m_hItemDragged);
                                                //创建拖拽图像
    RECT itemrect;
    GetTreeCtrl().GetItemRect(m_hItemDragged,&itemrect,TRUE);
    int width = itemrect.right - itemrect.left;
    int height = itemrect.bottom - itemrect.top; m_pDragImage->BeginDrag(0,CPoint(width*2/3,height*2/3));
                                        //开始拖拽
    m_pDragImage->DragEnter(NULL,pNMTreeView->ptDrag);
    m_pDragImage->SetDragCursorImage(0,CPoint(0,0));
                                        //设拖放状态的鼠标
        
    SetCapture();
    ShowCursor(FALSE);
    m_hDragCursor = AfxGetApp()->LoadCursor(IDC_DRAGCURSOR);
    SetCursor(m_hDragCursor);
    ShowCursor(TRUE);
    } *pResult = 0;
    }//拖放过程中,利用此消息进行一些必要的操作extern int g_iToolCount;                    //工具数目计数器
    extern int g_bStartNav;                     //是否启动动态导航功能;void CMyTreeView::OnMouseMove(UINT nFlags, CPoint point) 
    {                                           
        if(m_bDraging)
    {
    POINT pt = point; 
            ClientToScreen(&pt); 
            m_pDragImage->DragMove(pt);        //移动拖拽图像

            UINT uFlags;
    HTREEITEM hItem = GetTreeCtrl().HitTest(point, &uFlags);
                                              //测试鼠标是否在某一项上
    if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
    {                                 //在某一项上,则高亮显示该项
    m_pDragImage->DragShowNolock(FALSE);
    GetTreeCtrl().SelectDropTarget(hItem);
    m_pDragImage->DragShowNolock(TRUE);
    }
    }
    else if(IsInNagtiveMode())//进行动态导航;
    {
    UINT uFlags;
    HTREEITEM hItem = GetTreeCtrl().HitTest(point, &uFlags);
                                              //测试鼠标是否在某一项上
    if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
    {                                 //在某一项上,则高亮显示该项
    ENTITY_LIST entlist = ItemToEntity(hItem);
    ENTITY * pEnt = entlist[0];
    CMcamDoc *pDoc=GetDocument();
    pDoc->NavigateOfEntity(pEnt);
    }
    }
    CTreeView::OnMouseMove(nFlags, point);
    }//处于拖放状态时,松开鼠标左键结束拖放
    void CMyTreeView::OnLButtonUp(UINT nFlags, CPoint point) 

        if(m_bDraging)
    {
    m_pDragImage->DragLeave(this);
        m_pDragImage->EndDrag();            //结束拖放
    DropItem();
    ReleaseCapture();
    ShowCursor(TRUE);

    m_bDraging = FALSE; 
    GetTreeCtrl().SelectDropTarget(NULL);
    }
    else                                    //当用户点击空白处时,消除任何选择项;
    {
    CTreeCtrl &TreeCtrl=GetTreeCtrl();
    UINT uFlags;
    HTREEITEM hItem = GetTreeCtrl().HitTest(point, &uFlags);
                                              //测试鼠标是否在某一项上
    if ((hItem == NULL) || !(TVHT_ONITEMLABEL & uFlags))
    {                                 //在某一项上,则高亮显示该项
    TreeCtrl.SelectItem(NULL);
    }
    } /*****判断选择集是否为空,用于确定是否使EditBar中的ok按钮灰化****/
    /* if(!InSelectMode())                  //如果没有处于选择状态,忽略操作;
    {
    return ;
    }*/
    CMainFrame* pMainFrame ;
    CFrameWnd* pActiveFrame;
    pMainFrame = (CMainFrame*)AfxGetMainWnd(); //获得主框架指针
    if( !pMainFrame->m_wndEditBar.IsWindowVisible() && !pMainFrame->m_wndProBar.IsWindowVisible())
    { //如果实体编辑工具条和实体信息工具条都没有出现则返回
    return ;
    }
    pActiveFrame = pMainFrame->GetActiveFrame( ); //获得活动框架指针
    CDocument *pdoc = pActiveFrame->GetActiveDocument();
    CMcamDoc* pDoc = (CMcamDoc*) pdoc; //获得当前文档
    if( pDoc == NULL) //如果当前活动文档不存在
    {
    return ;
    }
    POSITION pos = pDoc->GetFirstViewPosition();
    if (pos != NULL)
        {
    CView* pview = pDoc->GetNextView(pos);
    CMcamView * pView = (CMcamView *)pview; //获得当前视图
    pView->IsSelectionNull(); //判断选择集是否为空,并且做出一些操作
    }
    /***********************/ CTreeView::OnLButtonUp(nFlags, point);
    }//把拖动的项放入目的项的成员函数
    void CMyTreeView::DropItem()                
    {
        HTREEITEM hItemDropped = GetTreeCtrl().GetDropHilightItem();
                                            //获得拖放的目的项
    if (GetTreeCtrl().GetParentItem(hItemDropped) == m_hRootItem)
    {                                       //只允许目的项是标示组的项,即父节点时根节点的项
    if (m_hItemDragged != hItemDropped)
    {
    HTREEITEM  hParentDraggedItem=GetTreeCtrl().GetParentItem(m_hItemDragged);
    //获得被拖动项的父节点
    int EntityIndex=GetChildItemIndex(hParentDraggedItem,m_hItemDragged);
    //获得被拖动项在其所在组中的索引
    int SourceGroupIndex=GetChildItemIndex(m_hRootItem,hParentDraggedItem);
    //获得被拖动项所在组,在CDrawing中的索引号
    int DestinationGroupIndex=GetChildItemIndex(m_hRootItem,hItemDropped);
    //获得拖放目的项,在CDrawing中的索引
    CMcamDoc_Bar_003* pDoc=GetDocument();//获得文档的指针
    if(EntityIndex!=-1 && SourceGroupIndex!=-1 && DestinationGroupIndex!=-1)
    {
    pDoc->m_Drawing.FromGroupToGroup(EntityIndex,SourceGroupIndex,DestinationGroupIndex);
    //在CDrawing中将拖动实体从源组移至目的组中*/
    }
    InsertDraggedItem(m_hItemDragged,hItemDropped);
                                    //在目的项中插入被拖项
    GetTreeCtrl().DeleteItem(m_hItemDragged);
                                    //删除原有的被拖项
    }
    }
    }//在目的项中插入被拖项的成员函数
    void CMyTreeView::InsertDraggedItem(HTREEITEM hDragged, HTREEITEM hDropped)
    {                                           
        CString ItemText = GetTreeCtrl().GetItemText(hDragged);
    GetTreeCtrl().InsertItem(ItemText,2,2,hDropped,TVI_LAST);
    // GetTreeCtrl().SortChildren(hDropped);
    //取消拖动操作,把被拖项设为选中项
    HTREEITEM hNextItem;
    HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(hDropped); while (GetTreeCtrl().GetItemText(hChildItem) != ItemText)            //在组中找实体
    {
      hNextItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT);
      hChildItem = hNextItem;
    }
    GetTreeCtrl().SelectItem(hChildItem);}这是我以前写的代码,其中实现了树形控件中的拖动,有点乱,希望能对你有所启示