若要转换几何图形,可以通过调用 SetTransform 将转换应用到呈现目标,也可以通过调用 CreateTransformedGeometry 将转换应用到几何图形。 尽管这两种方法都转换几何图形,但它们有一些根本差异。 CreateTransformedGeometry 会影响填充,但不会影响笔划宽度。 此外, CreateTransformedGeometry 仅在不影响呈现目标上其他形状的情况下转换几何图形, 而 SetTransform 将转换应用于呈现目标上的所有形状。
本作指南主题介绍如何通过调用 CreateTransformedGeometry 来转换几何图形。
转换几何图形
- 声明 ID2D1TransformedGeometry 变量。
- 调用 CreateTransformedGeometry 方法以创建转换后的几何图形。
以下代码演示如何创建一个沙漏,转换沙漏,并绘制原始和转换后的沙漏。
// Create a path geometry.
if (SUCCEEDED(hr))
{
hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);
if (SUCCEEDED(hr))
{
// Write to the path geometry using the geometry sink.
hr = m_pPathGeometry->Open(&pSink);
if (SUCCEEDED(hr))
{
pSink->BeginFigure(
D2D1::Point2F(0, 0),
D2D1_FIGURE_BEGIN_FILLED
);
pSink->AddLine(D2D1::Point2F(200, 0));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(150, 50),
D2D1::Point2F(150, 150),
D2D1::Point2F(200, 200))
);
pSink->AddLine(D2D1::Point2F(0, 200));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(50, 150),
D2D1::Point2F(50, 50),
D2D1::Point2F(0, 0))
);
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
hr = pSink->Close();
}
SafeRelease(&pSink);
}
}
if (SUCCEEDED(hr))
{
// Create a transformed geometry which is tilted at an angle to the previous geometry
hr = m_pD2DFactory->CreateTransformedGeometry(
m_pPathGeometry,
D2D1::Matrix3x2F::Rotation(
45.f,
D2D1::Point2F(100, 100)),
&m_pTransformedGeometry
);
}