📄 dragdroptreectrl.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 + -