Udostępnij przez


Renderowanie na powierzchni GDI

W niektórych przypadkach możesz chcieć móc wyświetlić DirectWrite tekst na powierzchni GDI. Interfejs IDWriteBitmapRenderTarget hermetyzuje mapę bitową i kontekst urządzenia w celu renderowania tekstu. Utworzysz IDWriteBitmapRenderTarget przy użyciu IDWriteGdiInterop::CreateBitmapRenderTarget, jak pokazano w poniższym kodzie.

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

Aby renderować przy użyciu IDWriteBitmapRenderTarget, należy zaimplementować niestandardowy interfejs wywołania zwrotnego renderera tekstu, który jest dziedziczony z interfejsu IDWriteTextRenderer. Należy zaimplementować metody rysowania przebiegu glif, podkreślenie, przekreślenie, wbudowane obiekty itd. Aby uzyskać pełną listę metod, zobacz stronę referencyjną IDWriteTextRenderer. Nie każda metoda musi być zaimplementowana, mogą po prostu zwrócić E_NOTIMPLi rysunek będzie kontynuowany.

Następnie możesz wyświetlić tekst, używając metody IDWriteTextLayout::Draw i przekazując interfejs wywołania zwrotnego, który zaimplementowałeś jako parametr. Metoda IDWriteTextLayout::Draw wywołuje metody niestandardowego wywołania zwrotnego modułu renderowania, które podajesz. DrawGlyphRun, DrawUnderline, DrawInlineObjecti DrawStrikethrough wykonują funkcje rysunkowe metody.

W implementacji funkcji DrawGlyphRunwywołaj metodę IDWriteBitmapRenderTarget::DrawGlyphRun, aby narysować glify. Renderowanie podkreśleń, przekreśleń oraz obiektów inline musi być wykonywane przez Twój niestandardowy moduł renderujący.

IDWriteBitmapRenderTarget::DrawGlyphRun ma opcjonalny parametr RECT, który zawiera granice obszaru, w którym tekst został narysowany. Te informacje umożliwiają ustawienie prostokąta ograniczającego dla kontekstu urządzenia, korzystając z funkcji SetBoundsRect udostępnianej przez interfejs GDI. Poniższy kod to przykładowa implementacja metody DrawGlyphRun niestandardowego modułu renderowania.

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;
}

Interfejs IDWriteBitmapRenderTarget jest renderowany do kontekstu urządzenia (DC) w pamięci. Aby uzyskać dojście do tego kontrolera domeny, użyj metody IDWriteBitmapRenderTarget::GetMemoryDC. Po wykonaniu rysunku kontroler domeny pamięci IDWriteBitmapRenderTarget obiektu musi zostać skopiowany na docelową powierzchnię GDI.

Prostokąt ograniczenia można pobrać przy użyciu funkcji GetBoundsRect, a następnie użyć prostokąta ograniczenia z funkcją BitBlt, aby skopiować renderowany tekst DirectWrite z kontrolera domeny pamięci do powierzchni GDI, jak pokazano w poniższym kodzie.

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