Formattazione e layout del testo
DirectWrite fornisce due interfacce per la formattazione del testo: IDWriteTextFormat e IDWriteTextLayout. IDWriteTextFormat descrive solo il formato per il testo e viene usato nei casi in cui un'intera stringa sia la stessa dimensione, lo stile, lo stile e così via. D'altra parte , IDWriteTextLayout incapsula sia una stringa di testo che la formattazione per gli intervalli specificati della stringa. Questo documento descrive ogni interfaccia e i relativi usi. Per altre informazioni sulla creazione e sui metodi di queste interfacce, vedere le pagine di riferimento IDWriteTextFormat e IDWriteTextLayout.
Questo documento contiene le parti seguenti:
IDWriteTextFormat
Un oggetto IDWriteTextFormat viene usato per:
- Descrivere il formato per un'intera stringa durante il rendering. Per eseguire il rendering di una stringa con più formati, usare un oggetto IDWriteTextLayout .
- Specificare il formato di testo predefinito durante la creazione di un oggetto IDWriteTextLayout .
Per creare un oggetto IDWriteTextFormat , usare il metodo IDWriteFactory::CreateTextFormat e specificare la famiglia di caratteri, la raccolta di caratteri, il peso del carattere, le dimensioni del carattere (in INDIRIZZI DIP), il nome delle impostazioni locali.
Modifica di un IDWriteTextFormat
Dopo aver creato un'interfaccia IDWriteTextFormat , non è possibile modificare alcuni valori: famiglia di caratteri, raccolta, peso e dimensioni, nonché il nome delle impostazioni locali. Per modificare questi valori, è necessario creare un nuovo oggetto IDWriteTextFormat .
IDWriteTextLayout consente di modificare le proprietà precedenti senza ricreare alcun elemento. IDWriteTextFormat consente di apportare modifiche di formato che si applicano all'intero testo, ad esempio l'allineamento del testo. Se si vuole applicare la formattazione a intervalli di caratteri specifici, è consigliabile farlo usando un IDWriteTextLayout.
IDWriteTextFormat fornisce metodi per impostare l'allineamento del testo, la direzione del flusso, l'interruzione di tabulazione incrementale, la spaziatura linea, l'allineamento del paragrafo, il ritaglio e il wrapping delle parole. Queste proprietà possono essere modificate in qualsiasi momento dopo la creazione dell'oggetto IDWriteTextFormat .
IDWriteTextLayout
L'interfaccia IDWriteTextLayout , a differenza di IDWriteTextFormat, rappresenta sia un blocco di testo che la formattazione associata. IDWriteTextFormat rappresenta le informazioni di formattazione iniziale. Nell'esempio seguente viene illustrato come creare un oggetto 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.
);
}
Impossibile modificare il testo in un oggetto IDWriteTextLayout dopo la creazione dell'oggetto. Per modificare il testo, è necessario eliminare l'oggetto esistente e creare un nuovo oggetto IDWriteTextLayout .
È possibile usare un IDWriteTextLayout per formattare gli intervalli di testo specificati. IDWriteTextLayout offre anche metodi per modificare lo stile e il peso del tipo di carattere e aggiungere funzionalità del tipo di carattere OpenType e hit test. Per altre informazioni e un elenco completo dei metodi, vedere la pagina di riferimento IDWriteTextLayout .
Formattazione di un intervallo di testo
IDWriteTextLayout fornisce diversi metodi per formattare intervalli di testo. Ognuno di questi metodi accetta una struttura DWRITE_TEXT_RANGE come parametro per specificare la posizione del testo iniziale all'interno della stringa e la lunghezza dell'intervallo da formattare. Nell'esempio seguente viene illustrato come impostare il peso del carattere di un intervallo di testo in grassetto.
// 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);
}
Opzioni di rendering
Il testo con formattazione descritto solo da un oggetto IDWriteTextFormat può essere eseguito con Direct2D, ma sono disponibili alcune altre opzioni per il rendering di un oggetto IDWriteTextLayout .
È possibile eseguire il rendering della stringa descritta da un oggetto IDWriteTextLayout usando i metodi seguenti.
- Eseguire il rendering con Direct2D.
- Eseguire il rendering usando un renderer di testo personalizzato.
- Eseguire il rendering in una superficie GDI.