VC/MFC 拖放树形控件与列表控件的项
// 在类的头文件中定义以下变量DWORD m_dwDragStart;
HTREEITEM m_hItemDragD;
HTREEITEM m_hItemDragS;
CTreeCtrl m_Tree;
CImageList* m_pDragImage;
BOOL m_bDragging;
UINT m_nScrollTimerID;
// 实现拖放树形控件节点的功能
//OnTvnBegindragTree为树形控件的系统消息
void OnTvnBegindragTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
NM_TREEVIEW* pNMTreeV = (NM_TREEVIEW*)pNMHDR;
m_bIsTree = TRUE;
//在OnLButtonDown事件中m_dwDragStart = GetTickCount();
//GetTickCount为获得系统当前时间
if( (GetTickCount() - m_dwDragStart) < DRAG_DELAY )
return;
m_hItemDragS = pNMTreeV->itemNew.hItem;
m_hItemDragD = NULL;
HTREEITEM hRootItem = m_Tree.GetRootItem();
if ( hRootItem == m_hItemDragS)
return ;
//得到用于拖动时显示的图象列表
m_pDragImage = m_Tree.CreateDragImage(m_hItemDragS);
if(!m_pDragImage)
return;
m_bDragging = true;
m_pDragImage->BeginDrag ( 0,CPoint(8,8) );
CPoint pt = pNMTreeView->ptDrag;
ClientToScreen( &pt );
//ScreenToClient(&pt);
m_pDragImage->DragEnter(this,pt);
SetCapture();
m_nScrollTimerID = SetTimer(2,40,NULL);
*pResult = 0;
}
// 在类的头文件中定义以下变量
BOOL m_bDragging;
UINT m_nScrollTimerID;
int m_nDragIndex; //Index of selected item in the List we are dragging FROM
int m_nDropIndex; //Index at which to drop item in the List we are dropping ON
CImageList m_ImageList;
CWnd* m_pDropWnd; //Pointer to window we are dropping on
//(will be cast to CListCtrl* type)
CListCtrl* m_pDragList; //Which ListCtrl we are dragging FROM
//开始拖动列表视图m_List的项
//OnLvnBegindragList为列表控件的系统消息
void OnLvnBegindragList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
m_nDragIndex = pNMListView->iItem;
m_ImageList.BeginDrag(m_nDragIndex,CPoint(0,0));
CPoint point(pNMListView->ptAction);
ScreenToClient(&point);
m_ImageList.DragEnter((CWnd*)&m_NavigationList,point);
m_bDragging = TRUE; //we are in a drag and drop operation
m_nDropIndex = -1; //we don't have a drop index yet
m_pDragList = &m_List; //make note of which list we are dragging from
m_pDropWnd = &m_List; //at present the drag list is the drop list
Capture all mouse messages
m_nScrollTimerID = SetTimer(2,40,NULL);
SetCapture();
*pResult = 0;
}
http://blog.sina.com.cn/s/blog_4b44e1c001009xqd.html