Delen via


Renderen naar een GDI-oppervlak

In sommige gevallen wilt u mogelijk DirectWrite tekst op een GDI-oppervlak weergeven. De IDWriteBitmapRenderTarget interface omvat een bitmap en apparaatcontext om tekst op weer te geven. U maakt een IDWriteBitmapRenderTarget- met behulp van de methode IDWriteGdiInterop::CreateBitmapRenderTarget, zoals wordt weergegeven in de volgende code.

if (SUCCEEDED(hr))
{
    hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}

Als u wilt weergeven met een IDWriteBitmapRenderTarget-, moet u een aangepaste callback-interface voor tekstweergave implementeren die is afgeleid van de interface IDWriteTextRenderer. U moet methoden implementeren voor het tekenen van een glyph-reeks, onderstreepte tekst, doorhalen, inline objecten, enzovoort. Zie de referentiepagina IDWriteTextRenderer voor een volledige lijst met methoden. Niet elke methode moet worden geïmplementeerd, ze kunnen gewoon E_NOTIMPLretourneren en tekenen wordt voortgezet.

Vervolgens kunt u de tekst renderen via de IDWriteTextLayout::Draw methode door de callback-interface die u als parameter hebt geïmplementeerd door te geven. Met de methode IDWriteTextLayout::Draw worden de methoden aangeroepen van de aangepaste render-callback die u opgeeft. De DrawGlyphRun, DrawUnderline, DrawInlineObjecten DrawStrikethrough methoden voeren de tekenfuncties uit.

Roep in uw implementatie van DrawGlyphRunde methode IDWriteBitmapRenderTarget::D rawGlyphRun methode aan om de glyphs te tekenen. De weergave van de onderstrepings-, doorhaal- en inline-objecten moet worden uitgevoerd door uw aangepaste renderer.

IDWriteBitmapRenderTarget::DrawGlyphRun heeft een optionele RECT out parameter die de grenzen bevat van het gebied waar de tekst is weergegeven. U kunt deze informatie gebruiken om de begrenzingsrechthoek voor de apparaatcontext in te stellen met de functie SetBoundsRect die wordt geleverd door GDI. De volgende code is een voorbeeld van de implementatie van de DrawGlyphRun methode van een aangepaste renderer.

STDMETHODIMP GdiTextRenderer::DrawGlyphRun(
    __maybenull void* clientDrawingContext,
    FLOAT baselineOriginX,
    FLOAT baselineOriginY,
    DWRITE_MEASURING_MODE measuringMode,
    __in DWRITE_GLYPH_RUN const* glyphRun,
    __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
    IUnknown* clientDrawingEffect
    )
{
    HRESULT hr = S_OK;

    // Pass on the drawing call to the render target to do the real work.
    RECT dirtyRect = {0};

    hr = pRenderTarget_->DrawGlyphRun(
        baselineOriginX,
        baselineOriginY,
        measuringMode,
        glyphRun,
        pRenderingParams_,
        RGB(0,200,255),
        &dirtyRect
        );
    

    return hr;
}

De IDWriteBitmapRenderTarget interface wordt weergegeven in een apparaatcontext (DC) in het geheugen. U krijgt een handvat naar deze DC door gebruik te maken van de IDWriteBitmapRenderTarget::GetMemoryDC methode. Zodra de tekening is uitgevoerd, moet de geheugen-DC van het IDWriteBitmapRenderTarget-object worden gekopieerd naar het GDI-doeloppervlak.

U kunt de begrenzingsrechthoek ophalen met behulp van de functie GetBoundsRect en vervolgens de begrenzingsrechthoek gebruiken met de functie BitBlt om de gerenderde DirectWrite tekst van de geheugen-DC naar het GDI-oppervlak te kopiëren, zoals wordt weergegeven in de volgende code.

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