Sdílet prostřednictvím


Vykreslení na GDI Surface

V některých případech možná budete chtít zobrazit text DirectWrite na povrchu GDI. Rozhraní IDWriteBitmapRenderTarget zapouzdřuje rastrový obrázek a kontext zařízení pro zobrazení textu. Vytvoříte IDWriteBitmapRenderTarget pomocí metody IDWriteGdiInterop::CreateBitmapRenderTarget, jak je znázorněno v následujícím kódu.

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

Chcete-li vykreslit pomocí IDWriteBitmapRenderTarget, musíte implementovat vlastní rozhraní zpětného volání pro vykreslování textu, které je odvozené z rozhraní IDWriteTextRenderer. Je nutné implementovat metody pro kreslení běhu glifu, podtržení, přeškrtnutí, vložené objekty atd. Úplný seznam metod naleznete na referenční stránce IDWriteTextRenderer. Ne každá metoda musí být implementována, mohou pouze vrátit E_NOTIMPLa výkres bude pokračovat.

Text pak můžete nakreslit pomocí IDWriteTextLayout::Draw metody a předáním rozhraní zpětného volání, které jste implementovali jako parametr. Metoda IDWriteTextLayout::Draw volá metody zpětného volání vlastního vykreslovače, který poskytnete. DrawGlyphRun, DrawUnderline, DrawInlineObjecta DrawStrikethrough provádějí funkce kreslení.

Ve vaší implementaci DrawGlyphRunvolejte metodu IDWriteBitmapRenderTarget::DrawGlyphRun pro kreslení glyfů. Vykreslení podtržení, přeškrtnutí a vložených objektů musí provést váš vlastní renderer.

IDWriteBitmapRenderTarget::DrawGlyphRun má volitelný parametr RECT out, který obsahuje hranice oblasti, ve které byl text vykreslen. Pomocí těchto informací můžete nastavit ohraničující obdélník pro kontext zařízení pomocí funkce SetBoundsRect, kterou poskytuje GDI. Následující kód je příkladem implementace metody vlastního rendereru DrawGlyphRun.

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

Rozhraní IDWriteBitmapRenderTarget se v paměti vykreslí do kontextu zařízení (DC). K tomuto DC získáte popisovač pomocí metody IDWriteBitmapRenderTarget::GetMemoryDC. Jakmile se kreslení dokončí, je nutné zkopírovat paměťový DC objektu IDWriteBitmapRenderTarget do cílové plochy GDI.

Ohraničující obdélník můžete načíst pomocí funkce GetBoundsRect a potom pomocí ohraničujícího obdélníku s funkcí BitBlt zkopírovat vykreslený DirectWrite text z řadiče domény paměti na plochu GDI, jak je znázorněno v následujícím kódu.

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