正文

CTreeCtrl学习笔记2-专题篇2007-01-25 14:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/22799.html

分享到:

           如何对CTreeCtrl的项进行拖曳

 

1 取消TVS_DISABLEDRAGDROP 样式,该样式会禁止发送TVN_BEGINDRAG消息

 

 

2 派生一个类于CTreeCtrl,定义几个成员变量:

    CImageList *m_pDragImage;//拖曳图像列表指针

    BOOL m_bLDragging;//是否拖曳

    HTREEITEM m_hitemDrag,m_hitemDrop;//拖曳项和目标项

 

 

3)响应拖曳消息TVN_BEGINDRAG

void CTreeCtrlEx::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)

{

    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

    // TODO: Add your control notification handler code here

    m_hitemDrag=pNMTreeView->itemNew.hItem;//获得拖曳项

    m_hitemDrop=NULL;

    m_pDragImage=CreateDragImage(m_hitemDrag);//创建拖曳图像

    if(!m_pDragImage)

           return;

    this->m_bLDragging=TRUE;

    m_pDragImage->BeginDrag(0,CPoint(-15,-15));//后面的point表示拖曳图像离拖曳项的相对位置

    POINT pt=pNMTreeView->ptDrag;

    ClientToScreen(&pt);

    m_pDragImage->DragEnter(NULL,pt);//开始显示拖曳图像

    SetCapture();//锁定鼠标

    *pResult = 0;

}

 

 

4)响应鼠标移动消息

void CTreeCtrlEx::OnMouseMove(UINT nFlags, CPoint point)

{

       // TODO: Add your message handler code here and/or call default

       HTREEITEM hitem;

       UINT flags;

       if(m_bLDragging)

       {

              POINT pt=point;

              ClientToScreen(&pt);

              CImageList::DragMove(pt);//当鼠标移动时也移动拖曳的图像

              if((hitem=HitTest(point,&flags))!=NULL)//确定鼠标所在的项

              {

                     CImageList::DragShowNolock(FALSE);//隐藏拖曳图像

                     SelectDropTarget(hitem);

                     m_hitemDrop=hitem;//确定目标项

                     CImageList::DragShowNolock(TRUE);//重新显示

              }

       }

 

       CTreeCtrl::OnMouseMove(nFlags, point);

}

 

 

5)鼠标弹起消息

void CTreeCtrlEx::OnLButtonUp(UINT nFlags, CPoint point)

{

       // TODO: Add your message handler code here and/or call default

       if(m_bLDragging)//是否拖动

       {

              m_bLDragging=FALSE;

              CImageList::DragLeave(this);

              CImageList::EndDrag();//结束拖曳

              ReleaseCapture();

              delete m_pDragImage;

              SelectDropTarget(NULL);

              if(m_hitemDrag==m_hitemDrop)

                     return;

      

              MessageBox("拖曳成功!");

。。。。现在已经获知了拖曳项和目标项,就看你自己需要什么代码了,略去。

       }

       CTreeCtrl::OnLButtonUp(nFlags, point);

}

 

阅读(5630) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册