123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // 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<LPNMLISTVIEW>(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);
- }
|