适用于 PenInputPanel 用户的 TextInputPanel

Windows Vista 的发布包括适用于平板电脑输入面板的新可编程性对象,该对象为应用程序如何使用输入面板和与输入面板交互提供了新的可能性范围。 应用程序开发人员首次可以将In-Place输入面板图标与文本框对齐,或将其放置在客户墨迹图面的一角,以提供对备用输入模式的访问权限。 一旦输入面板图标展开到In-Place输入面板,开发人员就可以对定位进行相同的控制。 这样就可以确保In-Place输入面板永远不会与应用程序布局中的关键用户界面元素重叠,甚至可以重新排列应用程序的用户界面,以便为In-Place输入面板留出空间,然后将其放置在保留空间中。 新的可编程性模型不仅支持定位,开发人员还可以自定义输入区域、更正模式和输入面板的许多其他属性,以在应用程序中定制文本输入体验。 最后,应用程序首次可以接收用户墨迹,以及与输入面板中的文本插入关联的已识别文本。 这将启用新的应用程序方案,包括更改跟踪日志中的墨迹,并允许用户编辑或查看应用程序中的墨迹。 这些新的可编程性功能是 Microsoft 收到的关于输入面板开发人员故事的反馈的直接结果,是实现应用程序和输入面板更紧密集成的第一步。

为了提供此扩充的输入面板可编程性模型,现有机制用于以编程方式与输入面板交互, PenInputPanel 对象将被弃用,并替换为新的 TextInputPanel 对象。 除了提供新的可编程性功能外, TextInputPanel 对象还提供接近 PenInputPanel 对象的所有编程功能。 TextInputPanel 对象包含在 Windows Vista 和 Windows Vista 软件开发工具包中。 TextInputPanel 对象仅与 Windows Vista 输入面板兼容,不能与 Windows XP Service Pack 2 或更早版本的输入面板一起使用。 以前为使用 PenInputPanel 对象编写的应用程序将继续使用 Windows Vista 输入面板,但是,在编写新的平板电脑应用程序时,强烈建议开发人员使用新的 TextInputPanel 对象,而不是弃用的 PenInputPanel 对象。

TextInputPanel 对象的每个可编程性选项都可以按文本字段应用。 这是通过使用 AttachedEditWindow 属性附加 TextInputPanel 对象的实例来实现的。 属性应设置为文本字段的窗口句柄。

注意

:当输入面板处于就地交互模式时,而不是当输入面板处于浮动或停靠交互模式时,下面介绍的一些属性和方法适用。 就地交互模式是输入面板行为,其中将焦点放在可编辑字段中会导致输入面板图标显示在字段旁边,点击输入面板图标会导致输入面板展开。 仅在输入面板处于就地交互模式时应用的方法和属性均在方法或属性名称中包含“InPlace”。

 

控制输入面板图标和输入面板可见性

应用程序开发人员在 Windows Vista 中可以更好地控制输入面板的第一个方面是其可见性。 使用 TextInputPanel 对象,可以通过三种方式控制In-Place输入面板的可见性。 通过属性和方法的组合,应用程序可以确定输入面板是否显示In-Place、In-Place输入面板何时显示,以及它是首先显示为输入面板图标还是立即显示展开。 通过将这些用于控制可见性的技术与下一部分所述的控制定位的技术相结合,应用程序开发人员可以在应用程序中使用In-Place输入面板创建自定义启动点和自定义工作流。

注意

本节中讨论的属性和方法仅适用于输入面板处于In-Place交互模式时。

 

首先,最重要的是,通过将 InPlaceVisibleOnFocus 属性设置为 false,可以防止In-Place输入面板和输入面板图标出现。 如果用户或组策略未禁用它,则将其设置为尽可能显示的系统默认值。 此选项适用于包含自定义文本输入解决方案作为输入面板替代项的应用程序。

其次,通过设置 DefaultInPlaceState 属性,开发人员可以指定 InPlaceState 枚举指定的就地状态,将焦点置于文本字段中时,输入面板In-Place会出现。 系统默认使In-Place输入面板以悬停状态显示,除非输入面板已在展开状态下可见,在这种情况下,输入面板将保持展开状态。 将 DefaultInPlaceState 属性设置为 InPlaceState_Expanded 会导致In-Place输入面板始终显示展开,而不是首先显示输入面板图标,然后要求用户在“输入面板”展开之前点击输入面板图标。 其他两个选项是 InPlaceState_Auto,即系统默认行为和始终导致输入面板图标显示的 InPlaceState_HoverTarget 。 指定In-Place输入面板始终显示为展开的功能是 TextInputPanel 对象的新增功能,而使用 PenInputPanel 对象则无法实现。 下图显示了In-Place输入面板图标和面板的展开状态。

就地输入面板图标和展开状态

除了能够控制就地状态外,开发人员还可以通过获取 CurrentInPlaceState 属性来确定给定时刻的就地状态。 当输入面板不可见时, CurrentInPlaceState 等于 DefaultInPlaceState ,除非当 DefaultInPlaceState为InPlaceState_Auto 在这种情况下 ,CurrentInPlaceState 变为 InPlaceState_HoverTarget InPlaceVisibilityChanging / InPlaceVisibilityChanged 事件可用于跟踪In-Place输入面板的可见性状态。

最后,开发人员可以使用 SetInPlaceVisibility 方法强制隐藏或显示In-Place输入面板。 如果开发人员之前已设置 DefaultInPlaceState 属性,则强制显示时,输入面板将处于指定状态。 仅当焦点当前位于 TextInputPanel 对象所附加到的窗口中,并且用户未在另一个交互模式下打开输入面板(例如停靠或浮动)时,应用程序才允许隐藏或显示In-Place输入面板。 强制In-Place输入面板隐藏或显示的功能也是 TextInputPanel 对象的新增功能,无法使用 PenInputPanel 对象。

这些选项使应用程序开发人员可以精细地控制In-Place输入面板的显示时间和状态。 通过自定义默认的就地状态并独立于焦点更改控制就地可见性,应用程序开发人员可以在输入面板响应应用程序设置或用户输入应用程序时创建自定义工作流。

输入面板图标和输入面板的绝对位置

TextInputPanel 对象中最引人注目的新功能可能是In-Place输入面板的绝对定位。 借助这项新功能,应用程序开发人员可以确保In-Place输入面板不会与应用程序布局中的一个或多个关键视觉元素重叠。 使用 PenInputPanel 对象,可以根据偏移量将In-Place输入面板相对于文本字段进行定位,但是,输入面板仍会调整自身以保持在屏幕上。 在 Vista 中,应用程序首次可以使用屏幕坐标将In-Place输入面板定位在绝对位置。 此外,将输入面板保留在屏幕上的责任留给应用程序开发人员,因此消除了输入面板自动(看似随机)重新定位自身的可能性。

注意

本节中讨论的属性和方法仅适用于输入面板处于In-Place交互模式时。

 

绝对定位In-Place输入面板所需的两个主要方法是 SetInPlacePositionSetInPlaceHoverTargetPosition。 第一个用于指定In-Place输入面板的位置,第二个用于指定In-Place输入面板图标的位置。 如果应用程序选择仅设置输入面板图标位置,而不设置In-Place输入面板的位置,则In-Place输入面板将显示在系统确定的默认位置中。 同样,如果应用程序重新定位In-Place输入面板而不是输入面板图标,则输入面板图标将显示在默认位置。 位置在屏幕坐标中指定。 要定位的实际点是输入面板图标或输入面板的左上角,未展开更正组合。 当“更正梳”展开时,所定位的点不会更改。 (请参阅下面的图 2) In-Place输入面板和In-Place输入面板图标的位置没有限制,调用这些方法的应用程序有责任将它们保留在屏幕上。 这两种方法都是同步的,这意味着定位在方法返回之前发生。 如果输入面板已在浮动或停靠交互模式下打开,则尝试定位In-Place输入面板或In-Place输入面板图标失败。 此外,如果附加到 TextInputPanel 对象的窗口当前没有焦点,则方法会失败。

调用 SetInPlacePositionSetInPlaceHoverTargetPosition 不会自动显示In-Place输入面板或输入面板图标,只是在下次显示它们时设置位置。 调用 SetInPlaceVisibility 可用于强制立即显示它们。

就地输入面板的度量

定位In-Place输入面板计算是否离开屏幕可能有点棘手。 为了简化此过程, 可以使用 TextInputPanel 对象的多个属性来简化此过程。 这些属性和事件一起可用于确定In-Place输入面板在其所有状态下的确切大小:

  • InPlaceBoundingRectangle – 当显示当前输入语言的最大输入区域时,此属性为In-Place输入面板提供边界矩形。 如果“书写板”或“字符板”确定为最大的输入区域,则包括“插入”按钮的高度。 它不包括更正梳的高度。当In-Place输入面板自动增长时, 将触发 InPlaceSizeChanging / InPlaceSizeChanged 事件对,并且此属性的值将更新为包含其他写入区域或写入行。
  • PopUpCorrectionHeight – 此属性指定插入后更正梳位于输入面板上方时的高度。 若要获取弹出插入后更正梳的In-Place输入面板的完整高度,请将 InPlaceBoundingRectangle 的高度添加到 PopUpCorrectionHeight

作为设置In-Place输入面板和输入面板图标绝对位置的更简单方法,应用程序只需指定In-Place输入面板是否默认显示在文本输入字段上方或下方。 这样,就可以以更宽松的控制方式避免应用程序布局中的重叠元素。 为此,应用程序将 PreferredInPlaceDirection 设置为 InPlaceDirection_BottomInPlaceDirection_Top。 属性是首选项,因为In-Place输入面板会在必要时替代应用程序设置的首选项,以便在屏幕上保留输入面板。 系统默认在可能的情况下将In-Place输入面板置于文本字段下方,否则将它置于文本字段上方。 将 PreferredInPlaceDirection 设置为 InPlaceDirection_Auto 将还原系统默认值。

结合 TextInputPanel 对象的属性、方法和事件,开发人员能够对In-Place输入面板进行必要的控制,以便能够将In-Place输入面板和输入面板图标巧妙地放置在应用程序布局中,这样它们就不会中断布局流,在某些情况下,它们可能显示为集成。 这种新级别的控制是平板电脑应用程序设计的一大胜。

访问三个输入面板区域:书写板、字符板和键盘

输入面板有三个输入区域,即“书写板”、“字符板”和“键盘”。 使用 TextInputPanel 对象,应用程序可以指定打开输入面板时向用户显示的默认输入区域。 应用程序执行此操作main原因是将输入区域与特定字段的输入类型配对。 例如,“书写板”可能最适合用于填写批注字段,但键盘可能更便于输入同时包含数字和字母的产品序列号。 为了指定默认输入区域,应用程序将 DefaultInputArea 属性设置为 PanelInputArea 枚举定义的三个输入区域之一。 下图显示了三个输入区域。

写入、字符和键盘输入面板

系统默认输入区域是英语、法语、德语、西班牙语、意大利语、葡萄牙语、荷兰语和所有其他拉丁语输入语言的书写板。 对于东亚输入语言(包括日语、中文和朝鲜语),默认输入区域是“字符板”。 但是,当用户更改输入区域时,它会替代当前输入语言的默认输入区域,并存储为该输入语言的新默认值。 无论输入语言如何,键盘都是密码字段的默认输入区域,除非用户或组策略禁用了密码安全性。 在所有情况下,设置默认输入面板区域都以编程方式替代系统默认值,除非当前字段是密码字段,或者当前输入语言的手写识别器不支持以编程方式选择的输入区域。 将 DefaultInputArea 属性设置为 InPlaceDirection_Auto 可还原系统默认设置。

无论默认输入面板区域是否已以编程方式设置,用户都可选择在输入面板打开后更改当前输入面板区域。 用户更改当前输入区域后,用户选择将一直保留,直到输入面板关闭或用户再次更改所选内容。 输入面板关闭并重新打开后,以编程方式设置的默认输入区域将重新显示。

由于当前输入面板区域可能与默认输入面板区域不同,因此应用程序可以查询 CurrentInputArea 属性以确定当前可见的输入区域。 如果输入面板当前不可见,则当前输入区域等于默认输入区域。 CurrentInputArea 属性永远不会等于 PanelInputArea_Auto。 如果 DefaultInputArea 等于 PanelInputArea_Auto,则 CurrentInputArea 等于显示的最后一个输入区域;如果输入面板从未显示过,则等于当前输入语言的系统默认值。

PenInputPanel 对象和 TextInputPanel 对象的输入区域支持之间的主要区别在于,除了书写板和键盘之外,应用程序现在还可以选择将默认输入区域设置为字符板。

使用上述属性,应用程序可以控制不同字段中显示的输入面板输入区域,并优化用户的文本输入体验。 此外,应用程序可以保持对当前输入区域的感知,并根据哪个输入区域最适合当前用户任务做出条件性决策。

有关输入面板交互模式的详细信息

除了能够检测输入面板的当前输入区域,还可以检测当前交互模式:就地、停靠或浮动。 应用程序了解当前交互模式可能很重要,以了解用户与应用程序的交互方式,或者因为 TextInputPanel 对象的某些方法和属性仅适用于In-Place交互模式。 例如,在应用程序中,重新排列现有的用户界面元素,然后将In-Place输入面板置于其用户界面中应检查的空白区域,以确保在进行调整之前当前交互模式已就位。

停靠、浮动和节奏输入面板模式

TextInputPanel 对象的 CurrentInteractionMode 属性存储用户选择的当前交互模式。 InteractionMode 枚举将可能的模式定义为:

InteractionMode_InPlace – 在In-Place交互模式下,输入面板显示在当前具有焦点的文本输入字段旁边。 默认情况下,在文本输入字段中放置插入点时,将显示In-Place输入面板图标。 点击“输入面板”图标会导致“输入面板”展开。 仅当插入点位于可编辑字段中时,In-Place输入面板才可见。

InteractionMode_Floating – 浮动交互模式类似于 InPlace 交互模式,只不过它未绑定到插入点。 通过点击默认显示在屏幕左边缘的“输入面板”选项卡打开浮动输入面板。 “浮动输入面板”和“输入面板”选项卡都可以由用户拖动和重新定位。 在浮动模式下,输入面板的定位和控制完全留给用户。

InteractionMode_DockedTop – 在Docked-Top交互模式中,输入面板显示在屏幕顶部,活动桌面会调整大小,因此输入面板不会与其他任何窗口或 UI 元素重叠。 在停靠模式下,无法拖动或移动输入面板。

InteractionMode_DockedBottom – Docked-Bottom交互模式与Docked-Top模式相同,但输入面板显示在屏幕底部。

当输入面板不可见时,当前交互模式为就地。

发布当前交互模型是 TextInputPanel 对象提供输入面板状态信息的另一种方式,而不是任何以前版本中可用的信息。

有关输入面板的更正模式的详细信息

TextInputPanel 对象为你提供有关和控制的详细信息的输入面板的最后一个方面是更正模式。 了解更正模式可帮助应用程序确定输入面板的当前大小。 控制插入后更正在应用程序中的扩展方式是自定义应用程序中更正体验的一种方法。

修正组合可以显示两种基本模式:预插入和后插入。 预插入更正组合用于在将文本插入应用程序之前对其进行更正。 当用户墨迹书写时,点击在书写板中基线下方显示的挂起文本即可激活它。 插入后更正梳子用于在插入应用程序后更正文本。 它通过放置插入点或选择以前插入的文本来激活。 除了两种基本模式之外,插入后更正梳的显示方式还有几个变化。 首先,它可以显示在输入面板上方或下方,其次,它可以显示为折叠或展开。 在折叠状态下,插入后更正梳仅显示备用项列表。 在展开状态下,它包括替代项和用于重写单词的区域。

更正梳子、前插入和插入后输入面板

CurrentCorrectionMode 属性允许应用程序确定更正组合的当前配置。由 CorrectionMode 枚举定义的此属性的可能值为:NotVisiblePreInsertionPostInsertionCollapsedPostInsertionExpanded。 如果看不到任何输入面板或更正组合, 则 CurrentCorrectionMode“不可见”。

默认情况下,当 选择可更正文本时,系统将显示插入后更正梳展开,并在插入点置于可更正文本中时显示其折叠。 应用程序可以通过将 ExpandPostInsertionCorrection 属性设置为 true 来指定插入后更正组合应始终显示展开的位置。 系统默认值为 false。 当 ExpandPostInsertionCorrection 属性与 IHandWrittenTextInsertion 接口结合使用时,应用程序开发人员可以向不会自动获取它的应用程序添加更正支持。

跟踪和控制输入面板的更正状态是 TextInputPanel 对象的许多新功能之一,这些功能使输入面板和应用程序集成更加紧密。

事件发生之前和之后的事件通知

在 TextInputPanel 对象中大大改进的输入面板可编程性的另一个方面是事件模型。 现在,在更改发生之前和之后发送单独的事件,而不是仅引发指示输入面板状态更改的事件。 向事件开始发出信号的事件包含当前时态谓词(如“Changing”或“Inserting”),而表示事件结束的事件包含过去的时态谓词,例如“Changed”或“Inserted”。

此事件模型使应用程序可以在更改发生之前或发生更改时做出响应。 输入面板被阻止继续更改或在更改后恢复,直到所有事件的事件处理程序都已完成。 这些事件是同步的,这样一来,应用程序可以延迟更改,直到它完成响应。 但是,事件处理程序执行输入面板的时间对用户来说变得不可访问,并且可能显示为挂起,因此事件处理程序的性能良好非常重要。 但是,应用程序无法阻止或取消事件。 所有事件参数都是只读的。 下面是 TextInputPanel 对象的六个事件对的说明:

这些事件为应用程序提供有关输入面板中更改的基本信息,并允许它们做出相应的反应。 同样,输入面板事件模型中的更改表示在应用程序和输入面板之间更好地交互的一个步骤。

支持收集输入面板中输入的墨迹和文本

最后但并非最不重要的一点, TextInputPanel 对象的一个非常强大的新功能是,在文本插入应用程序时,能够从输入面板获取通过输入面板输入的文本的墨迹对象。 这是经常请求的功能,用于更改跟踪和记录保留。 它还允许应用程序将 UI 中的墨迹用作静态元素或自定义墨迹表面。

为了接收通过输入面板输入的文本的 InkDisp 对象,应用程序必须注册以接收 TextInputPanel 对象生成的 TextInsertingTextInserted 事件。 在文本从输入面板插入应用程序之前,将立即触发 TextInserting 事件,在完成所有事件处理程序之前,文本不会插入。 插入测试后立即触发 TextInserted 事件。 TextInsertingTextInserted 事件的唯一参数是 InkDisp 对象的数组,其中包含从输入面板插入的每一行文本的一个 InkDisp 对象。 注意:当事件处理程序正在运行时,输入面板处于非活动状态,并且用户可能显示为挂起,因此请务必减轻这些事件处理程序的重量并确保它们快速执行。 此外,应用程序不应为此事件创建处理程序,除非它具有特定信息用途,因为这样做会产生性能成本。 输入面板仅在有应用程序请求数据时封送墨迹数据,否则,输入面板可以跳过此成本高昂的操作。 TextInsertingTextInserted 事件的参数都是只读的,这意味着应用程序无法在插入到应用程序中之前更改插入的文本。

应用程序可以使用此新功能执行哪些操作的可能性非常广泛,而且使用起来再简单不过了。 允许应用程序收集通过输入面板输入的识别文本和墨迹,这是 Windows Vista 中改进输入面板开发人员故事的另一种方式。

结论

总体而言,在 Windows Vista 中引入了 TextInputPanel 对象,大大改进了平板电脑输入面板的可编程性。 通过使用 TextInputPanel 对象,应用程序开发人员可以更好地控制早期版本中的状态输入面板,并详细了解该面板的状态。 因此,强烈建议生成新的平板电脑应用程序或更新现有应用程序的应用程序开发人员使用 TextInputPanel 对象,而不是现在弃用的 PenInputPanel 对象。 此外,对输入面板和输入面板图标的绝对定位等新功能的支持,以及应用程序接收通过输入面板输入的识别器文本和墨迹的功能,也支持新的应用程序功能和方案。 包含这些功能和其他一些功能是针对开发人员反馈的直接响应,也是将输入面板与平板电脑应用程序完全集成的第一步。 最终,扩展平板电脑应用程序功能对于应用程序开发人员和平板电脑平台都是一大胜。