Formato y diseño de texto
DirectWrite proporciona dos interfaces para dar formato al texto: IDWriteTextFormat e IDWriteTextLayout. IDWriteTextFormat describe solo el formato del texto y se usa en los casos en los que una cadena completa tiene el mismo tamaño de fuente, estilo, peso, etc. Por otro lado, IDWriteTextLayout encapsula una cadena de texto y el formato de los intervalos especificados de la cadena. En este documento se describe cada interfaz y sus usos. Para obtener más información sobre la creación y los métodos de estas interfaces, vea las páginas de referencia IDWriteTextFormat e IDWriteTextLayout .
Este documento contiene las siguientes partes:
IDWriteTextFormat
Se usa un objeto IDWriteTextFormat para:
- Describir el formato de una cadena completa al representar. Para representar una cadena con varios formatos, use un objeto IDWriteTextLayout .
- Especifique el formato de texto predeterminado al crear un objeto IDWriteTextLayout .
Para crear un objeto IDWriteTextFormat , use el método IDWriteFactory::CreateTextFormat y especifique la familia de fuentes, la colección de fuentes, el peso de fuente, el tamaño de fuente (en DIP), el nombre de la configuración regional.
Modificar un IDWriteTextFormat
Una vez creada una interfaz IDWriteTextFormat , no se pueden cambiar algunos valores: la familia de fuentes, la colección, el peso y el tamaño, así como el nombre de la configuración regional. Para cambiar estos valores, se debe crear un nuevo objeto IDWriteTextFormat .
IDWriteTextLayout permite cambiar las propiedades anteriores sin volver a crear nada. IDWriteTextFormat permite realizar cambios de formato que se aplican a todo el texto, como la alineación del texto. Si desea aplicar formato a intervalos de caracteres específicos, debe hacerlo mediante un IDWriteTextLayout.
IDWriteTextFormat proporciona métodos para establecer la alineación del texto, la dirección del flujo, la tabulación incremental, el espaciado de línea, la alineación de párrafos, el recorte y el ajuste de palabras. Estas propiedades se pueden cambiar en cualquier momento después de la creación del objeto IDWriteTextFormat .
IDWriteTextLayout
La interfaz IDWriteTextLayout , a diferencia de IDWriteTextFormat, representa un bloque de texto y el formato asociado. IDWriteTextFormat representa información de formato inicial. En el ejemplo siguiente se muestra cómo crear un objeto IDWriteTextLayout mediante 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.
);
}
El texto de un objeto IDWriteTextLayout no se puede cambiar una vez creado el objeto. Para cambiar el texto, debe eliminar el objeto existente y crear un nuevo objeto IDWriteTextLayout .
Puede usar un IDWriteTextLayout para dar formato a intervalos de texto especificados. IDWriteTextLayout también proporciona métodos para cambiar el estilo de fuente y el peso, y agregar características de fuente OpenType y pruebas de posicionamiento. Para obtener más información y una lista completa de métodos, vea la página de referencia IDWriteTextLayout .
Aplicar formato a un intervalo de texto
IDWriteTextLayout proporciona varios métodos para dar formato a intervalos de texto. Cada uno de estos métodos toma una estructura de DWRITE_TEXT_RANGE como parámetro para especificar la posición de texto inicial dentro de la cadena y la longitud del intervalo al que se va a dar formato. En el ejemplo siguiente se muestra cómo establecer el peso de fuente de un intervalo de texto en negrita.
// 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);
}
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.
- Representación mediante Direct2D.
- Representar mediante un representador de texto personalizado.
- Representar en una superficie GDI.