Condividi tramite


Come disegnare testo

Per disegnare testo con Direct2D, usare il metodo ID2D1RenderTarget::D rawText per il testo con un singolo formato. In alternativa, usare il metodo ID2D1RenderTarget::D rawTextLayout per più formati, funzionalità OpenType avanzate o hit testing. Questi metodi usano l'API DirectWrite per fornire una visualizzazione di testo di alta qualità.

Metodo DrawText

Per disegnare testo con un singolo formato, usare il metodo DrawText . Per usare questo metodo, usare prima di tutto un IDWriteFactory per creare un'istanza IDWriteTextFormat .

Il codice seguente crea un oggetto IDWriteTextFormat e lo archivia nella variabile 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;
}

Poiché gli oggetti IDWriteFactory e IDWriteTextFormat sono risorse indipendenti dal dispositivo, è possibile migliorare le prestazioni di un'applicazione creandole una sola volta, anziché ricrearle ogni volta che viene eseguito il rendering di un frame.

Dopo aver creato l'oggetto formato di testo, è possibile usarlo con una destinazione di rendering. Il codice seguente disegna il testo usando il metodo DrawText della destinazione di rendering (la variabile 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;
}

Metodo DrawTextLayout

Il metodo DrawTextLayout esegue il rendering di un oggetto IDWriteTextLayout . Usare questo metodo per applicare più formati a un blocco di testo ,ad esempio la sottolineatura di una parte del testo, per usare funzionalità OpenType avanzate o per eseguire il supporto di hit testing.

Il metodo DrawTextLayout offre anche vantaggi per le prestazioni per il disegno dello stesso testo ripetutamente. L'oggetto IDWriteTextLayout misura e imposta il testo quando lo si crea. Se si crea un oggetto IDWriteTextLayout una sola volta e lo si riutilizza ogni volta che è necessario ridisegnare il testo, le prestazioni migliorano perché il sistema non deve misurare e riscrivere nuovamente il testo.

Prima di poter usare il metodo DrawTextLayout, è necessario usare UN IDWriteFactory per creare oggetti IDWriteTextFormat e IDWriteTextLayout. Dopo aver creato questi oggetti, chiamare il metodo DrawTextLayout .

Per altre informazioni ed esempi, vedere panoramica di Formattazione del testo e Layout .

Drawtext

DrawTextLayout

IDWriteTextFormat

IDWriteTextLayout

Formattazione e layout del testo