テキストの書式設定とレイアウト
DirectWrite には、テキストを書式設定するための 2 つのインターフェイス (IDWriteTextFormat と IDWriteTextLayout) が用意されています。 IDWriteTextFormat では、テキストの形式のみが記述され、文字列全体が同じフォント サイズ、スタイル、太さなどの場合に使用されます。 一方、IDWriteTextLayout は、テキスト文字列と、指定した文字列範囲の書式設定の両方をカプセル化します。 このドキュメントでは、各インターフェイスとその使用方法について説明します。 これらのインターフェイスの作成とメソッドの詳細については、IDWriteTextFormat および IDWriteTextLayout リファレンス ページを参照してください。
このドキュメントには、次の部分が含まれています。
- IDWriteTextFormat の
-
IDWriteTextLayout
- テキスト の範囲を書式設定する
- レンダリング オプションの
IDWriteTextFormat
IDWriteTextFormat オブジェクトは、次の目的で使用されます。
- レンダリング時の文字列全体の形式について説明します。 複数の形式の文字列をレンダリングするには、IDWriteTextLayout オブジェクトを使用します。
- IDWriteTextLayout オブジェクトを作成するときに、既定のテキスト形式を指定します。
IDWriteTextFormat オブジェクトを作成するには、IDWriteFactory::CreateTextFormat メソッドを使用し、フォント ファミリ、フォント コレクション、フォントの太さ、フォント サイズ (DIP)、ロケール名を指定します。
IDWriteTextFormat の変更
IDWriteTextFormat インターフェイスが作成されると、フォント ファミリ、コレクション、重み、サイズ、ロケール名など、一部の値を変更できません。 これらの値を変更するには、IDWriteTextFormat オブジェクト 新しいオブジェクトを作成する必要があります。
IDWriteTextLayout を使用すると、何も再作成せずに上記のプロパティを変更できます。 IDWriteTextFormatをすると、テキストの配置など、テキスト全体に適用される書式を変更できます。 特定の文字範囲に書式を適用する場合は、IDWriteTextLayoutを使用して行う必要があります。
IDWriteTextFormat には、テキストの配置、フローの方向、増分タブの停止、行間、段落の配置、トリミング、および単語の折り返しを設定するメソッドが用意されています。 これらのプロパティは、IDWriteTextFormat オブジェクトの作成後にいつでも変更できます。
IDWriteTextLayout
IDWriteTextLayout インターフェイスは、IDWriteTextFormatとは異なり、テキストブロックと関連する書式設定の両方を表します。 IDWriteTextFormat は、初期書式情報を表します。 次の例では、IDWriteFactory::CreateTextLayoutを使用して、IDWriteTextLayout オブジェクトを作成する方法を示します。
// 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.
);
}
IDWriteTextLayout オブジェクト内のテキストは、オブジェクトの作成後は変更できません。 テキストを変更するには、既存のオブジェクトを削除し、新しい IDWriteTextLayout オブジェクトを作成する必要があります。
IDWriteTextLayout を使用して、指定したテキスト範囲の書式を設定できます。 IDWriteTextLayout には、フォント スタイルと太さを変更したり、OpenType フォント機能を追加したり、ヒット テストを行うメソッドも用意されています。 メソッドの詳細と完全な一覧については、IDWriteTextLayout リファレンス ページを参照してください。
テキストの範囲の書式設定
IDWriteTextLayout には、テキストの範囲を書式設定するいくつかのメソッドが用意されています。 これらの各メソッドは、文字列内の開始テキスト位置と書式設定する範囲の長さを指定するパラメーターとして、DWRITE_TEXT_RANGE 構造体を受け取ります。 次の例は、テキスト範囲のフォントの太さを太字に設定する方法を示しています。
// 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);
}
レンダリング オプション
Direct2Dでは、IDWriteTextFormat オブジェクトでのみ記述された書式を持つテキストをレンダリングできますが、IDWriteTextLayout オブジェクトをレンダリングするためのオプションがいくつかあります。
IDWriteTextLayout オブジェクトによって記述される文字列は、次のメソッドを使用してレンダリングできます。
- Direct2D を使用してレンダリングをします。
- カスタム テキスト レンダラーを使用してレンダリングします。
- GDI サーフェスにレンダリングします。