Representación DirectWrite
Opciones de representación
Sin embargo, el texto con formato descrito por solo un objeto IDWriteTextFormat se puede representar con Direct2D; sin embargo, hay algunas opciones más para representar un objeto IDWriteTextLayout .
La cadena descrita por un objeto IDWriteTextLayout se puede representar mediante los métodos siguientes.
1. Representación mediante Direct2D
Para representar un objeto IDWriteTextLayout mediante Direct2D, use el método ID2D1RenderTarget::D rawTextLayout , como se muestra en el código siguiente.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Para obtener una visión más detallada del dibujo de un objeto IDWriteTextLayout mediante Direct2D, consulta Introducción con DirectWrite.
2. Representar con un representador de texto personalizado.
Se representa con un representador personalizado mediante el método IDWriteTextLayout::D raw , que toma una interfaz de devolución de llamada derivada de IDWriteTextRenderer como argumento, como se muestra en el código siguiente.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
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.
IDWriteTextRenderer declara métodos para dibujar un glifo de ejecución, subrayado, tachado y objetos insertados. Es necesario que la aplicación implemente estos métodos. La creación de un representador de texto personalizado permite a la aplicación aplicar efectos adicionales al representar texto, como un relleno personalizado o un contorno. Se incluye un representador de texto personalizado de ejemplo en el ejemplo de DirectWrite Hola mundo.
3. Representar ClearType en una superficie GDI.
La representación en una superficie GDI es en realidad un ejemplo de uso de un representador de texto personalizado. Sin embargo, parte del trabajo se realiza por usted en forma de la interfaz IDWriteBitmapRenderTarget .
Para crear esta interfaz, use el método IDWriteGdiInterop::CreateBitmapRenderTarget .
El método DrawGlyphRun del representador de texto personalizado llama 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.
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 .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Una vez realizado el dibujo, el controlador de dominio de memoria del objeto IDWriteBitmapRenderTarget debe copiarse en la superficie GDI de destino.
Nota
También tiene la opción de transferir el mapa de bits a otro tipo de superficie, como una superficie GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Nota
La aplicación tiene la responsabilidad de representar todo en la ventana al final. Esto incluye texto y gráficos. Hay una penalización de rendimiento para esto. Además, la representación en un controlador de dominio de memoria no está acelerada por hardware GDI.
Para obtener información general más detallada sobre la interoperación con GDI, consulte Interoperación con GDI.
4. Representar texto de escala de grises de forma transparente en una superficie GDI. (Windows 8 y versiones posteriores)
A partir de Windows 8, puede representar texto de escala de grises de forma transparente en una superficie GDI para mejorar el rendimiento. Para ello, debe hacer lo siguiente:
- Borre el controlador de dominio de memoria en transparente.
- Representar texto en la memoria HDC mediante suavizado de contorno de escala de grises (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Use la función AlphaBlend para representar la memoria HDC de forma transparente sobre la HDC de destino final.
- Repita tantas veces como sea necesario (por ejemplo, una vez por cada glifo ejecutado) y entre otros gráficos se puede representar directamente en el HDC de destino final sin que la función AlphaBlend sobrescriba.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
BLENDFUNCTION blendFunction = { 0 };
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = 255;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(
hdc,
0, 0,
width, height,
pRT_->GetMemoryDC(),
0, 0,
width, height,
blendFunction
);
Temas relacionados