剪辑 (DirectComposition)

注意

对于 Windows 10 上的应用,建议使用 Windows.UI.Composition API 而不是 DirectComposition。 有关详细信息,请参阅 使用可视化层实现桌面应用的现代化

剪裁通过将视觉对象或树的呈现限制为特定的矩形区域,提供了一种仅显示视觉对象或可视化树的一部分的方法。 本主题介绍 Microsoft DirectComposition 对剪裁视觉对象的支持。 它包括以下部分:

剪裁矩形

视觉对象具有 Clip 属性,该属性定义视觉对象的位图内容中的矩形区域或 剪裁矩形。 将视觉对象呈现到屏幕上时,仅在屏幕上绘制位于剪辑矩形内的位图内容部分,而延伸到剪辑矩形外的内容将剪裁 (不绘制) 。 默认情况下,Clip 属性包括所有位图内容。

视觉对象的 Clip 属性适用于所有子视觉对象和后代视觉对象。 换句话说,任何超出父级剪辑矩形边界的子内容或后代内容也会被剪裁。

DirectComposition 在应用 OffsetX、OffsetY 和 2D 转换属性之前应用 Clip 属性,但在应用 Effect 和 3D Transform 属性之后。 这意味着 2D 转换、OffsetX 和 OffsetY 将影响视觉内容和剪辑矩形。 而 3D 转换和效果将不适用于剪辑矩形。

例如,应用偏移量或 2D 转换时,剪裁矩形受转换矩阵的影响。 因此,添加偏移量和 2D 旋转 (45 度) 以及圆角剪裁矩形将导致:

显示剪裁矩形上 2d 转换效果的示意图。

在剪辑矩形中“内部”应用 3D 转换时,剪裁矩形不受转换矩阵的影响。 即使应用绕 Z 轴旋转 (实际上与前面的示例) 相同,下图也是结果:

显示 3d 转换不会影响矩形剪辑的示意图, (视觉对象在剪辑) 内旋转。

请注意,视觉对象在剪辑中旋转,因为 3D 矩阵不应用于剪辑本身。

如果 Clip 属性设置为空矩形,则视觉对象将完全剪裁;也就是说,视觉对象包含在可视化树中,但它不呈现任何内容。 如果不希望在合成中包含特定视觉对象,请从可视化树中删除该视觉对象,而不是设置空的剪辑矩形。 删除视觉对象可提高性能。

使用 IDCompositionVisual::SetClip 方法设置视觉对象的 Clip 属性。 此方法包含重载,使你能够将 Clip 属性的值设置为静态矩形或剪辑对象。 如果在视觉对象的生存期内不需要更改剪裁矩形的尺寸,请使用静态矩形。 如果确实需要更改尺寸或对剪辑矩形进行动画处理,请使用剪辑对象。

Clip 对象

剪辑对象是组件对象模型 (COM) 对象,表示剪裁矩形。 使用 IDCompositionDevice::CreateRectangleClip 方法创建剪辑对象,然后使用对象的 IDCompositionRectangleClip 接口设置对象的属性。 新创建的剪辑对象具有 Left 和 Top 属性的最小可能值,以及 Right 和 Bottom 属性的最大值,实际上使其成为无操作剪辑对象。 换句话说,对象表示一个剪辑矩形,该矩形将包含视觉对象的整个位图内容。

clip 对象包含一组属性,可用于指定剪辑对象的圆角。 使用属性可以设置剪裁对象每个角的 x 半径和 y 半径。

动画剪辑矩形

可以通过将动画对象应用于剪辑对象的 Left、Top、Right 和 Bottom 属性来对剪辑矩形进行动画处理。 使用 IDCompositionVisual::SetClip (IDCompositionClip) 重载方法将动画剪辑矩形应用于视觉对象的 Clip 属性。

有关动画对象的详细信息,请参阅 动画

DirectComposition 概念

如何使用矩形剪辑对象进行剪裁