Compartilhar via


Formatação de Texto e Layout

DirectWrite fornece duas interfaces para formatação de texto: IDWriteTextFormat e IDWriteTextLayout. IDWriteTextFormat descreve apenas o formato do texto e é usado em casos em que uma cadeia de caracteres inteira deve ter o mesmo tamanho de fonte, estilo, peso e assim por diante. Por outro lado, IDWriteTextLayout encapsula uma cadeia de caracteres de texto e a formatação para intervalos especificados da cadeia de caracteres. Este documento descreve cada interface e seus usos. Para obter mais informações sobre a criação e os métodos dessas interfaces, consulte as páginas de referência IDWriteTextFormat e IDWriteTextLayout .

Este documento contém as seguintes partes:

IDWriteTextFormat

Um objeto IDWriteTextFormat é usado para:

  • Descreva o formato de uma cadeia de caracteres inteira ao renderizar. Para renderizar uma cadeia de caracteres com vários formatos, use um objeto IDWriteTextLayout .
  • Especifique o formato de texto padrão ao criar um objeto IDWriteTextLayout .

Para criar um objeto IDWriteTextFormat , use o método IDWriteFactory::CreateTextFormat e especifique a família de fontes, a coleção de fontes, o peso da fonte, o tamanho da fonte (em DIPs), o nome da localidade.

Modificando um IDWriteTextFormat

Depois que uma interface IDWriteTextFormat é criada, alguns valores não podem ser alterados: a família de fontes, a coleção, o peso e o tamanho, bem como o nome da localidade. Para alterar esses valores, um novo objeto IDWriteTextFormat deve ser criado.

IDWriteTextLayout permite que você altere as propriedades acima sem recriar nada. IDWriteTextFormat permite que você faça alterações de formato que se aplicam ao texto inteiro, como alinhamento de texto. Se você quiser aplicar a formatação a intervalos de caracteres específicos, faça isso usando um IDWriteTextLayout.

IDWriteTextFormat fornece métodos para definir o alinhamento do texto, a direção do fluxo, a parada de tabulação incremental, o espaçamento de linha, o alinhamento do parágrafo, o corte e o encapsulamento de palavras. Essas propriedades podem ser alteradas a qualquer momento após a criação do objeto IDWriteTextFormat .

IDWriteTextLayout

A interface IDWriteTextLayout , ao contrário de IDWriteTextFormat, representa um bloco de texto e a formatação associada. IDWriteTextFormat representa informações de formatação iniciais. O exemplo a seguir mostra como criar um objeto IDWriteTextLayout usando IDWriteFactory::CreateTextLayout.

// Create a text layout using the text format.
if (SUCCEEDED(hr))
{
    RECT rect;
    GetClientRect(hwnd_, &rect); 
    float width  = rect.right  / dpiScaleX_;
    float height = rect.bottom / dpiScaleY_;

    hr = pDWriteFactory_->CreateTextLayout(
        wszText_,      // The string to be laid out and formatted.
        cTextLength_,  // The length of the string.
        pTextFormat_,  // The text format to apply to the string (contains font information, etc).
        width,         // The width of the layout box.
        height,        // The height of the layout box.
        &pTextLayout_  // The IDWriteTextLayout interface pointer.
        );
}

O texto em um objeto IDWriteTextLayout não pode ser alterado depois que o objeto é criado. Para alterar o texto, você deve excluir o objeto existente e criar um novo objeto IDWriteTextLayout .

Você pode usar um IDWriteTextLayout para formatar intervalos de texto especificados. IDWriteTextLayout também fornece métodos para alterar o estilo e o peso da fonte e adicionar recursos de fonte OpenType e teste de clique. Para obter mais informações e uma lista completa de métodos, consulte a página de referência IDWriteTextLayout .

Formatar um intervalo de texto

IDWriteTextLayout fornece vários métodos para formatar intervalos de texto. Cada um desses métodos usa uma estrutura DWRITE_TEXT_RANGE como um parâmetro para especificar a posição de texto inicial dentro da cadeia de caracteres e o comprimento do intervalo a ser formatado. O exemplo a seguir mostra como definir o peso da fonte de um intervalo de texto como negrito.

// Set the font weight to bold for the first 5 letters.
DWRITE_TEXT_RANGE textRange = {0, 5};

if (SUCCEEDED(hr))
{
    hr = pTextLayout_->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, textRange);
}

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. Renderize usando Direct2D.
  2. Renderize usando um renderizador de texto personalizado.
  3. Renderize para uma superfície GDI.