实现ListControl控件中元素拖放功能(顶者有分)

wxaxiao 2004-09-23 06:04:40
怎样实现ListControl控件中元素拖放功能?
将同一元素从彼ListControl拖动到另一ListControl中去?
虚心请教各位同仁:)
如果能详细一些最好,谢了:)
...全文
223 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxaxiao 2004-11-05
  • 打赏
  • 举报
回复
已实现,主要是光标指向没处理好。还是多谢大家捧场
canoe_eyes 2004-10-21
  • 打赏
  • 举报
回复
标记
amendajing 2004-10-21
  • 打赏
  • 举报
回复
学习一下
wxaxiao 2004-10-08
  • 打赏
  • 举报
回复
void CControlListboxDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList)
{
pDropList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
char szLabel[256];
LVITEM lviT;
LVITEM* plvitem;

ZeroMemory(&lviT, sizeof (LVITEM));
lviT.iItem = m_nDragIndex;
lviT.mask = LVIF_TEXT;
lviT.pszText = szLabel;
lviT.cchTextMax = 255;

lvItem* pItem;
lvItem lvi;
lvi.plvi = &lviT;
lvi.plvi->iItem = m_nDragIndex;
lvi.plvi->mask = LVIF_TEXT;
lvi.plvi->pszText = szLabel;
lvi.plvi->cchTextMax = 255;

if(pDragList->GetSelectedCount() == 1)
{
pDragList->GetItem (lvi.plvi);
lvi.sCol2 = pDragList->GetItemText(lvi.plvi->iItem, 1);
if(pDragList == pDropList)
{
pDragList->DeleteItem (m_nDragIndex);
if(m_nDragIndex < m_nDropIndex) m_nDropIndex--;
}
lvi.plvi->iItem = (m_nDropIndex == -1) ? pDropList->GetItemCount () : m_nDropIndex;
pDropList->InsertItem (lvi.plvi);
POSITION pos = pDragList->GetFirstSelectedItemPosition();
pDragList->DeleteItem(lvi.plvi->iItem);
pDropList->SetItemText(lvi.plvi->iItem, 1, (LPCTSTR)lvi.sCol2);
pDropList->SetItemState (lvi.plvi->iItem, LVIS_SELECTED, LVIS_SELECTED);
}
else
{

CList<lvItem*, lvItem*> listItems;
POSITION listPos;
POSITION pos = pDragList->GetFirstSelectedItemPosition();
while(pos)
{
plvitem = new LVITEM;
ZeroMemory(plvitem, sizeof(LVITEM));
pItem = new lvItem;
pItem->plvi = plvitem;
pItem->plvi->iItem = m_nDragIndex;
pItem->plvi->mask = LVIF_TEXT;
pItem->plvi->pszText = new char;
pItem->plvi->cchTextMax = 255;
m_nDragIndex = pDragList->GetNextSelectedItem(pos);
pItem->plvi->iItem = m_nDragIndex;
pDragList->GetItem(pItem->plvi);
pItem->sCol2 = pDragList->GetItemText(pItem->plvi->iItem, 1);
listItems.AddTail(pItem);
}
if(pDragList == pDropList)
{
pos = pDragList->GetFirstSelectedItemPosition();
while(pos)
{
pos = pDragList->GetFirstSelectedItemPosition();
m_nDragIndex = pDragList->GetNextSelectedItem(pos);

pDragList->DeleteItem(m_nDragIndex); if(m_nDragIndex < m_nDropIndex) m_nDropIndex--;
}
}
listPos = listItems.GetHeadPosition();
while(listPos)
{
pItem = listItems.GetNext(listPos);

m_nDropIndex = (m_nDropIndex == -1) ? pDropList->GetItemCount() : m_nDropIndex;
pItem->plvi->iItem = m_nDropIndex;
pDropList->InsertItem(pItem->plvi);
pDropList->SetItemText(pItem->plvi->iItem, 1, pItem->sCol2);

pDropList->SetItemState(pItem->plvi->iItem, LVIS_SELECTED, LVIS_SELECTED);

m_nDropIndex++;
}
}
}

wxaxiao 2004-10-08
  • 打赏
  • 举报
回复
void CControlListboxDlg::OnLButtonUp(UINT nFlags, CPoint point)
{

if (m_bDragging)
{

ReleaseCapture ();
m_bDragging = FALSE;
m_pDragImage->DragLeave (GetDesktopWindow ());
m_pDragImage->EndDrag ();
delete m_pDragImage;
CPoint pt (point);
ClientToScreen (&pt);
CWnd* pDropWnd = WindowFromPoint (pt);
ASSERT (pDropWnd);
if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl)))
{
m_pDropList = (CListCtrl*)pDropWnd;
DropItemOnList(m_pDragList, m_pDropList);
}
}

CDialog::OnLButtonUp(nFlags, point);
}

void CControlListboxDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bDragging)
{

CPoint pt(point);
ClientToScreen(&pt);
m_pDragImage->DragMove(pt);
m_pDragImage->DragShowNolock(false);
CWnd* pDropWnd = WindowFromPoint (pt);
ASSERT(pDropWnd);
if (pDropWnd != m_pDropWnd)
{
if (m_nDropIndex != -1)
{
TRACE("m_nDropIndex is -1\n");
CListCtrl* pList = (CListCtrl*)m_pDropWnd;
VERIFY (pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED));
VERIFY (pList->RedrawItems (m_nDropIndex, m_nDropIndex));
pList->UpdateWindow ();
m_nDropIndex = -1;
}
else
{
TRACE("m_nDropIndex is not -1\n");
CListCtrl* pList = (CListCtrl*)m_pDropWnd;
int i = 0;
int nCount = pList->GetItemCount();
for(i = 0; i < nCount; i++)
{
pList->SetItemState(i, 0, LVIS_DROPHILITED);
}
pList->RedrawItems(0, nCount);
pList->UpdateWindow();
}
}
if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl)))
{
SetCursor(LoadCursor(NULL, IDC_ARROW));
UINT uFlags;
CListCtrl* pList = (CListCtrl*)pDropWnd;
pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED
pList->RedrawItems (m_nDropIndex, m_nDropIndex);
m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(pt, &uFlags);
pList->SetItemState(m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED);

pList->RedrawItems(m_nDropIndex, m_nDropIndex);
pList->UpdateWindow();
}
else
{

SetCursor(LoadCursor(NULL, IDC_NO));
}

m_pDragImage->DragShowNolock(true);
}

CDialog::OnMouseMove(nFlags, point);
wxaxiao 2004-10-08
  • 打赏
  • 举报
回复
此问题我已解决,我用三个消息函数实现的,用的是指针
然后想将在拖完后将原元素删除就发生错落现象
我把我的代码贴上,希望大家帮我辅正
warmchang 2004-10-04
  • 打赏
  • 举报
回复
自己写消息相应了;
化外之民 2004-10-02
  • 打赏
  • 举报
回复
UP
wxaxiao 2004-10-01
  • 打赏
  • 举报
回复
自己顶
liricn 2004-09-28
  • 打赏
  • 举报
回复
我也来啊
wxaxiao 2004-09-28
  • 打赏
  • 举报
回复
to DentistryDoctor(牙科医生(潜心修内功,向各位大师取经了)) ,谢啦
我英语不太好,想让让各位兄弟帮帮忙,能有详细说明是最好不过啦,再次谢谢啦
DentistryDoctor 2004-09-27
  • 打赏
  • 举报
回复
http://www.codeguru.com/Cpp/controls/listview/
Drag & Drop
有很多的例子我现成的代码。
wxaxiao 2004-09-27
  • 打赏
  • 举报
回复
ddszhan(高等数学) ,请教此事件处理函数对应的消息类型是LVN_BEGINDRAG吧,他又是怎么生成的呢?
princeml 2004-09-24
  • 打赏
  • 举报
回复
帮你顶!
chan2chen 2004-09-24
  • 打赏
  • 举报
回复
ding!
wxaxiao 2004-09-24
  • 打赏
  • 举报
回复
自己UP
ddszhan 2004-09-24
  • 打赏
  • 举报
回复
BOOL CCaseMngDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// 检查是否为列表的拖拽操作
if (wParam==(UINT)m_lstctlTable.GetDlgCtrlID())
{
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
if (pnmv->hdr.code==LVN_BEGINDRAG || pnmv->hdr.code==LVN_BEGINRDRAG)
{
// 标识当前操作是否是列表项的拖拽
m_bLstctlDragging=TRUE;

// 获取鼠标形状
m_hDragCursor=AfxGetApp()->LoadCursor(IDC_DRAGLINK);
m_hNoCursor=AfxGetApp()->LoadCursor(IDC_DROPNOT);

// 设置鼠标为拖拽形状
m_hPreCursor=SetCursor(m_hDragCursor);

SetCapture();
}

}
return CShowBarDlg::OnNotify(wParam, lParam, pResult);
}
fim 2004-09-24
  • 打赏
  • 举报
回复
up
whu 2004-09-24
  • 打赏
  • 举报
回复
最好是用activex控件加上javascript写。
单独用javascript写也可以。把ListControl一些需要的内容通过javascript剪到剪贴板中。
在另一个ListControl的onmouse事件中处理。就可以了,我写过。
BlankFoxCat 2004-09-23
  • 打赏
  • 举报
回复
关注中.....
加载更多回复(1)

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧