Share via


Zeichnen von Text

Verwenden Sie zum Zeichnen von Text mit Direct2D die ID2D1RenderTarget::D rawText-Methode für Text mit einem einzelnen Format. Oder verwenden Sie die ID2D1RenderTarget::D rawTextLayout-Methode für mehrere Formate, erweiterte OpenType-Features oder Treffertests. Diese Methoden verwenden die DirectWrite-API, um eine qualitativ hochwertige Textanzeige bereitzustellen.

Die DrawText-Methode

Verwenden Sie die DrawText-Methode , um Text mit einem einzelnen Format zu zeichnen. Um diese Methode zu verwenden, verwenden Sie zunächst eine IDWriteFactory, um eine IDWriteTextFormat-instance zu erstellen.

Der folgende Code erstellt ein IDWriteTextFormat-Objekt und speichert es in der variablen 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;
}

Da IDWriteFactory - und IDWriteTextFormat-Objektegeräteunabhängige Ressourcen sind, können Sie die Leistung einer Anwendung verbessern, indem Sie sie nur einmal erstellen, anstatt sie jedes Mal neu zu erstellen, wenn ein Frame gerendert wird.

Nachdem Sie das Textformatobjekt erstellt haben, können Sie es mit einem Renderziel verwenden. Der folgende Code zeichnet den Text mithilfe der DrawText-Methode des Renderziels (die m_pRenderTarget Variable).

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

Die DrawTextLayout-Methode

Die DrawTextLayout-Methode rendert ein IDWriteTextLayout-Objekt . Verwenden Sie diese Methode, um mehrere Formate auf einen Textblock anzuwenden (z. B. um einen Textteil zu unterstreichen), um erweiterte OpenType-Features zu verwenden oder Treffertests zu unterstützen.

Die DrawTextLayout-Methode bietet auch Leistungsvorteile für das wiederholte Zeichnen desselben Texts. Das IDWriteTextLayout-Objekt misst und legt seinen Text an, wenn Sie es erstellen. Wenn Sie ein IDWriteTextLayout-Objekt nur einmal erstellen und es jedes Mal wiederverwenden, wenn Sie den Text neu zeichnen müssen, verbessert sich die Leistung, da das System den Text nicht erneut messen und anordnen muss.

Bevor Sie die DrawTextLayout-Methode verwenden können, müssen Sie eine IDWriteFactory verwenden, um IDWriteTextFormat - und IDWriteTextLayout-Objekte zu erstellen. Nachdem diese Objekte erstellt wurden, rufen Sie die DrawTextLayout-Methode auf.

Weitere Informationen und Beispiele finden Sie in der Übersicht über Textformatierung und Layout .

Drawtext

DrawTextLayout

Idwritetextformat

Idwritetextlayout

Textformatierung und Layout