我正在实现重新排列listview项而不使用OLE拖放。
我已经成功解决了大部分此任务,除非用户想要将项目放在当前不可见的位置时向上/向下滚动。
我可以使用以下消息向上/向下滚动列表视图:
SendMessage(hwndListView, WM_VSCROLL, (WPARAM)SB_LINEUP, (LPARAM)0);
SendMessage(hwndListView, WM_VSCROLL, (WPARAM)SB_LINEDOWN, (LPARAM)0);
我需要你的建议来找出我何时何地我需要发送这些消息(我想它应该在WM_MOUSEHOVER或类似的东西上完成?)。
我只是不知道哪条消息,以及如何,我应该检查是否需要滚动。
我有兴趣实现拖放的默认滚动行为。
我尝试过使用listview匹配测试,因此我可以检查LVHT_ABOVE
和LVHT_BELOW
的{{3}},但这对我不起作用。
点击列表视图时,我无法获得这些值...
我在其他编程语言中找到了一些使用计时器来实现它的例子。我在撰写这篇文章时正在研究它们。
Listview处于报告模式并支持多选。
我正在处理以下消息:
LVN_BEGINDRAG // I create drag image here
WM_MOUSEMOVE // I update drag image here
WM_LBUTTONUP // I rearrange items here and perform cleanup
我已经省略了SSCCE来保持这篇文章的简短。如果需要,我可以发布它。如果需要进一步的信息,请发表评论。
答案 0 :(得分:3)
据推测,您的拖放循环使用SetCapture
来捕获鼠标输入。
您所要做的就是留意WM_MOUSEMOVE
条消息。当鼠标移动到列表视图顶部或底部上方时,设置一个标志以指示您正在滚动并使用SetTimer
启动计时器。
每次定时器关闭时,通过向列表视图发送WM_VSCROLL
消息,在适当的方向滚动一行。
如果鼠标移回列表视图内部,或者捕获丢失(即获得WM_CAPTURECHANGED
),请终止计时器并停止滚动。