在用户拖动listview项目时检测何时需要滚动

时间:2015-03-03 07:44:28

标签: c++ c listview winapi drag-and-drop

引言:

我正在实现重新排列listview项而不使用OLE拖放。

问题:

我已经成功解决了大部分此任务,除非用户想要将项目放在当前不可见的位置时向上/向下滚动。

问题:

我可以使用以下消息向上/向下滚动列表视图:

SendMessage(hwndListView, WM_VSCROLL, (WPARAM)SB_LINEUP, (LPARAM)0);
SendMessage(hwndListView, WM_VSCROLL, (WPARAM)SB_LINEDOWN, (LPARAM)0);

我需要你的建议来找出我何时何地我需要发送这些消息(我想它应该在WM_MOUSEHOVER或类似的东西上完成?)。

我只是不知道哪条消息,以及如何,我应该检查是否需要滚动。

我有兴趣实现拖放的默认滚动行为。

我努力解决这个问题:

我尝试过使用listview匹配测试,因此我可以检查LVHT_ABOVELVHT_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来保持这篇文章的简短。如果需要,我可以发布它。如果需要进一步的信息,请发表评论。

1 个答案:

答案 0 :(得分:3)

据推测,您的拖放循环使用SetCapture来捕获鼠标输入。

您所要做的就是留意WM_MOUSEMOVE条消息。当鼠标移动到列表视图顶部或底部上方时,设置一个标志以指示您正在滚动并使用SetTimer启动计时器。

每次定时器关闭时,通过向列表视图发送WM_VSCROLL消息,在适当的方向滚动一行。

如果鼠标移回列表视图内部,或者捕获丢失(即获得WM_CAPTURECHANGED),请终止计时器并停止滚动。