MFC中listctrl图片拖拽效果

CEffectList继承基类clistctrl

程序运行效果如下,使用的VS2013

要注意的地方,假如要将控件拖出窗口以外的地方,需要修改拥有拖拽窗口的属性:m_pDragImageList->DragEnter(NULL, pt);改为NULL即可,需要只在父窗口中

运行,则把NULL替换成GetParent()

MFC中listctrl图片拖拽效果

void CEffectList::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 (pos == NULL)
{
return;
}


m_nSelItem = GetNextSelectedItem(pos);


if (-1 == m_nSelItem)
return;


CPoint pt = pNMLV->ptAction;
m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
if (m_pDragImageList == NULL)
{
return;
}


m_bDragging = TRUE;
m_pDragImageList->BeginDrag(0, CPoint(8, 8));
ClientToScreen(&pt);
CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left;
pt.y -= rt.top;
m_pDragImageList->DragEnter(GetParent(), pt);
SetCapture();


}




void CEffectList::OnLButtonDown(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::OnLButtonDown(nFlags, point);
}




void CEffectList::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
if (m_bDragging)
{
CPoint pt = point;
ClientToScreen(&pt);


CRect rt;
GetParent()->GetWindowRect(&rt);
pt.x -= rt.left+20;
pt.y -= rt.top+20;
m_pDragImageList->DragMove(pt);
}




CListCtrl::OnMouseMove(nFlags, point);
}




void CEffectList::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);
}