Vertikaler Text

Ab dem Windows 8 verfügt DirectWrite über eine Reihe neuer APIs, mit denen Sie vertikalen Text in Ihren Apps verwenden können.

Zeichnen von vertikalem Text

Sie können vertikalen Text mit Direct2D zeichnen, indem Sie die DrawTextLayout-Methoden verwenden. Um den Text vertikal zu zeichnen, übergeben Sie DWRITE_READING_DIRECTION_TOP_TO_BOTTOM an die IDWriteTextFormat::SetReadingDirection-Methode und DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT an die IDWriteTextFormatSetFlowDirection-Methode . Anschließend können Sie ein vertikales IDWriteTextLayout-Objekt erstellen und zeichnen.

Analysieren der Zeichenausrichtung

Jedes Zeichen hat eine bevorzugte Zeichenausrichtung oder die Richtung, in der das Zeichen in einem beliebigen Richtungslayout ausgerichtet werden soll. Im herkömmlichen horizontalen Layout werden beispielsweise sowohl der lateinische Text als auch der chinesische Text vertikal ausgerichtet. Auf der anderen Seite bleibt der chinesische Text in einem vertikalen Layout aufrecht, und der lateinische Text wird um 90 Grad gedreht. Dieser Orientierungsunterschied wird im beispiel hier gezeigt.

Ein Bild des englischen und chinesischen Texts in horizontalen und vertikalen Layouts.

Um die Ausrichtung des Texts zu bestimmen, müssen Sie die Schnittstellen IDWriteTextAnalysisSink1 und IDWriteTextAnalysisSource1 implementieren. Die Quelle und die Senke nehmen die Glyphenläufe auf und können überprüfen, ob sie vertikal ausgerichtet sind oder nicht.

Nachdem Sie Ihre Quelle und Senke implementiert haben, rufen Sie die AnalyzeVerticalGlyphOrientation-Methode auf . Im Beispielbild gibt diese Funktion 3 Ausführungen zurück: "Englisch", "中中" und "Englisch".

Von Zeichen zu Glyphen wechseln

Nachdem Sie nun wissen, dass die Ausführung vertikale Glyphen enthält, müssen Sie Zugriff auf diese Glyphen erhalten. Im bisherigen Beispiel gibt es 3 Ausführungen: eine mit vertikalen Glyphen und zwei ohne. Um von Zeichen zu Glyphen zu wechseln, rufen Sie GetGlyphIndices auf. Diese Methode gibt die entsprechenden Glyphenindizes für die Zeichen im Beispiel zurück. Da die AnalyzeVerticalGlyphOrientation-Methode eine Ausführung mit vertikalen Glyphen zurückgibt, müssen Sie GetVerticalGlyphVariants aufrufen, wodurch die vertikal orientierten Glyphen-IDs anstelle der aktuellen Glyphen-IDs zurückgegeben werden.

Vertikales Zeichnen von Text

Schließlich müssen Sie den Text auslegen und zeichnen. Da Sie den Text vertikal zeichnen, müssen Sie weitere Informationen abrufen, damit der lateinische Text richtig gezeichnet wird. Wenn Sie den gesamten Text entlang der zentralen Baseline zeichnen, scheint der lateinische Text in der Mitte der Zeile zu schweben. Sie benötigen Zugriff auf die zentrale und römische Baseline, um den Text richtig auszurichten. Verwenden Sie die IDWriteTextAnalyzer1::GetBaseline-Methode , um die numerischen Werte der angegebenen Baselines abzurufen. Sie können die römische Baseline von der zentralen Baseline subtrahieren, um den Offset zwischen den beiden zu erhalten.

Mit all diesen Informationen können Sie den Text auf dem Bildschirm zeichnen. Rufen Sie zunächst die GetGlyphOrientationTransform-Methode mit den Ergebnissen der Objekte IDWriteTextAnalysisSink1 und IDWriteTextAnalysisSource1 auf.

Wenn Sie Direct2D verwenden, müssen Sie auch die Welttransformation für das Direct2D-Renderziel für das vertikale Rendering festlegen.

Zum Schluss rufen Sie DrawGlyphRun dreimal auf, einmal für jeden Textblock. Auf die beiden Textblöcke in englischer Sprache müssen Sie den Offset anwenden, den wir zwischen den römischen und zentralen Baselines berechnet haben.

Nun wird der Text in Ihrer App vertikal mit der richtigen Glyphenausrichtung gezeichnet.