Sdílet prostřednictvím


Vykreslování DirectWrite

Možnosti vykreslování

Text s formátováním, které popisuje pouze objekt IDWriteTextFormat lze vykreslit pomocí Direct2D, ale existuje několik dalších možností pro vykreslení IDWriteTextLayout objektu.

Řetězec, popsaný objektem IDWriteTextLayout, lze vykreslit pomocí níže uvedených metod.

1. Vykreslení pomocí Direct2D

Pokud chcete vykreslit objekt IDWriteTextLayout pomocí Direct2D, použijte metodu ID2D1RenderTarget::DrawTextLayout, jak je znázorněno v následujícím kódu.

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

Podrobnější pohled na vykreslení objektu IDWriteTextLayout pomocí Direct2Dnajdete v tématu Začínáme s rozhraním DirectWrite.

2. Vykreslení pomocí vlastního rendereru textu

Vykreslování s vlastním rendererem pomocí metody IDWriteTextLayout::Draw, která přijímá rozhraní zpětného volání odvozené z IDWriteTextRenderer jako argument, jak je znázorněno v následujícím kódu.

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

Metoda IDWriteTextLayout::Draw volá metody zpětného volání vámi poskytnutého vlastního rendereru. DrawGlyphRun, DrawUnderline, DrawInlineObjecta DrawStrikethrough jsou metody kreslení, které provádějí funkce kreslení.

IDWriteTextRenderer deklaruje metody pro vykreslování běhu glyfů, podtržení, přeškrtnutí a vložených objektů. Je na aplikaci, která tyto metody implementuje. Vytvoření vlastního rendereru textu umožňuje aplikaci použít při vykreslování textu další efekty, například vlastní výplň nebo obrys. Ukázkový vlastní textový renderer je součástí DirectWrite Hello World Sample.

3. Vykreslit ClearType na povrch GDI.

Vykreslování na plochu GDI je ve skutečnosti příkladem použití vlastního rendereru textu. Některé práce se však provádí za vás ve formě rozhraní IDWriteBitmapRenderTarget.

Chcete-li vytvořit toto rozhraní, použijte IDWriteGdiInterop::CreateBitmapRenderTarget metoda.

Metoda DrawGlyphRun ve vašem vlastním textovém rendereru volá metodu IDWriteBitmapRenderTarget::DrawGlyphRun pro vykreslení glyfů. Vykreslování podtržení, přeškrtnutí a vložených objektů musí provádět váš vlastní renderer.

Rozhraní IDWriteBitmapRenderTarget se v paměti vykreslí do kontextu zařízení (DC). K získání popisovače pro tento DC použijte metodu IDWriteBitmapRenderTarget::GetMemoryDC.

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

Po provedení výkresu musí být paměť DC objektu IDWriteBitmapRenderTarget zkopírována do cílové plochy GDI.

Poznámka

Máte také možnost přenést rastrový obrázek na jiný typ povrchu, například povrch GDI+.

 

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

Poznámka

Vaše aplikace má odpovědnost za vykreslení všeho do okna na konci. To zahrnuje text a grafiku. Je to trest za výkon. Kromě toho není vykreslování do paměťového kontextu zařízení akcelerováno hardwarem GDI.

 

Podrobnější přehled spolupráce s GDI najdete v tématu Spolupráce sGDI .

4. Průhledně vykreslujte šedý text na povrch GDI. (Windows 8 a novější)

Od Windows 8 můžete text ve stupních šedé zobrazit transparentně na plochu GDI, aby se zlepšil výkon. K tomu potřebujete:

  1. Vymažte řadič domény paměti tak, aby byl průhledný.
  2. Vykreslení textu do paměti HDC pomocí antialiasingu ve stupních šedé (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Pomocí funkce AlphaBlend provádějte transparentní vykreslování paměti HDC nad konečným cílovým HDC.
  4. Opakujte tolikrát, kolikrát je to nutné (řekněme, jednou za glyf) a mezi jinými grafickými objekty se můžou vykreslit přímo do konečného cílového HDC bez přepsání funkcí 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  
        );

Vykreslení pomocí Direct2D

Vykreslit pomocí vlastního vykreslovače textu

vykreslit na povrch GDI

spolupráce s GDI