转换 (DirectComposition)

注意

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

本主题介绍 Microsoft DirectComposition 对二维 (2D) 仿射(线性)转换的支持,并介绍 DirectComposition 支持的转换类型。

DirectComposition 还支持 3D 透视转换,但由于它们需要创建中间位图,DirectComposition 认为它们是效果而不是转换。 有关 3D 透视转换效果的信息,请参阅效果

本主题包含下列部分:

什么是 DirectComposition 2D 转换?

2D 转换使你可以通过将视觉对象移动到另一个位置(转换)、使其变大或变小(缩放)、翻转(旋转)或扭曲其形状(倾斜)来改变视觉对象在两个维度中的位置、大小或性质。

通过将视觉对象的点从一个位置映射到同一坐标空间中的另一个位置,或者从一个坐标空间映射到另一个坐标空间来实现 2D 转换。 此映射由一个名为转换矩阵的值表描述,该表定义为三行的集合,其中包含三列浮点值,如下表所示。

M11Default: 1.0
M21Default: 0.0
M31OffsetX: 0.0

M12Default: 0.0
M22Default: 1.0
M32OffsetY: 0.0

0.0
0.0
1.0

仿射 2D 转换的转换矩阵是一个 3 行 2 列矩阵,去除了上一个转换矩阵中的第三列。 下表显示此矩阵的布局。

M11Default: 1.0
M21Default: 0.0
M31OffsetX: 0.0

M12Default: 0.0
M22Default: 1.0
M32OffsetY: 0.0

注意

将 2D 转换应用于立体声内容时,DirectComposition 不会进行特殊处理。 这意味着在应用 2D 转换时,3D 内容可能会失真。

DirectComposition 2D 坐标空间

DirectComposition 使用左侧 2D 坐标空间;也就是说,正 x 轴值向右增加,正 y 轴值向下增加。 视觉对象相对于原点进行定位,即 x 轴和 y 轴相交 (0, 0),如下图所示。

左侧坐标空间的 x 轴和 y 轴

通过操作 3 行 2 列转换矩阵中的值,可以在两个维度中旋转、缩放、倾斜和转换对象。 例如,如果将 OffsetX 设置为 100,而 OffsetY 设置为 200,请将对象向右移动 100 像素并向下移动 200 像素。

支持仿射 2D 转换

下表描述了 DirectComposition 支持的仿射 2D 转换的类型,并列出了可用于执行各种类型的转换的接口。

转换/接口 说明 图示
旋转 2D IDCompositionRotateTransform 按指定角度围绕指定中心点旋转视觉对象。 正方形围绕原始正方形的中心顺时针旋转 45 度的插图
缩放 2D IDCompositionScaleTransform 按指定系数围绕指定中心点缩放视觉对象。 正方形放大 130% 的插图
倾斜 2D IDCompositionSkewTransform 沿 x 轴和 y 轴按指定角度并围绕指定的中心点倾斜视觉对象。 从 y 轴逆时针倾斜 30 度的正方形插图
转换 2D IDCompositionTranslateTransform 更改视觉对象在 x 轴和 y 轴方向的位置。 正方形沿正 x 轴移动 20 个单位,沿正 y 轴移动 10 个单位的插图

矩阵 2D 转换

通过 IDCompositionMatrixTransform 接口,你可以定义自己的 3 行 2 列仿射 2D 转换矩阵并将其应用于视觉对象。 如果需要应用无法通过其他 DirectComposition 转换接口提供的仿射 2D 转换类型,则此接口非常有用。 可以通过填充 D2D_MATRIX_3X2_F 结构并将其传递给 IDCompositionMatrixTransform::SetMatrix 方法来定义矩阵。

转换组

可以使用转换组将多个转换合并为一个转换。 转换组定义转换对象的集合,其矩阵按集合中指定的顺序相乘。 然后,生成的转换矩阵将应用于视觉对象。 转换组生成的结果与单独应用每个转换的结果相同。

请记住,转换组中转换对象的顺序非常重要。 例如,如果先旋转视觉对象,然后缩放视觉对象,再进行转换,则结果与先转换视觉对象,然后旋转,再缩放的结果不同。 DirectComposition 始终按照集合中指定的顺序将转换应用于视觉对象。

若要创建转换组,请先创建要包含在组中的转换对象,然后将转换对象指针数组传递给 IDCompositionDevice::CreateTransformGroup 方法。 创建转换组后,无法添加或删除任何转换对象。 但是,可以修改集合中各个转换对象的属性,这些更改将反映在生成的转换矩阵中。

转换动画

可以对转换的属性进行动画处理。 当对属性进行动画处理时,DirectComposition 会不断更改属性的值,而不是一次性更改所有属性的值。 创建转换时,这特别有用。 有关详细信息,请参阅动画