#include "CDragListCtrl.h" // BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl) // ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_LOOP_SUB_LIST, &CDragListCtrl::OnLvnBegindragListLoopTaskList) // ON_MESSAGE(WM_MOUSEMOVE, OnMouseMove) // ON_MESSAGE(WM_LBUTTONUP, OnLButtonUp) // END_MESSAGE_MAP() CDragListCtrl::CDragListCtrl() { m_nSelItem = -1; m_pDragImageList = NULL; m_bDragging = FALSE; } CDragListCtrl::~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; m_bDragging = TRUE; m_pDragImageList->BeginDrag(0, CPoint(8, 8)); 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); }*/ BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_BEGINDRAG, &CDragListCtrl::OnLvnBegindrag) ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() //ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 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; m_bDragging = TRUE; m_pDragImageList->BeginDrag(0, CPoint(8, 8)); ClientToScreen(&pt); CRect rt; GetParent()->GetWindowRect(&rt); pt.x -= rt.left; pt.y -= rt.top; m_pDragImageList->DragEnter(GetParent(), pt); CDragList::BeginDrag(m_hWnd, pt); SetCapture(); } 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); } if (CDragList::m_SelectItem != SELECT_NONE && nFlags&MK_LBUTTON) { CDragList::Dragging(m_hWnd, point); } CListCtrl::OnMouseMove(nFlags, point); } 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; } CDragList::EndDrag(m_hWnd, point); CListCtrl::OnLButtonUp(nFlags, point); } /*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; m_bDragging = TRUE; m_pDragImageList->BeginDrag(0, CPoint(8, 8)); ClientToScreen(&pt); CRect rt; GetParent()->GetWindowRect(&rt); pt.x -= rt.left; pt.y -= rt.top; m_pDragImageList->DragEnter(GetParent(), pt); SetCapture(); } 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); } 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::OnLButtonDown(UINT nFlags, CPoint point) // { // // TODO: 在此添加消息处理程序代码和/或调用默认值 // // CListCtrl::OnLButtonDown(nFlags, point); // CDragList::BeginDrag(m_hWnd, point); // OutputDebugString(_T("CDragListCtrl::OnLButtonDown()\n")); // }