让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 |