Dela via


Återgivning av DirectWrite

Återgivningsalternativ

Text med formatering som endast beskrivs av ett IDWriteTextFormat-objekt kan återges med Direct2D-, men det finns några fler alternativ för att återge ett IDWriteTextLayout- objekt.

Strängen som beskrivs av ett IDWriteTextLayout- objekt kan återges med hjälp av metoderna nedan.

1. Rendera med Direct2D

Om du vill återge ett IDWriteTextLayout--objekt med Direct2D använder du metoden ID2D1RenderTarget::DrawTextLayout, enligt följande kodexempel.

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

En mer ingående titt på hur du ritar ett IDWriteTextLayout--objekt med hjälp av Direct2D-finns i Komma igång med DirectWrite.

2. Rendera med en anpassad textåtergivning.

Du renderar med en anpassad renderare genom att använda metoden IDWriteTextLayout::Draw, som tar ett återanropsgränssnitt som härleds från IDWriteTextRenderer som ett argument, som visas i följande kod.

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

Metoden IDWriteTextLayout::Draw anropar metoderna i den anpassade renderaranrop du tillhandahåller. Metoderna DrawGlyphRun, DrawUnderline, DrawInlineObjectoch DrawStrikethrough utför ritningsfunktionerna.

IDWriteTextRenderer deklarerar metoder för att rita en glyfsekvens, understrykning, genomstrykning och inlinjeobjekt. Det är upp till programmet att implementera dessa metoder. Genom att skapa en anpassad textåtergivning kan programmet tillämpa ytterligare effekter vid återgivning av text, till exempel en anpassad fyllning eller disposition. Ett exempel på anpassad textåtergivning ingår i DirectWrite Hello World Sample.

3. Rendera ClearType till en GDI-yta.

Återgivning till en GDI-yta är faktiskt ett exempel på hur du använder en anpassad textåtergivning. En del av arbetet görs dock åt dig i form av IDWriteBitmapRenderTarget-gränssnittet.

Om du vill skapa det här gränssnittet använder du metoden IDWriteGdiInterop::CreateBitmapRenderTarget.

Metoden DrawGlyphRun för den anpassade textåtergivningen anropar metoden IDWriteBitmapRenderTarget::DrawGlyphRun för att rita glyferna. Återgivningen av understrykning, genomstrykning och infogade objekt måste göras av din anpassade renderare.

IDWriteBitmapRenderTarget-gränssnittet återges till en enhetskontext (DC) i minnet. Du får en referens till den här domänkontrollanten med hjälp av metoden IDWriteBitmapRenderTarget::GetMemoryDC.

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

När ritningen har utförts måste minnes-DC för IDWriteBitmapRenderTarget objekt kopieras till mål-GDI-ytan.

Not

Du kan också överföra bitmappen till en annan typ av yta, till exempel en GDI+-yta.

 

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

Notera

Din applikation har ansvaret för att rendera allt till fönstret till slut. Detta omfattar text och grafik. Det finns en prestationspåverkan för detta. Dessutom är återgivning till en minnes-DC inte GDI-maskinvaruaccelererad.

 

En mer detaljerad översikt över samverkan med GDI finns i Interoperating with GDI.

4. Rendera gråskaletext transparent till en GDI-yta. (Windows 8 och senare)

Från och med Windows 8 kan du återge text i gråskala transparent till en GDI-yta för bättre prestanda. För att göra detta måste du:

  1. Rensa minnes-DC för att göra det genomskinligt.
  2. Rendera text i minnes-HDC med hjälp av gråskaleutjämning (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Använd funktionen AlphaBlend för att återge minnets HDC transparent ovanpå det slutliga målets HDC.
  4. Upprepa så många gånger som det behövs (t.ex. en gång per glyfsekvens) och andra grafikobjekt kan renderas direkt till den slutliga HDC utan att skrivas över av funktionen 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  
        );

Rendera med Direct2D

Rendera med hjälp av en Anpassad Textrenderare

Rendera till en GDI-yta

Samverka med GDI-