【发布时间】: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"- 你能列出你处理的消息吗?