#if !defined(AFX_DRAGDROPLISTCTRL_H__17F6D56D_591C_4319_B0EB_9D6D9B45BC79__INCLUDED_) #define AFX_DRAGDROPLISTCTRL_H__17F6D56D_591C_4319_B0EB_9D6D9B45BC79__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif class CDragDropListCtrl : public CListCtrl { protected: // 要被拖动的1个或多个项的索引数组; CDWordArray m_anDragIndexes; // 当前被拖动项替换的项索引; int m_nDropIndex; // 拖动时的图标; CImageList* m_pDragImage; // 上一个索引; int m_nPrevDropIndex; // 上一个状态; UINT m_uPrevDropState; DWORD m_dwStyle; // 保存拖动的起始坐标; CPoint m_ptStart; // 当前移动的坐标点; CPoint m_ptCurr; // 移动起始点与当前坐标点间的所有项; void MoveDragItem(CPoint ptMove); enum EScrollDirection { scrollNull, scrollUp, scrollDown }; EScrollDirection m_ScrollDirection; UINT m_uScrollTimer; public: CDragDropListCtrl(); bool IsDragging() const { return m_pDragImage != NULL; } public: virtual ~CDragDropListCtrl(); protected: void DropItem(); void DropItem(CPoint pt); void RestorePrevDropItemState(); void UpdateSelection(int nDropIndex); void SetScrollTimer(EScrollDirection ScrollDirection); void KillScrollTimer(); CImageList* CreateDragImageEx(LPPOINT lpPoint); // 获取点所对应的项矩形; int GetPtItemIndex(CPoint pt); protected: afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnTimer(UINT nIDEvent); DECLARE_MESSAGE_MAP() }; #endif