Condividi tramite


Rendering DirectWrite

Opzioni di rendering

È possibile eseguire il rendering del testo con formattazione descritta solo da un oggetto IDWriteTextFormat con Direct2D, tuttavia, sono disponibili altre opzioni per il rendering di un oggetto IDWriteTextLayout.

È possibile eseguire il rendering della stringa descritta da un oggetto IDWriteTextLayout usando i metodi seguenti.

1. Eseguire il rendering con Direct2D

Per eseguire il rendering di un oggetto IDWriteTextLayout con Direct2D, usare il metodo ID2D1RenderTarget::DrawTextLayout, come illustrato nel codice seguente.

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Per un'analisi più approfondita del disegno di un oggetto IDWriteTextLayout tramite Direct2D, vedere Introduzione a DirectWrite.

2. Eseguire il rendering usando un renderer di testo personalizzato.

Viene eseguito il rendering con un renderer personalizzato usando il metodo IDWriteTextLayout::D raw, che accetta un'interfaccia di callback derivata da IDWriteTextRenderer come argomento, come illustrato nel codice seguente.

// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
        NULL,
        pTextRenderer_,  // Custom text renderer.
        origin.x,
        origin.y
        );

Il metodo IDWriteTextLayout::Draw chiama i metodi del renderer personalizzato che hai fornito. I DrawGlyphRun, DrawUnderline, DrawInlineObjecte DrawStrikethrough svolgono le funzioni di disegno.

IDWriteTextRenderer dichiara i metodi per disegnare una sequenza di glifi, sottolineature, barrature e oggetti incorporati. Spetta all'applicazione implementare questi metodi. La creazione di un renderer di testo personalizzato consente all'applicazione di applicare effetti aggiuntivi durante il rendering del testo, ad esempio un riempimento o una struttura personalizzata. Un renderer di testo personalizzato di esempio è incluso nell'esempio DirectWrite Hello World.

3. Eseguire il rendering di ClearType su una superficie GDI.

Il rendering in una superficie GDI è in realtà un esempio di uso di un renderer di testo personalizzato. Tuttavia, alcune operazioni vengono eseguite sotto forma di interfaccia IDWriteBitmapRenderTarget.

Per creare questa interfaccia, usare il metodo IDWriteGdiInterop::CreateBitmapRenderTarget.

Il metodo DrawGlyphRun del renderer di testo personalizzato chiama il metodo IDWriteBitmapRenderTarget::D rawGlyphRun per disegnare i glifi. La resa della sottolineatura, del barrato e degli oggetti in linea deve essere eseguita dal renderer personalizzato.

L'interfaccia IDWriteBitmapRenderTarget esegue il rendering verso un contesto di dispositivo (DC) in memoria. Per ottenere un handle per questo contesto dispositivo (DC), si utilizza il metodo IDWriteBitmapRenderTarget::GetMemoryDC.

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

Una volta eseguito il disegno, il controller di dominio di memoria del IDWriteBitmapRenderTarget oggetto deve essere copiato nella superficie GDI di destinazione.

Nota

È anche possibile trasferire la bitmap in un altro tipo di superficie, ad esempio una superficie GDI+.

 

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );

Nota

L'app ha la responsabilità di eseguire il rendering di tutti gli elementi nella finestra alla fine. Sono inclusi testo e grafica. C'è una penalità sulle prestazioni. Inoltre, il rendering in un contesto di dispositivo di memoria non è accelerato dall'hardware dell'interfaccia grafica GDI.

 

Per una panoramica più dettagliata dell'interoperabilità con GDI, consultare Interoperating with GDI.

4. Eseguire il rendering del testo in scala di grigi in modo trasparente su una superficie GDI. (Windows 8 e versioni successive)

A partire da Windows 8, è possibile eseguire il rendering trasparente del testo in scala di grigi in una superficie GDI per ottenere prestazioni migliori. A tale scopo, è necessario:

  1. Cancellare il contesto del dispositivo di memoria impostandolo su trasparente.
  2. Eseguire il rendering del testo nella memoria HDC usando l'anti-aliasing in scala di grigi (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Usare la funzioneAlphaBlend per eseguire il rendering trasparente della memoria HDC sopra l'HDC di destinazione finale.
  4. Ripetere quante volte necessario (ad esempio, una volta per ogni run di glifi) e nel frattempo il rendering di altre immagini può essere effettuato direttamente nell'HDC di destinazione finale senza che il rendering venga sovrascritto dalla funzione AlphaBlend.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

BLENDFUNCTION blendFunction = { 0 };  
blendFunction.BlendOp = AC_SRC_OVER;  
blendFunction.SourceConstantAlpha = 255;  
blendFunction.AlphaFormat = AC_SRC_ALPHA;

AlphaBlend(  
        hdc,  
        0, 0,  
        width, height,  
        pRT_->GetMemoryDC(),  
        0, 0,  
        width, height,  
        blendFunction  
        );

Renderizzare con Direct2D

eseguire il rendering con un renderer di testo personalizzato

Eseguire il rendering in una superficie GDI

l'interoperabilità con GDI