Textformatierung und Layout
DirectWrite bietet zwei Schnittstellen zum Formatieren von Text: IDWriteTextFormat und IDWriteTextLayout. IDWriteTextFormat beschreibt nur das Format für Text und wird in Fällen verwendet, in denen eine gesamte Zeichenfolge den gleichen Schriftgrad, stil, die gleiche Gewichtung usw. aufweisen soll. Andererseits kapselt IDWriteTextLayout sowohl eine Textzeichenfolge als auch die Formatierung für die angegebenen Bereiche der Zeichenfolge. In diesem Dokument werden jede Schnittstelle und deren Verwendung beschrieben. Weitere Informationen zur Erstellung und den Methoden dieser Schnittstellen finden Sie auf den Referenzseiten IDWriteTextFormat und IDWriteTextLayout .
Dieses Dokument enthält die folgenden Teile:
Idwritetextformat
Ein IDWriteTextFormat-Objekt wird für Folgendes verwendet:
- Beschreiben des Formats für eine gesamte Zeichenfolge beim Rendern. Verwenden Sie ein IDWriteTextLayout-Objekt , um eine Zeichenfolge mit mehreren Formaten zu rendern.
- Geben Sie beim Erstellen eines IDWriteTextLayout-Objekts das Standardtextformat an.
Um ein IDWriteTextFormat-Objekt zu erstellen, verwenden Sie die IDWriteFactory::CreateTextFormat-Methode und geben die Schriftfamilie, die Schriftartsammlung, die Schriftstärke, den Schriftgrad (in DIPs) und den Gebietsschemanamen an.
Ändern eines IDWriteTextFormat
Nachdem eine IDWriteTextFormat-Schnittstelle erstellt wurde, können einige Werte nicht mehr geändert werden: Schriftfamilie, Sammlung, Gewichtung und Größe sowie der Name des Gebietsschemas. Um diese Werte zu ändern, muss ein neues IDWriteTextFormat-Objekt erstellt werden.
Mit IDWriteTextLayout können Sie die oben genannten Eigenschaften ändern, ohne etwas neu zu erstellen. Mit IDWriteTextFormat können Sie Formatänderungen vornehmen, die für den gesamten Text gelten, z. B. die Textausrichtung. Wenn Sie Formatierungen auf bestimmte Zeichenbereiche anwenden möchten, sollten Sie dazu ein IDWriteTextLayout verwenden.
IDWriteTextFormat bietet Methoden zum Festlegen der Textausrichtung, der Flussrichtung, des inkrementellen Tabstopps, des Zeilenabstands, der Absatzausrichtung, des Kürzens und des Wortumbruchs. Diese Eigenschaften können jederzeit nach der Erstellung des IDWriteTextFormat-Objekts geändert werden.
Idwritetextlayout
Die IDWriteTextLayout-Schnittstelle stellt im Gegensatz zu IDWriteTextFormat sowohl einen Textblock als auch die zugeordnete Formatierung dar. IDWriteTextFormat stellt die anfänglichen Formatierungsinformationen dar. Im folgenden Beispiel wird gezeigt, wie Sie mithilfe von IDWriteFactory::CreateTextLayout ein IDWriteTextLayout-Objekt erstellen.
// 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.
);
}
Der Text in einem IDWriteTextLayout-Objekt kann nicht geändert werden, nachdem das Objekt erstellt wurde. Um den Text zu ändern, müssen Sie das vorhandene Objekt löschen und ein neues IDWriteTextLayout-Objekt erstellen.
Sie können ein IDWriteTextLayout verwenden, um bestimmte Textbereiche zu formatieren. IDWriteTextLayout bietet auch Methoden zum Ändern von Schriftschnitt und -gewichtung sowie zum Hinzufügen von OpenType-Schriftartfeatures und Treffertests. Weitere Informationen und eine vollständige Liste der Methoden finden Sie auf der IDWriteTextLayout-Referenzseite .
Formatieren eines Textbereichs
IDWriteTextLayout bietet mehrere Methoden zum Formatieren von Textbereichen. Jede dieser Methoden verwendet eine DWRITE_TEXT_RANGE-Struktur als Parameter, um die Anfangstextposition innerhalb der Zeichenfolge und die Länge des zu formatierenden Bereichs anzugeben. Im folgenden Beispiel wird gezeigt, wie die Schriftbreite eines Textbereichs auf Fettdruck festgelegt wird.
// 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);
}
Renderingoptionen
Text mit einer Formatierung, die nur von einem IDWriteTextFormat-Objekt beschrieben wird, kann mit Direct2D gerendert werden. Es gibt jedoch noch einige weitere Optionen zum Rendern eines IDWriteTextLayout-Objekts .
Die durch ein IDWriteTextLayout-Objekt beschriebene Zeichenfolge kann mit den folgenden Methoden gerendert werden.
- Rendern mit Direct2D.
- Rendern mithilfe eines benutzerdefinierten Textrenderers.
- Rendern auf einer GDI-Oberfläche.