Representar en una superficie GDI
En algunos casos, puede mostrar DirectWrite texto en una superficie GDI. La interfaz IDWriteBitmapRenderTarget encapsula un mapa de bits y un contexto de dispositivo en los que se va a representar el texto. Puede crear un IDWriteBitmapRenderTarget mediante el método IDWriteGdiInterop::CreateBitmapRenderTarget , como se muestra en el código siguiente.
if (SUCCEEDED(hr))
{
hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}
Para representar con un IDWriteBitmapRenderTarget, debe implementar una interfaz de devolución de llamada del representador de texto personalizado derivada de la interfaz IDWriteTextRenderer . Debe implementar métodos para dibujar una ejecución de glifo, subrayado, tachado, objetos insertados, etc. Para obtener una lista completa de los métodos, consulte la página de referencia IDWriteTextRenderer . No todos los métodos deben implementarse, simplemente pueden devolver E_NOTIMPL y el dibujo continuará.
A continuación, puede dibujar el texto mediante el método IDWriteTextLayout::D raw y pasando la interfaz de devolución de llamada que implementó como parámetro. El método IDWriteTextLayout::D raw llama a los métodos de la devolución de llamada del representador personalizado que proporcione. Los métodos DrawGlyphRun, DrawUnderline, DrawInlineObject y DrawStrikethrough realizan las funciones de dibujo.
En la implementación de DrawGlyphRun, llame al método IDWriteBitmapRenderTarget::D rawGlyphRun para dibujar los glifos. El representador personalizado debe realizar la representación del subrayado, el tachado y los objetos insertados.
IDWriteBitmapRenderTarget::D rawGlyphRun tiene un parámetro de salida RECT opcional que contiene los límites del área donde se ha dibujado el texto. Puede usar esta información para establecer el rectángulo delimitador para el contexto del dispositivo con la función SetBoundsRect proporcionada por GDI. El código siguiente es una implementación de ejemplo del método DrawGlyphRun de un representador personalizado.
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;
}
La interfaz IDWriteBitmapRenderTarget se representa en un contexto de dispositivo (DC) en memoria. Para obtener un identificador para este controlador de dominio, use el método IDWriteBitmapRenderTarget::GetMemoryDC . En cuanto se haya realizado el dibujo, el controlador de dominio de memoria del objeto IDWriteBitmapRenderTarget debe copiarse en la superficie GDI de destino.
Puede recuperar el rectángulo delimitador mediante la función GetBoundsRect y, a continuación, usar el rectángulo delimitador con la función BitBlt para copiar el texto representado DirectWrite del controlador de dominio de memoria a la superficie de GDI, como se muestra en el código siguiente.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);