Bagikan melalui


Cara Menggambar Teks

Untuk menggambar teks dengan Direct2D, gunakan metode ID2D1RenderTarget::D rawText untuk teks yang memiliki satu format. Atau, gunakan metode ID2D1RenderTarget::D rawTextLayout untuk beberapa format, fitur OpenType tingkat lanjut, atau pengujian hit. Metode ini menggunakan API DirectWrite untuk menyediakan tampilan teks berkualitas tinggi.

Metode DrawText

Untuk menggambar teks yang memiliki satu format, gunakan metode DrawText . Untuk menggunakan metode ini, pertama-tama gunakan IDWriteFactory untuk membuat instans IDWriteTextFormat .

Kode berikut membuat objek IDWriteTextFormat dan menyimpannya dalam variabel m_pTextFormat .

// Create resources which are not bound
// to any device. Their lifetime effectively extends for the
// duration of the app. These resources include the Direct2D and
// DirectWrite factories,  and a DirectWrite Text Format object
// (used for identifying particular font characteristics).
//
HRESULT DemoApp::CreateDeviceIndependentResources()
{
    static const WCHAR msc_fontName[] = L"Verdana";
    static const FLOAT msc_fontSize = 50;
    HRESULT hr;

    // Create a Direct2D factory.
    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory);

    if (SUCCEEDED(hr))
    {        
        // Create a DirectWrite factory.
        hr = DWriteCreateFactory(
            DWRITE_FACTORY_TYPE_SHARED,
            __uuidof(m_pDWriteFactory),
            reinterpret_cast<IUnknown **>(&m_pDWriteFactory)
            );
    }
    if (SUCCEEDED(hr))
    {
        // Create a DirectWrite text format object.
        hr = m_pDWriteFactory->CreateTextFormat(
            msc_fontName,
            NULL,
            DWRITE_FONT_WEIGHT_NORMAL,
            DWRITE_FONT_STYLE_NORMAL,
            DWRITE_FONT_STRETCH_NORMAL,
            msc_fontSize,
            L"", //locale
            &m_pTextFormat
            );
    }
    if (SUCCEEDED(hr))
    {
        // Center the text horizontally and vertically.
        m_pTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
        
        m_pTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
    }

    return hr;
}

Karena objek IDWriteFactory dan IDWriteTextFormat adalah sumber daya independen perangkat, Anda dapat meningkatkan performa aplikasi hanya dengan membuatnya satu kali, alih-alih membuatnya kembali setiap kali bingkai dirender.

Setelah membuat objek format teks, Anda dapat menggunakannya dengan target render. Kode berikut menggambar teks dengan menggunakan metode DrawText dari target render (variabel m_pRenderTarget ).

//  Called whenever the application needs to display the client
//  window. This method writes "Hello, World"
//
//  Note that this function will automatically discard device-specific
//  resources if the Direct3D device disappears during function
//  invocation, and will recreate the resources the next time it's
//  invoked.
//
HRESULT DemoApp::OnRender()
{
    HRESULT hr;

    hr = CreateDeviceResources();

    if (SUCCEEDED(hr))
    {
        static const WCHAR sc_helloWorld[] = L"Hello, World!";

        // Retrieve the size of the render target.
        D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();

        m_pRenderTarget->BeginDraw();

        m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        m_pRenderTarget->DrawText(
            sc_helloWorld,
            ARRAYSIZE(sc_helloWorld) - 1,
            m_pTextFormat,
            D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
            m_pBlackBrush
            );

        hr = m_pRenderTarget->EndDraw();

        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    }

    return hr;
}

Metode DrawTextLayout

Metode DrawTextLayout merender objek IDWriteTextLayout . Gunakan metode ini untuk menerapkan beberapa format ke blok teks (seperti menggaris bawahi bagian teks), untuk menggunakan fitur OpenType tingkat lanjut, atau untuk melakukan dukungan pengujian hit.

Metode DrawTextLayout juga memberikan manfaat performa untuk menggambar teks yang sama berulang kali. Objek IDWriteTextLayout mengukur dan menjabarkan teksnya saat Anda membuatnya. Jika Anda membuat objek IDWriteTextLayout hanya satu kali dan menggunakannya kembali setiap kali Anda harus menggambar ulang teks, performa meningkat karena sistem tidak perlu mengukur dan menata ulang teks.

Sebelum anda dapat menggunakan metode DrawTextLayout , Anda harus menggunakan IDWriteFactory untuk membuat objek IDWriteTextFormat dan IDWriteTextLayout . Setelah objek ini dibuat, panggil metode DrawTextLayout .

Untuk informasi dan contoh selengkapnya, lihat Gambaran umum Pemformatan Teks dan Tata Letak .

DrawText

DrawTextLayout

IDWriteTextFormat

IDWriteTextLayout

Pemformatan dan Tata Letak Teks