CTreeCtrl的拖拽功能.docx_第1页
CTreeCtrl的拖拽功能.docx_第2页
CTreeCtrl的拖拽功能.docx_第3页
CTreeCtrl的拖拽功能.docx_第4页
CTreeCtrl的拖拽功能.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC编程一个具有拖拽功能的TreeCtrl2011-05-07 22:37:20|分类:MFC编程|举报|字号订阅#if !defined(AFX_DRAGTREE_H_3015F03F_045E_4531_A436_E2A890F23540_INCLUDED_)#define AFX_DRAGTREE_H_3015F03F_045E_4531_A436_E2A890F23540_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ DragTree.h : header file/ CDragTree windowclass CDragTree : public CTreeCtrl/ Constructionpublic:CDragTree();CImageList* m_pDragImages;/拖动的图像列表BOOL m_bDrag;/是否进行拖动HTREEITEM m_hBeginDrag;/拖动的起点/ Attributespublic:/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDragTree)/AFX_VIRTUAL/ Implementationpublic:void CopyNodes(HTREEITEM hDesItem, HTREEITEM hSrcItem);virtual CDragTree();/ Generated message map functionsprotected:/AFX_MSG(CDragTree)afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_DRAGTREE_H_3015F03F_045E_4531_A436_E2A890F23540_INCLUDED_)/ DragTree.cpp : implementation file/#include stdafx.h#include DragTreeItem.h#include DragTree.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDragTreeCDragTree:CDragTree()m_pDragImages = NULL;m_bDrag = FALSE;m_hBeginDrag = NULL;CDragTree:CDragTree()BEGIN_MESSAGE_MAP(CDragTree, CTreeCtrl)/AFX_MSG_MAP(CDragTree)ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDragTree message handlersvoid CDragTree:OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;HTREEITEM hItem = pNMTreeView-itemNew.hItem;/获取开始拖动的节点if (hItem=GetRootItem()/不允许拖动根节点*pResult = 0;return;m_hBeginDrag = hItem;/记录开始拖动的项目m_pDragImages = CreateDragImage(hItem);/创建拖动的图像列表CPoint dragPT;/记录起始点dragPT.x = pNMTreeView-ptDrag.x;dragPT.y = pNMTreeView-ptDrag.y;if (m_pDragImages != NULL)m_pDragImages-BeginDrag(0, CPoint(8, 8);/开始拖动图像ClientToScreen(&dragPT);/转换客户坐标到屏幕坐标m_pDragImages-DragEnter(this, dragPT);/锁定窗口更新,在拖动的过程中显示拖动的图像SetCapture();/开始鼠标捕捉m_bDrag = TRUE;*pResult = 0;void CDragTree:OnMouseMove(UINT nFlags, CPoint point)if (m_bDrag)/处于拖动状态HTREEITEMhItem;UINTnHitFlags;CRectclientRC;GetClientRect(&clientRC);/获取客户区域m_pDragImages-DragMove(point);/设置拖动的图像位置/鼠标经过时高亮显示if( (hItem = HitTest(point, &nHitFlags) != NULL )CImageList:DragShowNolock(FALSE);/隐藏拖动的图像SelectDropTarget(hItem);/设置选中的项目CImageList:DragShowNolock(TRUE);/显示拖动的图像elseCTreeCtrl:OnMouseMove(nFlags, point);void CDragTree:OnLButtonUp(UINT nFlags, CPoint point)if (m_bDrag)/处于拖动状态m_bDrag = FALSE;CImageList:DragLeave(this);/CImageList:EndDrag();/结束图像拖动ReleaseCapture();/释放鼠标捕捉delete m_pDragImages;/释放图像列表m_pDragImages = NULL;CRect winRC;GetWindowRect(&winRC);/获取窗口区域HTREEITEM hItem;if(hItem = HitTest(point, &nFlags) != NULL)/进行拖动处理/如果目标项目与开始拖动的项目相同或者目标项目仍是开始项目的父节点,不进行处理if (m_hBeginDrag != hItem & hItem != GetParentItem(m_hBeginDrag)CopyNodes(hItem, m_hBeginDrag);/进行节点的复制DeleteItem(m_hBeginDrag);/删除源节点Invalidate();SelectDropTarget(NULL);m_hBeginDrag = NULL;/复制节点,将hSrcItem及其子项目复制到下hDesItem节点下void CDragTree:CopyNodes(HTREEITEM hDesItem, HTREEITEM hSrcItem)if (hDesItem=NULL | hSrcItem=NULL)/验证参数return;TVITEM tvItem;/定义项目信息tvItem.mask = TVIF_TEXT|TVIF_IMAGE;/设置返回标记tvItem.hItem = hSrcItem;char chTextMAX_PATH = 0;tvItem.pszText = chText;tvItem.cchTextMax = MAX_PATH;GetItem(&tvItem);/获取项目信息TVINSERTSTRUCT tvInsert;/定义插入操作的数据结构tvInsert.hParent = hDesItem;tvInsert.item = tvItem;HTREEITEM hInsert = InsertItem(&tvInsert);/插入项目HTREEITEM hChild = GetChildItem(hSrcItem);/获取子节点while (hChild != NULL)/遍历子节点tvItem.mask = TVIF_TEXT|TVIF_IMAGE;tvItem.hItem = hChild;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论