Partager via


Comment dessiner du texte

Pour dessiner du texte avec Direct2D, utilisez la méthode ID2D1RenderTarget::D rawText pour le texte dont le format est unique. Vous pouvez également utiliser la méthode ID2D1RenderTarget::D rawTextLayout pour plusieurs formats, les fonctionnalités OpenType avancées ou les tests de positionnement. Ces méthodes utilisent l’API DirectWrite pour fournir un affichage de texte de haute qualité.

La méthode DrawText

Pour dessiner du texte au format unique, utilisez la méthode DrawText . Pour utiliser cette méthode, utilisez d’abord un IDWriteFactory pour créer un instance IDWriteTextFormat.

Le code suivant crée un objet IDWriteTextFormat et le stocke dans la variable 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;
}

Étant donné que les objets IDWriteFactory et IDWriteTextFormat sont des ressources indépendantes de l’appareil, vous pouvez améliorer les performances d’une application en les créant une seule fois, au lieu de les recréer chaque fois qu’une image est rendue.

Après avoir créé l’objet de format texte, vous pouvez l’utiliser avec une cible de rendu. Le code suivant dessine le texte à l’aide de la méthode DrawText de la cible de rendu (variable 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;
}

La méthode DrawTextLayout

La méthode DrawTextLayout restitue un objet IDWriteTextLayout . Utilisez cette méthode pour appliquer plusieurs formats à un bloc de texte (par exemple, souligner une partie du texte), utiliser des fonctionnalités OpenType avancées ou effectuer la prise en charge des tests de positionnement.

La méthode DrawTextLayout offre également des avantages en matière de performances pour dessiner le même texte à plusieurs reprises. L’objet IDWriteTextLayout mesure et expose son texte lorsque vous le créez. Si vous créez un objet IDWriteTextLayout une seule fois et que vous le réutilisez chaque fois que vous devez redessiner le texte, les performances s’améliorent, car le système n’a pas à mesurer et à réécrire le texte.

Avant de pouvoir utiliser la méthode DrawTextLayout , vous devez utiliser un IDWriteFactory pour créer des objets IDWriteTextFormat et IDWriteTextLayout . Une fois ces objets créés, appelez la méthode DrawTextLayout .

Pour plus d’informations et d’exemples, consultez vue d’ensemble de la mise en forme et de la disposition du texte .

DrawText

DrawTextLayout

IDWriteTextFormat

IDWriteTextLayout

Mise en forme et disposition du texte