让ClistCtrl能够拖动项

本文介绍了如何让CListCtrl控件支持拖动项,提供了源代码下载和使用方法,特别适用于CListCtrl的报告样式。示例代码解决了拖动到最后一项无法放置的问题,并在拖动到边界时自动滚动。当拖放操作完成后,通过自定义消息通知父窗口进行项的交换更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

让ClistCtrl能够拖动项


前言:

    在网上搜索很多关于拖动ClistCtrl中一项的文章,找到了一些,但却编译不了。有个例子不错,但总觉得不合适我的程序,于是自己下决心做一个,过程倒还挺顺利。现在拿出来和大家分享,希望对大家有所帮助。阿弥陀佛!^_^

 


一、先上个图片个给大家看一下效果吧。

 

 

 


二、源代码下载

DragListCtrl_VC6.zip (VC6下编译通过,支持unicode)

 

 

 


三、几点说明

 

1.本例子只能在CListCtrl的报告样式中应用,其它样式的不行。

2.为了简单方便和高效,我没有选择重绘ClistCtrl(其实是我不会,哈哈)。

3.自己写的CDragList最主要代码都集中在OnMouseMove()函数,本来不用那么复杂的,但有个问题增加了这个复杂性:

一开始,当程序拖动到最后一项时,不能放在最后一项的后面(或者是放在最前面一项)。我发现很多程序的拖动项都有类似的“毛病”,比如一些程序在自定义菜单项位置时或在一些树目录中移动文件,都有这样的问题。最后花了努力克服这个问题,但代码复杂了,方法也有点怪,但毕竟效果不错。相信代码还有改进的空间。诸位看客如果谁改进了,请给我一个副本,先感谢了。

4.当有滚动条时,拖到最下面或最上面时都会自动滚动滚动条(这个当然是必要的啦)

5.确定交换两项后,CDragList会向ListCtrl的父窗口发送WM_MOVEITEM消息
  父窗口添加自定义消息函数并处理item的交换,更新ListCtrl

 

 

 


四、使用方法

1.把DragList.h 和 DragList.cpp 添加到你的工程里

   并且在你自己的派生的ClistCtrl里包含头文件DragList.h

 

2.在你自己的派生的ClistCtrl的鼠标消息函数里添加以下代码

//鼠标按下: void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { CListCtrl::OnLButtonDown(nFlags, point); CDragList::BeginDrag(m_hWnd,point); //一定要放在OnLButtonDown(nFlags, point);后面 } //鼠标弹起 void CMyListCtrl::OnLButtonUp(UINT nFlags, CPoint point) { CDragList::EndDrag(m_hWnd,point); CListCtrl::OnLButtonUp(nFlags, point); } //鼠标移动 void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point) { if( CDragList::m_SelectItem!=SELECT_NONE && nFlags&MK_LBUTTON ) CDragList::Dragging(m_hWnd,point); CListCtrl::OnMouseMove(nFlags, point); } 

 

 

 

 

 

 

3.ListCtrl的父窗口添加自定义消息,处理交换item的消息

 

(1)对话框头文件里

 

 // Generat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值