DragListCtrl.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // DragListCtrl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. //#include "DragListCtrlDemo.h"
  5. #include "DragListCtrl.h"
  6. // CDragListCtrl
  7. IMPLEMENT_DYNAMIC(CDragListCtrl, CListCtrl)
  8. CDragListCtrl::CDragListCtrl()
  9. : m_nSelItem(-1)
  10. , m_bDragging(FALSE)
  11. , m_pDragImageList(NULL)
  12. {
  13. }
  14. CDragListCtrl::~CDragListCtrl()
  15. {
  16. if (m_pDragImageList)
  17. {
  18. delete m_pDragImageList;
  19. m_pDragImageList = NULL;
  20. }
  21. }
  22. BEGIN_MESSAGE_MAP(CDragListCtrl, CListCtrl)
  23. //ON_NOTIFY_REFLECT(LVN_BEGINDRAG, &CDragListCtrl::OnLvnBegindrag) //Jeff:VS2008才需要这种方式,否则VC6底下会报错;
  24. ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnLvnBegindrag)
  25. ON_WM_LBUTTONUP()
  26. ON_WM_MOUSEMOVE()
  27. END_MESSAGE_MAP()
  28. // CDragListCtrl 消息处理程序
  29. void CDragListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
  30. {
  31. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  32. // TODO: 在此添加控件通知处理程序代码
  33. *pResult = 0;
  34. int count = GetSelectedCount();
  35. if (1 != count)
  36. return;
  37. POSITION pos = GetFirstSelectedItemPosition();
  38. if (NULL == pos)
  39. return;
  40. m_nSelItem = GetNextSelectedItem(pos);
  41. if (-1 == m_nSelItem)
  42. return;
  43. // 获取区域大小;
  44. // 获取当前活动的点;
  45. CPoint pt = pNMLV->ptAction;
  46. m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
  47. if (NULL == m_pDragImageList)
  48. return;
  49. //////////////////////////////////////////////////////////////////////////
  50. CRect rcItem;
  51. GetItemRect(m_nSelItem, rcItem, LVIR_ICON);
  52. //////////////////////////////////////////////////////////////////////////
  53. m_bDragging = TRUE;
  54. m_pDragImageList->BeginDrag(0, CPoint(18, 8));
  55. //m_pDragImageList->BeginDrag(0, pt);
  56. ClientToScreen(&pt);
  57. CRect rt;
  58. GetParent()->GetWindowRect(&rt);
  59. pt.x -= rt.left;
  60. pt.y -= rt.top;
  61. m_pDragImageList->DragEnter(GetParent(), pt);
  62. SetCapture();
  63. }
  64. void CDragListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  65. {
  66. // TODO: 在此添加消息处理程序代码和/或调用默认值
  67. if (m_bDragging)
  68. {
  69. ReleaseCapture();
  70. m_bDragging = FALSE;
  71. //m_nSelItem = -1;
  72. m_pDragImageList->DragLeave(GetParent());
  73. m_pDragImageList->EndDrag();
  74. m_pDragImageList->DeleteImageList();
  75. delete m_pDragImageList;
  76. m_pDragImageList = NULL;
  77. }
  78. CListCtrl::OnLButtonUp(nFlags, point);
  79. }
  80. void CDragListCtrl::OnMouseMove(UINT nFlags, CPoint point)
  81. {
  82. // TODO: 在此添加消息处理程序代码和/或调用默认值
  83. if (m_bDragging)
  84. {
  85. CPoint pt = point;
  86. ClientToScreen(&pt);
  87. CRect rt;
  88. GetParent()->GetWindowRect(&rt);
  89. pt.x -= rt.left;
  90. pt.y -= rt.top;
  91. m_pDragImageList->DragMove(pt);
  92. }
  93. CListCtrl::OnMouseMove(nFlags, point);
  94. }