如何转换几何图形

若要转换几何图形,可以通过调用 SetTransform 将转换应用到呈现器目标,也可以通过调用 CreateTransformedGeometry 将转换应用到几何图形。 尽管这两种方法都可以转换几何图形,但它们有一些根本差异。 CreateTransformedGeometry 会影响填充,但不会影响笔划宽度。 此外, CreateTransformedGeometry 单独转换几何图形,而不会影响呈现目标上的其他形状,而 SetTransform 将转换应用于呈现目标上的所有形状。

本操作指南主题介绍如何通过调用 CreateTransformedGeometry 来转换几何图形。

转换几何图形

  1. 声明 ID2D1TransformedGeometry 变量。
  2. 调用 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
        );
}