Freigeben über


Rendern auf einer GDI-Oberfläche

In einigen Fällen möchten Sie möglicherweise in der Lage sein, DirectWrite Text auf einer GDI-Oberfläche anzuzeigen. Die IDWriteBitmapRenderTarget-Schnittstelle kapselt eine Bitmap und einen Gerätekontext, auf dem Text gerendert werden soll. Sie erstellen eine IDWriteBitmapRenderTarget-Methode mit der IDWriteGdiInterop::CreateBitmapRenderTarget-Methode , wie im folgenden Code gezeigt.

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

Zum Rendern mit einem IDWriteBitmapRenderTarget müssen Sie eine benutzerdefinierte Textrenderer-Rückrufschnittstelle implementieren, die von der IDWriteTextRenderer-Schnittstelle abgeleitet ist. Sie müssen Methoden zum Zeichnen einer Glyphenausführung, zum Unterstreichen, durchgestrichen, zum Inlineobjekt usw. implementieren. Eine vollständige Liste der Methoden finden Sie auf der IDWriteTextRenderer-Referenzseite . Nicht jede Methode muss implementiert werden, sie kann einfach E_NOTIMPL zurückgeben, und das Zeichnen wird fortgesetzt.

Anschließend können Sie den Text mithilfe der IDWriteTextLayout::D raw-Methode zeichnen und die Rückrufschnittstelle übergeben, die Sie als Parameter implementiert haben. Die IDWriteTextLayout::D raw-Methode ruft die Methoden des von Ihnen bereitgestellten benutzerdefinierten Rendererrückrufs auf. Die Methoden DrawGlyphRun, DrawUnderline, DrawInlineObject und DrawStrikethrough führen die Zeichnungsfunktionen aus.

Rufen Sie in Ihrer Implementierung von DrawGlyphRun die IDWriteBitmapRenderTarget::D rawGlyphRun-Methode auf, um die Glyphen zu zeichnen. Das Rendern der Unterstreichungs-, Durchstreichungs- und Inlineobjekte muss von Ihrem benutzerdefinierten Renderer durchgeführt werden.

IDWriteBitmapRenderTarget::D rawGlyphRun verfügt über einen optionalen RECT out-Parameter, der die Grenzen des Bereichs enthält, in dem der Text gezeichnet wurde. Sie können diese Informationen verwenden, um das begrenzungsbezogene Rechteck für den Gerätekontext mit der von GDI bereitgestellten SetBoundsRect-Funktion festzulegen. Der folgende Code ist eine Beispielimplementierung der DrawGlyphRun-Methode eines benutzerdefinierten Renderers.

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

Die IDWriteBitmapRenderTarget-Schnittstelle wird in einem Gerätekontext (DC) im Arbeitsspeicher gerendert. Sie erhalten ein Handle für diesen DC, indem Sie die IDWriteBitmapRenderTarget::GetMemoryDC-Methode verwenden. Sobald die Zeichnung ausgeführt wurde, muss der Speicher dc des IDWriteBitmapRenderTarget-Objekts auf die GDI-Zieloberfläche kopiert werden.

Sie können das umgebende Rechteck mithilfe der GetBoundsRect-Funktion abrufen und dann das umgebende Rechteck mit der BitBlt-Funktion verwenden, um den gerenderten DirectWrite Text wie im folgenden Code dargestellt aus dem Speicher-DC auf die GDI-Oberfläche zu kopieren.

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