体系结构概述

此体系结构概述为适用于平板电脑和触控技术的 Windows Touch API 提供了上下文,并说明了它如何适合更大的 Windows 7 体系结构。

Windows 触控输入和手势的消息

Windows Touch 的消息功能是通过在执行期间侦听和解释消息来启用的。 下图显示了 Windows 7 如何从硬件生成消息并将其发送到应用程序。

显示 Windows 7 如何将消息从多点触控硬件发送到应用程序的插图

在图的最左侧列中,触摸敏感硬件接收来自用户的输入。 然后,驱动程序在硬件和 OS 之间进行通信。 接下来,OS 会生成 WM_TOUCHWM_GESTURE 消息,然后将其发送到应用程序的 HWND。 然后,应用程序会根据消息中封装的信息更新 UI。

默认情况下,应用程序接收手势。 除非应用程序使用 RegisterTouchWindow 函数注册 Windows Touch 输入消息,否则 (WM_GESTURE 消息) 的通知由 Windows 创建并发送到该应用程序窗口。 如果应用程序窗口注册以接收触摸消息,则会将 Windows Touch 输入 (WM_TOUCH 消息) 通知发送到该应用程序窗口。 Windows 触控和手势消息是贪婪的,即在应用程序窗口上进行触摸或手势开始后,所有消息将发送到该应用程序,直到手势完成或主要触摸完成。

对于旧版支持,Windows 会解释 WM_GESTURE 消息(如果它们被冒泡),然后发送或 POST 映射到手势的相应消息。 若要避免中断旧版支持,请确保使用 DefWindowProc 转发WM_GESTURE消息。 有关旧版支持的详细信息,请参阅 Windows 触控手势概述部分。

操作和惯性

Windows Touch 程序员必须能够以对正在发生的手势有意义的方式解释来自多个源的手势。 Microsoft 提供操作 API 来执行这些计算。 操作本质上是手势,其值与它们关联,用于描述整个手势。 将输入数据连接到操作处理器后,可以检索与用户对对象执行的操作相关的信息。 下图显示了使用操作的一种方法。

显示传递给对象的操作处理器的 Windows 触摸消息的插图,该处理器使用 -imanipulationevents 接口处理事件

在图的左上角,用户已触摸屏幕,这将创建触摸消息。 这些消息包含用于确定焦点中的对象的 x 坐标和 y 坐标。 焦点中的 对象包含操作处理器。 接下来,在具有 TOUCHEVENTF_UP 标志 的WM_TOUCH 消息上,选择用户焦点中的对象,引用操作处理器,并将消息发送到操作处理器。 后续 WM_TOUCH 与此联系人关联的消息将发送到操作处理器,直到收到具有 TOUCHEVENTF_UP 标志 的WM_TOUCH 消息并取消引用所选对象。 在插图的右下角,实现 _IManipulationEvents 接口的操作事件接收器用于处理操作事件,这些事件是在创建触摸消息时引发的。 事件发生时,事件接收器可以根据操作事件对接口执行更新。

在 Windows Touch 应用程序中,通常采用简单的物理特性,以便对象顺利停止,而不是在不再被触摸时突然停止。 Microsoft 提供惯性 API 来执行这些简单物理场的计算,以便应用程序的行为方式与其他应用程序类似。 这还可以节省创建可靠物理功能所需的工作量。 下图显示了如何使用惯性。

显示传递到对象的 iinertiaprocessor 接口的 Windows 触摸消息的插图,该接口使用 -imanipulationevents 接口引发事件

请注意惯性和操作之间的相似性。 两者之间的唯一区别是,在惯性的情况下,解释的消息将交给惯性处理器而不是操作处理器,而惯性处理器将引发事件。 在图的左上角,在带有TOUCHEVENTF_UP标志的WM_TOUCH消息上,触摸消息用于识别焦点中包含惯性处理器和操作处理器的对象。 后续 WM_TOUCH 消息将发送到操作处理器,操作处理器对应用程序 UI 执行更新。 操作完成后,操作的速度值将用于设置惯性处理器。 如中间列中所示,在 IInertiaProcessor 接口上使用计时器或其他循环在单独的线程中调用 ProcessProcessTime 方法,直到调用指示处理器已完成处理。 进行这些调用时,会引发操作事件,这些事件由基于 _IManipulationEvents 接口的操作事件接收器处理。 在图的右下角,当操作事件通过事件接收器中的事件处理程序发生时,此事件接收器会根据操作事件对应用程序 UI 执行更新。

编程指南