DragDropListCtrl.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #if !defined(AFX_DRAGDROPLISTCTRL_H__17F6D56D_591C_4319_B0EB_9D6D9B45BC79__INCLUDED_)
  2. #define AFX_DRAGDROPLISTCTRL_H__17F6D56D_591C_4319_B0EB_9D6D9B45BC79__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif
  6. class CDragDropListCtrl : public CListCtrl
  7. {
  8. protected:
  9. // 要被拖动的1个或多个项的索引数组;
  10. CDWordArray m_anDragIndexes;
  11. // 当前被拖动项替换的项索引;
  12. int m_nDropIndex;
  13. // 当前拖动后鼠标停在选项上的索引
  14. int m_nCurIndex;
  15. // 拖动时的图标;
  16. CImageList* m_pDragImage;
  17. // 上一个索引;
  18. int m_nPrevDropIndex;
  19. // 上一个状态;
  20. UINT m_uPrevDropState;
  21. DWORD m_dwStyle;
  22. // 保存拖动的起始坐标;
  23. CPoint m_ptStart;
  24. // 当前移动的坐标点;
  25. CPoint m_ptCurr;
  26. // 移动起始点与当前坐标点间的所有项;
  27. void MoveDragItem(CPoint ptMove);
  28. enum EScrollDirection
  29. {
  30. scrollNull,
  31. scrollUp,
  32. scrollDown
  33. };
  34. EScrollDirection m_ScrollDirection;
  35. UINT m_uScrollTimer;
  36. public:
  37. CDragDropListCtrl();
  38. bool IsDragging() const { return m_pDragImage != NULL; }
  39. CDWordArray* GetDragIndexes(){return &m_anDragIndexes;}
  40. int GetDragSelIndex(){return m_nCurIndex;}
  41. public:
  42. virtual ~CDragDropListCtrl();
  43. protected:
  44. void DropItem();
  45. void DropItem(CPoint pt);
  46. void RestorePrevDropItemState();
  47. void UpdateSelection(int nDropIndex);
  48. void SetScrollTimer(EScrollDirection ScrollDirection);
  49. void KillScrollTimer();
  50. CImageList* CreateDragImageEx(LPPOINT lpPoint);
  51. // 获取点所对应的项矩形;
  52. int GetPtItemIndex(CPoint pt);
  53. protected:
  54. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  55. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  56. afx_msg void OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult);
  57. afx_msg void OnTimer(UINT nIDEvent);
  58. DECLARE_MESSAGE_MAP()
  59. };
  60. #endif