Bagikan melalui


Cara Menggambar dan Mengisi Bentuk Kompleks

Direct2D menyediakan antarmuka ID2D1PathGeometry untuk menjelaskan bentuk kompleks yang dapat berisi kurva, busur, dan garis. Topik ini menjelaskan cara menentukan dan merender geometri jalur.

Untuk menentukan geometri jalur, pertama-tama gunakan metode ID2D1Factory::CreatePathGeometry untuk membuat geometri jalur, lalu gunakan metode Buka geometri jalur untuk mengambil ID2D1GeometrySink. Anda kemudian dapat menambahkan garis, kurva, dan busur dengan memanggil berbagai metode Tambahkan sink.

Contoh berikut membuat ID2D1PathGeometry, mengambil sink, dan menggunakannya untuk menentukan bentuk hourglass.

ID2D1GeometrySink *pSink = NULL;

// 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);
    }
}

Perhatikan bahwa ID2D1PathGeometry adalah sumber daya independen perangkat dan dapat dibuat sekali dan dipertahankan selama masa pakai aplikasi. (Untuk informasi selengkapnya tentang berbagai jenis sumber daya, lihat Gambaran Umum Sumber Daya.)

Contoh berikutnya membuat dua kuas yang akan digunakan untuk melukis garis besar dan isi geometri jalur.

if (SUCCEEDED(hr))
{
    // Create a black brush.
    hr = m_pRenderTarget->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &m_pBlackBrush
        );
}

if (SUCCEEDED(hr))
{
    // Create a linear gradient.
    static const D2D1_GRADIENT_STOP stops[] =
    {
        {   0.f,  { 0.f, 1.f, 1.f, 0.25f }  },
        {   1.f,  { 0.f, 0.f, 1.f, 1.f }  },
    };

    hr = m_pRenderTarget->CreateGradientStopCollection(
        stops,
        ARRAYSIZE(stops),
        &pGradientStops
        );

    if (SUCCEEDED(hr))
    {
        hr = m_pRenderTarget->CreateLinearGradientBrush(
            D2D1::LinearGradientBrushProperties(
                D2D1::Point2F(100, 0),
                D2D1::Point2F(100, 200)),
            D2D1::BrushProperties(),
            pGradientStops,
            &m_pLGBrush
            );
    }

    SafeRelease(&pGradientStops);
}

Contoh terakhir menggunakan metode DrawGeometry dan FillGeometry untuk melukis kerangka dan interior geometri. Contoh ini menghasilkan output yang ditunjukkan dalam ilustrasi berikut.

ilustrasi geometri berbentuk jam kacamata

void DemoApp::RenderGeometryExample()
{
    // Translate subsequent drawings by 20 device-independent pixels.
    m_pRenderTarget->SetTransform(
        D2D1::Matrix3x2F::Translation(20.f, 20.f)
        );

    // Draw the hour glass geometry at the upper left corner of the client area.
    m_pRenderTarget->DrawGeometry(m_pPathGeometry, m_pBlackBrush, 10.f);
    m_pRenderTarget->FillGeometry(m_pPathGeometry, m_pLGBrush);
}

Kode telah dihilangkan dari contoh ini. Untuk informasi selengkapnya tentang geometri, lihat Gambaran Umum Geometri.