// DragListCtrl.cpp : 实现文件 // #include "stdafx.h" //#include "DragListCtrlDemo.h" #include "DragListCtrl.h" // CDragListCtrl IMPLEMENT_DYNAMIC(CDragListCtrl, CListCtrl) CDragListCtrl::CDragListCtrl() : m_nSelItem(-1) , m_bDragging(FALSE) , m_pDragImageList(NULL) { } CDragListCtrl::~CDragListCtrl() { if (m_pDragImageList) { delete m_pDragImageList; m_pDragImageList = NULL; } } BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl) //ON_NOTIFY_REFLECT(LVN_BEGINDRAG, &CDragListCtrl::OnLvnBegindrag) //Jeff:VS2008才需要这种方式,否则VC6底下会报错; ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnLvnBegindrag) ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() END_MESSAGE_MAP() // CDragListCtrl 消息处理程序 void CDragListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; int count = GetSelectedCount(); if (1 != count) return; POSITION pos = GetFirstSelectedItemPosition(); if (NULL == pos) return; m_nSelItem = GetNextSelectedItem(pos); if (-1 == m_nSelItem) return; // 获取区域大小; // 获取当前活动的点; CPoint pt = pNMLV->ptAction; m_pDragImageList = CreateDragImage(m_nSelItem, &pt); if (NULL == m_pDragImageList) return; ////////////////////////////////////////////////////////////////////////// CRect rcItem; GetItemRect(m_nSelItem, rcItem, LVIR_ICON); ////////////////////////////////////////////////////////////////////////// m_bDragging = TRUE; m_pDragImageList->BeginDrag(0, CPoint(18, 8)); //m_pDragImageList->BeginDrag(0, pt); ClientToScreen(&pt); CRect rt; GetParent()->GetWindowRect(&rt); pt.x -= rt.left; pt.y -= rt.top; m_pDragImageList->DragEnter(GetParent(), pt); SetCapture(); } void CDragListCtrl::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (m_bDragging) { ReleaseCapture(); m_bDragging = FALSE; //m_nSelItem = -1; m_pDragImageList->DragLeave(GetParent()); m_pDragImageList->EndDrag(); m_pDragImageList->DeleteImageList(); delete m_pDragImageList; m_pDragImageList = NULL; } CListCtrl::OnLButtonUp(nFlags, point); } void CDragListCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (m_bDragging) { CPoint pt = point; ClientToScreen(&pt); CRect rt; GetParent()->GetWindowRect(&rt); pt.x -= rt.left; pt.y -= rt.top; m_pDragImageList->DragMove(pt); } CListCtrl::OnMouseMove(nFlags, point); }