MFC开发实用教程1:CListCtrl控件实现Item项拖拽效果

CListCtrl控件拖拽Item项,闲话少说,先上效果图给大家看看


看到效果图后,大家是不是觉得很赞,是不是很想知道,这样的效果是怎样实现的呢?ok

直奔主题,下面我说说实现步骤

一、添加一个CDragListCtrl类继承于CListCtrl类

二、CDragListCtrl类中处理=LVN_BEGINDRAG,WM_MOUSEMOVE,WM_LBUTTONUP消息即可

消息:=LVN_BEGINDRAG 对应的消息函数:OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)

消息:WM_MOUSEMOVE 对应的消息函数:OnMouseMove(UINT nFlags, CPoint point)

消息:WM_LBUTTONUP 对应的消息函数:OnLButtonUp(UINT nFlags, CPoint point)

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

	m_nSelItem = GetNextSelectedItem(pos);

	if (-1 == m_nSelItem)
		return;

	CPoint pt = pNMLV->ptAction;
	m_pDragImageList = CreateDragImage(m_nSelItem, &pt);
	if (NULL == m_pDragImageList)
		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 CDragListCtrl::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);
}

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

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

	CListCtrl::OnMouseMove(nFlags, point);
}

源码下载链接:http://download.csdn.net/detail/d704791892/7121257

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值