滚动ListView时,鼠标滚轮偶尔会使滚动失效

5

我在使用Win32列表视图时遇到了一些问题,希望有人能提供一些帮助。当快速滚动(通过鼠标滚轮)时,偶尔会出现列表视图似乎正在滚动,但却跳回所选项目,以便它在视野范围内可见。换句话说,列表视图会撤消您的鼠标滚轮滚动操作,以便在列表的顶部/底部显示所选项目。我意识到这听起来非常可疑,因为Common Controls已经被全球广泛使用。

以下是如何复制此问题:

  1. 以报告模式加载包含约500个项目左右的列表视图(确切的计数并不重要,您只需要拥有几个屏幕的数据即可)。
  2. 选择列表中的一个项目并记住所选内容。
  3. 快速向下(靠近您)使用鼠标滚轮滚动列表。我们正在尝试尽可能快地滚动选定的项目,使其移出视野。您可能需要使用比平常更大的力量滚动鼠标滚轮。这种情况并不总是发生,您可能需要尝试几次。
  4. 滚动将完成正常或在结束时改变主意并将您拉回到所选项目在屏幕上可见的视图中。

这种情况发生在常规和虚拟列表视图中。我已经在Windows 7 Ultimate上测试了Win32和C#。

我制作了一个小型WinForms应用程序来展示这种行为(需要.NET Framework 3.5)。如果您不想运行来自陌生人的任意可执行文件(我理解),可以创建一个新的WinForms应用程序,在其中添加报表模式的列表视图,添加一列,并在表单加载事件中填充列表,使其包含500个递增整数:

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 500; i++)
    {
        this.listView1.Items.Add(i.ToString());
    }
}

1
如果你在滚轮上用力,大多数(如果不是全部)鼠标滚轮都会生成WM_MBUTTONDOWN消息。你确定这没有发生吗? - John Knoeller
我在Windows XP上使用MSVC 6.0尝试重新创建这个项目,但没有成功。 - Mark Ransom
4个回答

1

我注意到这种行为似乎是内置在列表视图控件中的。我看不出这种功能有什么用处。我之前在Sysinternals论坛上创建了一个线程,可能会有用。


听起来需要 Raymond Chen 来解决。有趣的是,这个问题似乎在 Windows 7 的资源管理器中没有出现。然而,在 Windows XP 中却出现了。通过 Spy++ 快速检查可以发现,列表框的窗口类别被命名为 DirectUIHWND,因此它们可能正在对其进行子类化并阻止某些操作。 - Matt Green
许多种类的窗口使用DirectUIHWND类。 - Windows programmer

0

我意识到这听起来非常可疑,因为常见控件已经在全球范围内被过度使用。

ListView 还没有被过度使用,但它正在生命支持中。请使用其他控件。


如果我找到一个替代品,这就没问题了。你有没有什么建议,可以使用开源许可证兼容的ListView来处理虚拟列表?CodeProject上没有太多有趣的东西。 - Matt Green
在 VC++ 6 的时代,我曾经使用过 FlexGrid。虽然 Microsoft 是为 VB 设计的,但是它也可以从 VC++ 中使用。.Net 有一个 DataGrid,我没有尝试过,但它可能会对你有所帮助。 - Windows programmer
FlexGrid看起来不错,但已经过时了。我想现在我会坚持使用股票控件并继续寻找替代品。如果一切都失败了,我将开始着手开发自己的控件。 :) - Matt Green

0

-1
我曾经遇到同样的问题,但我认为我找到了原因:我使用了一个工具,可以配置鼠标按钮(X-Mouse Button Control)。通过禁用它,问题就像魔术般消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接