Compartilhar via


Renderizando DirectWrite

Opções de renderização

Texto com formatação descrito por apenas um objeto IDWriteTextFormat pode ser renderizado com Direct2D, no entanto, há mais algumas opções para renderizar um objeto IDWriteTextLayout.

A cadeia de caracteres descrita por um objeto IDWriteTextLayout pode ser renderizada usando os métodos abaixo.

1. Renderizar usando Direct2D

Para renderizar um objeto IDWriteTextLayout usando Direct2D, use o método ID2D1RenderTarget::D rawTextLayout, conforme mostrado no código a seguir.

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Para obter uma visão mais detalhada do desenho de um objeto IDWriteTextLayout usando Direct2D, consulte Introdução com DirectWrite.

2. Renderizar usando um renderizador de texto personalizado.

Você renderiza com um renderizador personalizado usando o método IDWriteTextLayout::D raw , que usa uma interface de retorno de chamada derivada de IDWriteTextRenderer como um argumento, conforme mostrado no código a seguir.

// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
        NULL,
        pTextRenderer_,  // Custom text renderer.
        origin.x,
        origin.y
        );

O método IDWriteTextLayout::D raw chama os métodos do retorno de chamada do renderizador personalizado que você fornece. Os métodos DrawGlyphRun, DrawUnderline, DrawInlineObject e DrawStrikethrough executam as funções de desenho.

IDWriteTextRenderer declara métodos para desenhar uma execução de glifo, sublinhado, tachado e objetos embutidos. Cabe ao aplicativo implementar esses métodos. A criação de um renderizador de texto personalizado permite que o aplicativo aplique efeitos adicionais ao renderizar texto, como um preenchimento personalizado ou uma estrutura de tópicos. Um renderizador de texto personalizado de exemplo está incluído no exemplo de DirectWrite Olá, Mundo.

3. Renderize ClearType em uma superfície GDI.

A renderização para uma superfície GDI é, na verdade, um exemplo de uso de um renderizador de texto personalizado. No entanto, parte do trabalho é feito para você na forma da interface IDWriteBitmapRenderTarget .

Para criar essa interface, use o método IDWriteGdiInterop::CreateBitmapRenderTarget .

O método DrawGlyphRun do renderizador de texto personalizado chama o método IDWriteBitmapRenderTarget::D rawGlyphRun para desenhar os glifos. A renderização dos objetos sublinhados, tachados e embutidos deve ser feita pelo renderizador personalizado.

A interface IDWriteBitmapRenderTarget é renderizada para um DC (contexto de dispositivo) na memória. Você obtém um identificador para esse DC usando o método IDWriteBitmapRenderTarget::GetMemoryDC .

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

Depois que o desenho for executado, o DC de memória do objeto IDWriteBitmapRenderTarget deverá ser copiado para a superfície de GDI de destino.

Observação

Você também tem a opção de transferir o bitmap para outro tipo de superfície, como uma superfície GDI+.

 

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

Observação

Seu aplicativo tem a responsabilidade de renderizar tudo para a janela no final. Isso inclui texto e gráficos. Há uma penalidade de desempenho para isso. Além disso, a renderização para um DC de memória não é acelerada por hardware GDI.

 

Para obter uma visão geral mais detalhada da interoperação com o GDI, consulte Interoperando com GDI.

4. Renderize o texto em escala de cinza de forma transparente para um Surface GDI. (Windows 8 e posterior)

Começando em Windows 8, você pode renderizar o texto em escala de cinza de forma transparente para uma superfície GDI para melhor desempenho. Para fazer isso, você precisa:

  1. Limpe o DC de memória para transparente.
  2. Renderize o texto para o HDC de memória usando a suavização em escala de cinza (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Use a função AlphaBlend para renderizar a memória HDC de forma transparente sobre o HDC de destino final.
  4. Repita quantas vezes forem necessárias (digamos, uma vez por execução de glifo) e entre outros elementos gráficos podem ser renderizados diretamente para o HDC de destino final sem serem substituídos pela função AlphaBlend .
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  
        );

Renderizar usando Direct2D

Renderizar usando um renderizador de texto personalizado

Renderizar para uma superfície GDI

Interoperação com GDI