// DragDropTreeCtrl.cpp : implementation file
#include "stdafx.h"
#include "DragDropTreeCtrl.h"
#include "DragDropContainer.h"
#include "DragEventListener.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDragDropTreeCtrl
CDragDropTreeCtrl::CDragDropTreeCtrl()
{
m_pImageList = NULL;
m_bDragging = FALSE;
}
CDragDropTreeCtrl::~CDragDropTreeCtrl()
{
//
// Delete the image list created by CreateDragImage.
//
//if (m_pImageList != NULL)
// delete m_pImageList;
}
BEGIN_MESSAGE_MAP(CDragDropTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CDragDropTreeCtrl)
// ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
ON_NOTIFY_REFLECT(NM_CLICK,OnClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDragDropTreeCtrl message handlers
BOOL CDragDropTreeCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
//
// Make sure the control's TVS_DISABLEDRAGDROP flag is not set.
// If you subclass an existing tree view control rather than create
// a CDragDropTreeCtrl outright, it's YOUR responsibility to see that
// this flag isn't set.
//
//cs.style &= ~TVS_DISABLEDRAGDROP;
return CTreeCtrl::PreCreateWindow(cs);
}
void CDragDropTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDragging )
{
POINT pt = point ;
ClientToScreen ( &pt ) ;
CImageList::DragMove ( pt ) ;
int nEventListenerCount = m_vEventListener.size();
for( int nEventListenerIdx = 0; nEventListenerIdx < nEventListenerCount;
++nEventListenerIdx )
{
m_vEventListener[nEventListenerIdx]->OnDragMove(point);
}
return;
}
if( DragDetect(point) )//m_hWnd,
{
OnDrag(point);
}
CTreeCtrl::OnMouseMove(nFlags,point);
}
void CDragDropTreeCtrl::OnTimer(UINT nIDEvent)
{
POINT pt;
GetCursorPos ( &pt ) ;
CImageList::DragMove ( pt ) ;
int nEventListenerCount = m_vEventListener.size();
for( int nEventListenerIdx = 0; nEventListenerIdx < nEventListenerCount;
++nEventListenerIdx )
{
m_vEventListener[nEventListenerIdx]->OnDragMove(pt);
}
}
void CDragDropTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if( !(MK_CONTROL&nFlags) && !(MK_SHIFT&nFlags) )
{
if( m_vSelItem.size() > 1 )
{
ClearSelection();
SetItemState(m_hLastSelItem,TVIS_SELECTED,TVIS_SELECTED);
m_vSelItem.push_back(m_hLastSelItem);
}
}
if ( m_bDragging && m_pImageList != NULL )
{
m_bDragging = FALSE;
KillTimer(1);
ReleaseCapture();
//
// Terminate the dragging operation and release the mouse.
//
m_pImageList->DragLeave (this);
m_pImageList->DragLeave (GetParent());
m_pImageList->EndDrag ();
SelectDropTarget(NULL);
delete m_pImageList;
m_pImageList = NULL;
HTREEITEM hItem = HitTest(point,&nFlags);
int nListenerCount = m_vEventListener.size();
for( int nListenerIdx = 0; nListenerIdx < nListenerCount; ++nListenerIdx )
{
m_vEventListener[nListenerIdx]->OnDragRelease(point,hItem);
}
}
CTreeCtrl::OnLButtonUp(nFlags, point);
}
void CDragDropTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
SetFocus();
do
{
HTREEITEM hItem = HitTest(point,&nFlags);
if( nFlags & TVHT_ONITEMBUTTON )
{
// Check if any child present
if(!ItemHasChildren(hItem))
break;
CTreeCtrl::OnLButtonDown(nFlags,point);
break;
}
if( NULL == hItem )
{
break;
}
if( NULL == GetParentItem(hItem) )
{
break;
}
unsigned short shKeyState = GetKeyState(VK_CONTROL);
shKeyState >>= 15;
if( shKeyState == 1 )
{
OnControlKeyPress(hItem);
break;
}
else
{
if( m_vSelItem.size() == 0 )
{
SetItemState(hItem,TVIS_SELECTED,TVIS_SELECTED);
m_vSelItem.push_back(hItem);
break;
}
shKeyState = GetKeyState(VK_SHIFT);
shKeyState >>= 15;
if( shKeyState == 1 )
{
OnShiftKeyPress(hItem);
break;
}
}
m_hLastSelItem = hItem;
if( m_vSelItem.size() == 1 )
{
ClearSelection();
SetItemState(m_hLastSelItem,TVIS_SELECTED,TVIS_SELECTED);
m_vSelItem.push_back(m_hLastSelItem);
}
}
while(false);
}
void CDragDropTreeCtrl::ClearSelection()
{
int nSelItemCount = m_vSelItem.size();
for( int nIdx = 0; nIdx < nSelItemCount ; ++nIdx )
{
SetItemState(m_vSelItem[nIdx],0,TVIS_SELECTED);
}
m_vSelItem.clear();
}
void CDragDropTreeCtrl::RemoveFromSelectionList(HTREEITEM hItem)
{
SEL_ITEM_LIST::iterator itr;
for( itr = m_vSelItem.begin(); itr != m_vSelItem.end(); ++itr )
{
if( (*itr) == hItem )
{
m_vSelItem.erase(itr);
break;
}
}
}
void CDragDropTreeCtrl::SelectItems(HTREEITEM hItemFrom,HTREEITEM hItemTo)
{
RECT FromRect;
GetItemRect(hItemFrom,&FromRect,FALSE);
RECT ToRect;
GetItemRect(hItemTo,&ToRect,FALSE);
HTREEITEM hTemp;
if( FromRect.top > ToRect.top )
{
hTemp = hItemFrom;
hItemFrom = hItemTo;
hItemTo = hTemp;
}
ClearSelection();
hTemp = hItemFrom;
while(1)
{
SetItemState(hTemp,TVIS_SELECTED,TVIS_SELECTED);
m_vSelItem.push_back(hTemp);
if( hTemp == hItemTo )
{
break;
}
hTemp = GetNextVisibleItem(hTemp);
}
}
CImageList* CDragDropTreeCtrl::CreateDragImageEx()
{
// Find the bounding rectangle of all the selected items
CRect rectBounding; // Holds rectangle bounding area for bitmap
CRect rectFirstItem; // Holds first item's height and width
CRect rectTextArea; // Holds text area of image
int nNumSelected; // Holds total number of selected items
HTREEITEM hItem;
CClientDC DraggedNodeDC(this); // To draw drag image
CDC *pDragImageCalcDC = NULL; // to find the drag image width and height
CString strItemText;
CBitmap *pBitmapOldMemDCBitmap = NULL; // Pointer to bitmap in memory
CFont *pFontOld = NULL; // Used for bitmap font
int nIdx = 0, nCounter = 0; // Counts array elements
int nMaxWidth = 0; // holds the maximum width to be taken to form the bounding rect
//UINT uiSelectedItems; // Holds an item
CImageList *pImageListDraggedNode = NULL; // Holds an image list pointer
nNumSelected = m_vSelItem.size();
if( nNumSelected > 0)
{
pDragImageCalcDC = GetDC();
if(pDragImageCalcDC == NULL)
return NULL;
CImageList *pImageList = GetImageList(TVSIL_NORMAL);
//HICON hIcon = pImageList->ExtractIcon(nImg);
int cx,cy;
ImageList_GetIconSize(*pImageList, &cx, &cy);
// Calculate the maximum width of the bounding rectangle
for ( nIdx = 0; nIdx < nNumSelected; nIdx++)
{
// Get the item's height and width one by one
hItem = m_vSelItem[nIdx];
strItemText = GetItemText(hItem);
rectFirstItem.SetRectEmpty();
pDragImageCalcDC->DrawText(strItemText, rectFirstItem, DT_CALCRECT);
if(nMaxWidth < ( rectFirstItem.Width()+cx))
nMaxWidth = rectFirstItem.Width()+cx;
}
// Get the first item's height and width
hItem = m_vSelItem[0];
strItemText = GetItemText(hItem);
rectFirstItem.SetRectEmpty();
pDragImageCalcDC->DrawText(strItemText, rectFirstItem, DT_CALCRECT);
ReleaseDC(pDragImageCalcDC);
// Initialize textRect for the first item
rectTextArea.SetRect(1, 1, nMaxWidth, rectFirstItem.Height());
// Find the bounding rectangle of the bitmap
rectBounding.SetRect(0,0, nMaxWidth+2, (rectFirstItem.Height()+2)*nNumSelected);
CDC MemoryDC; // Memory Device
CTreeCtrl中节点的拖放
5星 · 超过95%的资源 需积分: 10 114 浏览量
2008-10-08
19:03:11
上传
评论
收藏 8.17MB RAR 举报
yuxian04172120
- 粉丝: 0
- 资源: 1
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页