⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dragdroptreectrl.cpp

📁 人事管理系统
💻 CPP
字号:
// DragdropTreeCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "PersonelManage.h"
#include "DragdropTreeCtrl.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDragdropTreeCtrl

CDragdropTreeCtrl::CDragdropTreeCtrl()
{
	m_pDragImage = NULL;
	m_bLDragging = FALSE; 

	SetDefaultCursor() ;
}

CDragdropTreeCtrl::~CDragdropTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CDragdropTreeCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CDragdropTreeCtrl)
	ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDragdropTreeCtrl message handlers

void CDragdropTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	//不能拖动根节点
	if(GetParentItem(pNMTreeView->itemNew.hItem) == NULL)
		return;

	// Item user started dragging ...
	m_hitemDrag = pNMTreeView->itemNew.hItem;
	m_hitemDrop = NULL;

	m_pDragImage = CreateDragImage(m_hitemDrag);  // get the image list for dragging
	// CreateDragImage() returns NULL if no image list
	// associated with the tree view control
	if( !m_pDragImage )
		return;

	m_bLDragging = TRUE;
	m_pDragImage->BeginDrag(0, CPoint(-15,-15));
	POINT pt = pNMTreeView->ptDrag;
	ClientToScreen( &pt );
	m_pDragImage->DragEnter(NULL, pt);
	SetCapture();
	
	*pResult = 0;
}

void CDragdropTreeCtrl::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);
				
			// Tests if dragged item is over another child !
			  if ( (GetParentItem(hitem) != NULL) && (cursor_no != ::GetCursor())) 
			  {
				  ::SetCursor(cursor_no);
				   // Dont want last selected target highlighted after mouse
				   // has moved off of it, do we now ?
				   SelectDropTarget(NULL);
			  }
			// Is item we're over a root node and not parent root node ?
			if ( (GetParentItem(hitem) == NULL) && (GetParentItem(m_hitemDrag) != hitem ) ) 
			{
				if (cursor_arr != ::GetCursor()) ::SetCursor(cursor_arr); 
				SelectDropTarget(hitem);
			}

			m_hitemDrop = hitem;
			CImageList::DragShowNolock(TRUE);
		}
	}
	else 
	{
		// Set cursor to arrow if not dragged
		// Otherwise, cursor will stay hand or arrow depen. on prev setting
		::SetCursor(cursor_arr);
	}
	
	CTreeCtrl::OnMouseMove(nFlags, point);
}

void CDragdropTreeCtrl::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();

		if(m_pDragImage != NULL) 
		{ 
		delete m_pDragImage; 
		m_pDragImage = NULL; 
		} 

		// Remove drop target highlighting
		SelectDropTarget(NULL);

		if( m_hitemDrag == m_hitemDrop )
			return;

		HTREEITEM	hitem;
		// Make sure pt is over some item
		if ( ((hitem = HitTest(point, &nFlags)) == NULL)  ) return ;
		// Make sure dropped item isnt a child
		if (GetParentItem(hitem) != NULL) return ;

		// If Drag item is an ancestor of Drop item then return
		HTREEITEM htiParent = m_hitemDrop;
		while( (htiParent = GetParentItem( htiParent )) != NULL )
		{
			if( htiParent == m_hitemDrag ) return;
		}

		Expand( m_hitemDrop, TVE_EXPAND ) ;

		HTREEITEM htiNew = MoveChildItem( m_hitemDrag, m_hitemDrop, TVI_LAST );
		DeleteItem(m_hitemDrag);
		SelectItem( htiNew );
		//下面操作更新数据库
		MoveEmp();
	}
	
	CTreeCtrl::OnLButtonUp(nFlags, point);
}

HTREEITEM CDragdropTreeCtrl::AddGroup(const CString & group_name, DWORD data)
{
	HTREEITEM added_group = 0;
	added_group = InsertItem(group_name, 1,1,0);
	SetItemData(added_group, (DWORD)data);
	Expand(added_group, TVE_EXPAND);

	return added_group;
}

HTREEITEM CDragdropTreeCtrl::AddChild(CString buddy_name, HTREEITEM group, DWORD data)
{
	HTREEITEM added = 0;
	if(group != 0)
	{
		added = InsertItem(buddy_name, 2, 2, group);
		SetItemData(added, (DWORD)data);

		HTREEITEM hParent = GetParentItem(added);
		if (hParent != NULL)
			Expand(hParent, TVE_EXPAND);
	}
	return added;
}

HTREEITEM CDragdropTreeCtrl::MoveChildItem(HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter)
{

	empID = GetItemData(hItem);
	deptID = GetItemData(htiNewParent);
	///////////////////////////////////////

	TV_INSERTSTRUCT tvstruct;
	HTREEITEM hNewItem;
    CString sText;

    // get information of the source item
    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();

    //insert the item at proper location
    tvstruct.hParent = htiNewParent;
    tvstruct.hInsertAfter = htiAfter;
    tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
    hNewItem = InsertItem(&tvstruct);
    sText.ReleaseBuffer();

    //now copy item data and item state.
    SetItemData(hNewItem,GetItemData(hItem));
    SetItemState(hNewItem,GetItemState(hItem,TVIS_STATEIMAGEMASK),TVIS_STATEIMAGEMASK);

	//now delete the old item
	DeleteItem(hItem);

    return hNewItem;
}

void CDragdropTreeCtrl::SetDefaultCursor()
{
	   // Get the windows directory
        CString strWndDir;
        GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
        strWndDir.ReleaseBuffer();

        strWndDir += _T("\\winhlp32.exe");
        // This retrieves cursor #106 from winhlp32.exe, which is a hand pointer
        HMODULE hModule = LoadLibrary(strWndDir);
        if (hModule) {
            HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
            if (hHandCursor)
			{
                cursor_hand = CopyCursor(hHandCursor);
			}
			      
        }
        FreeLibrary(hModule);

		cursor_arr	= ::LoadCursor(NULL, IDC_ARROW);
		cursor_no	= ::LoadCursor(NULL, IDC_NO) ;
}

void CDragdropTreeCtrl::MoveEmp()
{
	//int deptID, empID;
	//deptID = GetItemData(m_hitemDrop);
	//empID = GetItemData(m_hitemDrag);
	CString cmdText;
	cmdText.Format("UPDATE [tblEmployee] SET [DeptID] = %d WHERE [EmployeeID] = %d", deptID, empID);
	//初始化数据库连接
	CADODatabase *pAdoDb = new CADODatabase();
	try
	{
		if(pAdoDb->Open())
		{
			CADOCommand pCmd(pAdoDb, cmdText, CADOCommand::typeCmdText);
			CADORecordset *pRs = new CADORecordset(pAdoDb);
			pRs->Execute(&pCmd);
			delete pRs;
			pAdoDb->Close();
		}
		delete pAdoDb;
	}
	catch(CADOException &e)
	{
		AfxMessageBox(e.GetErrorMessage());
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -