【问题标题】:legacy listview doesn't touch-scroll旧版列表视图不会触摸滚动
【发布时间】:2016-09-01 08:20:57
【问题描述】:

我有一个近乎荒谬的问题。这听起来很简单,但我花了几天时间研究它无济于事。

我在 ATL/WTL 中有一个程序,它使用列表视图控件来显示文件和文件夹。用户抱怨这些窗格不会在支持触摸的 PC 上使用“平移”手势滚动。它可以用鼠标滚动,但不能用手指滚动。

该程序完全与触摸无关。它依赖legacy behavior 将触摸转换为滚动消息,但它不起作用。我很难进行故障排除,因为我没有可以测试具有触控功能的 Windows PC。我相信滚动消息已发送,但随后窗口跳回。我根本不做任何滚动事件,所以这都是默认的列表视图行为。

我在同一程序中使用的其他列表视图控件,例如在对话窗口中,通过触摸滚动正常工作(!)。在排除了所有其他可能性之后,我得出的结论是问题出在窗口类名(?)上。虽然对话框中的列表视图窗口具有默认类名 syslistview32,但不会滚动的视图以 ATL 方式超类化:

DECLARE_WND_SUPERCLASS(_T("ATL:ShellItemView"), CListViewCtrl::GetWndClassName())

然而基类是一个标准的列表视图控件。问题可能是类名吗?!我想不出别的了。如果您有触摸式 PC,可以从这里 (free trial) 试用该程序

谢谢 尼科斯

【问题讨论】:

  • 超类化改变行为。您是否没有考虑过,您主动破坏了您所追求的功能?
  • 超类具有与列表视图控件相同的 DefWndProc。我只改变我需要的行为,这与滚动无关。如果我的预感是正确的,无论处理触摸滚动消息翻译,查看窗口类名称以识别标准控件
  • 那么现在你知道如何构造一个minimal reproducible example了。
  • 我可以看出你是苏格拉底式自助法的粉丝:)
  • 回复:"I only alter the behaviour I need" - 你能列出你处理的消息吗?

标签: listview winapi touch atl


【解决方案1】:

所以是的,就是类名!我没有对列表视图进行超类化,而是创建了一个标准列表视图,然后对其进行子类化。这保留了syslistview32 类名,但提供了我自己的额外功能。名字里有什么?

这是微软的一个大错误;我不敢相信我在上面浪费了 3 天。但至少现在解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多