MFC中Listbox控件实现鼠标拖拽式复制
时间: 2024-01-19 14:03:06 浏览: 68
listbox拖拽功能实现
在MFC中,可以通过重载Listbox控件的OnLButtonDown、OnMouseMove、OnLButtonUp等消息响应函数来实现鼠标拖拽式复制。以下是具体实现步骤:
1.在Listbox的OnLButtonDown消息响应函数中,记录鼠标按下的位置和选中项的索引。
2.在Listbox的OnMouseMove消息响应函数中,判断鼠标是否移动超过一定距离,如果是,则开始拖拽操作。
3.在拖拽操作中,创建一个拖拽数据对象,将选中项的数据存入其中,并调用DoDragDrop函数开始拖拽操作。
4.在Listbox的OnLButtonUp消息响应函数中,判断是否是拖拽操作,如果是,则结束拖拽操作。
5.在目标控件的OnDrop消息响应函数中,获取拖拽数据对象中的数据,并将其插入到目标控件中。
下面是具体代码实现:
// Listbox控件的消息响应函数
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
// 记录鼠标按下的位置和选中项的索引
m_ptStartDrag = point;
m_nStartDragIndex = GetCurSel();
CListBox::OnLButtonDown(nFlags, point);
}
void CMyListBox::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON)
{
// 判断是否移动超过一定距离,如果是,则开始拖拽操作
if (abs(point.x - m_ptStartDrag.x) > DRAG_THRESHOLD ||
abs(point.y - m_ptStartDrag.y) > DRAG_THRESHOLD)
{
// 创建拖拽数据对象
COleDataSource* pDataSource = new COleDataSource();
CString strData = GetText(m_nStartDragIndex);
pDataSource->CacheGlobalData(CF_UNICODETEXT, (HGLOBAL)strData.GetBuffer(), -1);
// 开始拖拽操作
DROPEFFECT dropEffect = pDataSource->DoDragDrop(DROPEFFECT_COPY | DROPEFFECT_MOVE);
// 释放拖拽数据对象
delete pDataSource;
// 结束拖拽操作
if (dropEffect & DROPEFFECT_MOVE)
{
DeleteString(m_nStartDragIndex);
}
}
}
CListBox::OnMouseMove(nFlags, point);
}
void CMyListBox::OnLButtonUp(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON)
{
// 判断是否是拖拽操作
if (m_nStartDragIndex >= 0)
{
m_nStartDragIndex = -1;
m_ptStartDrag = CPoint(0, 0);
}
}
CListBox::OnLButtonUp(nFlags, point);
}
// 目标控件的消息响应函数
DROPEFFECT CMyTargetCtrl::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
// 判断数据类型是否匹配
if (pDataObject->IsDataAvailable(CF_UNICODETEXT))
{
return DROPEFFECT_COPY;
}
return DROPEFFECT_NONE;
}
BOOL CMyTargetCtrl::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
// 获取拖拽数据对象中的数据
HGLOBAL hGlobal = pDataObject->GetGlobalData(CF_UNICODETEXT);
if (hGlobal != NULL)
{
LPWSTR lpData = (LPWSTR)GlobalLock(hGlobal);
CString strData(lpData);
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
// 将数据插入到目标控件中
InsertString(GetCount(), strData);
SetCurSel(GetCount() - 1);
return TRUE;
}
return FALSE;
}
阅读全文