www.gusucode.com > VC++开源的SHP格式GIS地图查看软件源程序源码程序 > VC++开源的SHP格式GIS地图查看软件源程序源码程序\code\JMTreeCtrl.cpp

    // JMTreeCtrl.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "EasyMap.h"
#include "JMTreeCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CJMTreeCtrl

CJMTreeCtrl::CJMTreeCtrl()
{
	m_bIsDrag = FALSE;
	m_pDragImage = NULL;
}

CJMTreeCtrl::~CJMTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CJMTreeCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CJMTreeCtrl)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJMTreeCtrl message handlers

void CJMTreeCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CTreeCtrl::OnLButtonDblClk(nFlags, point);
	
	HTREEITEM hItem = GetSelectedItem();
	if (GetParentItem(hItem) == NULL) 
		return ;
}

void CJMTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CTreeCtrl::OnLButtonDown(nFlags, point);
}

void CJMTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	HTREEITEM htiNew,hSibling; 
	if (m_bIsDrag)
	{
		m_bIsDrag = FALSE;
		CImageList::DragLeave(this);
		CImageList::EndDrag();
		ReleaseCapture();

		if(m_pDragImage != NULL) 
		{ 
			delete m_pDragImage; 
			m_pDragImage = NULL; 
		} 
		SelectDropTarget(NULL);
		if ( m_hitemDrag == m_hitemDrop)
			return;
		else
        {
			if ( m_hitemDrop != NULL )
            {
				if ( point.y > m_DragPos.y)
				{	
				    //向下拖动
					htiNew = CopyItem(m_hitemDrag,GetRootItem(),m_hitemDrop);
				   	
					
                }
				else
                {
					hSibling = GetPrevSiblingItem(m_hitemDrop);
					//if (GetParentItem(m_hitemDrop) != GetChildItem(GetRootItem())) 
                    if ( hSibling != NULL )
					{
						//hSibling = GetPrevVisibleItem(m_hitemDrop); 
						htiNew = CopyItem(m_hitemDrag,GetRootItem(),hSibling);
 					
					}
					else
                    {
						 htiNew = CopyItem(m_hitemDrag,GetRootItem(),TVI_FIRST);
 				
                    }  
				} 
				DeleteItem( m_hitemDrag );
				SelectItem( htiNew );
			}    


		}
	}
	
	CTreeCtrl::OnLButtonUp(nFlags, point);
}

void CJMTreeCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	HTREEITEM hItem;
    UINT flags;

	if ( m_bIsDrag )
    {
		//正在拖动
		POINT pt = point;
		ClientToScreen( &pt );
		CImageList::DragMove(pt);
		
		if ((hItem = HitTest(point, &flags)) != NULL)
		{
			CImageList::DragShowNolock(FALSE);
		
			SelectDropTarget(hItem); 
			m_hitemDrop = hItem;
        }
		if ( m_hitemDrag == m_hitemDrop) //拖动结点和放置节点是一个位置
			return;
		CImageList::DragShowNolock(TRUE);

	}
	else
    {
		::SetCursor(m_arr);	
    }   
	CTreeCtrl::OnMouseMove(nFlags, point);
}

void CJMTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	POINT pt;
	*pResult = 0;
	HTREEITEM hRoot;

	
	// 根节点不允许拖动
	hRoot = GetRootItem(); 
	if (hRoot == pNMTreeView->itemNew.hItem) 
		return ; 
	m_hitemDrag = pNMTreeView->itemNew.hItem;
	m_hitemDrop = NULL;
	m_bIsDrag = TRUE; 
	pt = pNMTreeView->ptDrag;
	m_DragPos = pt;
	//转换为屏幕坐标
	ClientToScreen( &pt );
	m_pDragImage = CreateDragImage(m_hitemDrag);
	
	if ( m_pDragImage == NULL )
		return;
     m_pDragImage->BeginDrag(0,CPoint(8,8)); 
	 m_pDragImage->DragEnter(NULL, pt);
	 ::SetCursor(m_hand);
	SetCapture();
}

HTREEITEM CJMTreeCtrl::CopyItem(HTREEITEM hItem , HTREEITEM hParent , HTREEITEM hAfter)
{

	TV_INSERTSTRUCT tvstruct;
	HTREEITEM hNewItem;
	CString sText;

	//得到源条目的信息
	tvstruct.item.hItem = hItem;
	tvstruct.item.mask = TVIF_CHILDREN|TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
	GetItem( &tvstruct.item );
	sText = GetItemText( hItem );
	tvstruct.item.cchTextMax = sText.GetLength ();
	tvstruct.item.pszText = sText.LockBuffer ();

	//将条目插入到合适的位置
	tvstruct.hParent = hParent;
	tvstruct.hInsertAfter = hAfter;
	tvstruct.item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
	hNewItem = InsertItem( &tvstruct );
	sText.ReleaseBuffer ();

	//限制拷贝条目数据和条目状态
	SetItemData( hNewItem,GetItemData(hItem) );
	SetItemState( hNewItem,GetItemState(hItem,TVIS_STATEIMAGEMASK),TVIS_STATEIMAGEMASK);
	return hNewItem;
}

void CJMTreeCtrl::SetDefaultCursor()
{

	 CString cstrWndDir;
     
	 GetWindowsDirectory(cstrWndDir.GetBuffer(MAX_PATH), MAX_PATH);
     cstrWndDir.ReleaseBuffer();

     cstrWndDir += _T("\\winhlp32.exe");
     
	 HMODULE hModule = LoadLibrary(cstrWndDir);
     if (hModule) 
	 {
            HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
            if (hHandCursor)
			{
                m_hand = CopyCursor(hHandCursor);
			}
			      
     }
     FreeLibrary(hModule);

	 m_arr	= ::LoadCursor(NULL, IDC_ARROW);
	 m_no	= ::LoadCursor(NULL, IDC_NO) ;



}
/*HTREEITEM CJMTreeCtrl::CopyBranch(HTREEITEM hItem , HTREEITEM hParent , HTREEITEM hAfter)
{



}*/