次の方法で共有


縦書きテキスト

Windows 8 以降、DirectWrite には、アプリで縦書きテキストを使用できる新しい API が多数用意されています。

縦書きテキストの描画

DrawTextLayout メソッドを使用して、Direct2D で垂直テキストを描画できます。 テキストを垂直方向に描画するには、IDWriteTextFormat::SetReadingDirection メソッドに DWRITE_READING_DIRECTION_TOP_TO_BOTTOM を渡し、IDWriteTextFormatSetFlowDirection メソッドに DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT します。 次に、IDWriteTextLayoutオブジェクト垂直に作成して描画できます。

文字の向きの分析

すべての文字には、優先される文字の向き、または任意の方向レイアウトで文字の方向を指定する必要があります。 たとえば、従来の水平レイアウトでは、ラテン文字と中国語テキストの両方が垂直方向に配置されます。 一方、垂直方向のレイアウトでは、中国語のテキストは直立したままで、ラテン文字は 90 度回転します。 この向きの違いは、この例で見られます。

水平方向と垂直方向のレイアウトで英語と中国語のテキストの画像を します。

テキストの向きを決定するには、IDWriteTextAnalysisSink1を実装し、IDWriteTextAnalysisSource1インターフェイスする必要があります。 ソースとシンクはグリフの実行を受け取り、垂直方向に向いているかどうかを確認できます。

ソースとシンクを実装した後、AnalyzeVerticalGlyphOrientation メソッドを呼び出します。 この例の画像では、"English"、"中国"、"English" の 3 つの実行が返されます。

文字からグリフに移動する

実行に垂直グリフが含まれていることがわかったら、それらのグリフにアクセスする必要があります。 これまでの例では、3 つの実行があります。1 つは垂直グリフを持ち、2 つはなしです。 文字からグリフに移行するには、GetGlyphIndices呼び出します。 このメソッドは、例の文字に対応するグリフ インデックスを返します。 AnalyzeVerticalGlyphOrientation メソッドは垂直グリフを使用して実行を返すので、現在のグリフ ID の代わりに垂直方向のグリフ ID を返す GetVerticalGlyphVariantsを呼び出す必要があります。

テキストを垂直方向に描画する

最後に、テキストをレイアウトして描画する必要があります。 テキストを垂直方向に描画するため、ラテン文字が正しく描画されるように、さらに多くの情報を取得する必要があります。 中央のベースラインに沿ってすべてのテキストを描画すると、ラテン文字が線の中央に浮動しているように見えます。 テキストを正しく配置するには、中央とローマの両方のベースラインにアクセスする必要があります。 IDWriteTextAnalyzer1::GetBaseline メソッドを使用して、指定したベースラインの数値を取得します。 中央ベースラインからローマのベースラインを減算して、2 つの間のオフセットを取得できます。

このすべての情報を使用すると、画面上にテキストを描画できます。 最初に、IDWriteTextAnalysisSink1 および IDWriteTextAnalysisSource1 オブジェクトの結果を使用して、GetGlyphOrientationTransform メソッドを呼び出します。

Direct2D を使用している場合は、垂直方向のレンダリング用に Direct2D レンダー ターゲットにワールド変換を設定する必要もあります。

最後に、DrawGlyphRun 3 回呼び出します。テキストブロックごとに 1 回ずつ呼び出します。 英語の 2 つのテキスト ブロックで、ローマと中央のベースラインの間で計算したオフセットを適用する必要があります。

これで、アプリ内のテキストが垂直方向に描画され、グリフの向きが正しくなりました。