テキストの書式設定とレイアウト
DirectWriteには、テキストを書式設定するための 2 つのインターフェイス (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);
}
レンダリング オプション
IDWriteTextFormat オブジェクトでのみ記述された書式を持つテキストは Direct2D でレンダリングできますが、IDWriteTextLayout オブジェクトをレンダリングするためのオプションがいくつかあります。
IDWriteTextLayout オブジェクトによって記述される文字列は、次のメソッドを使用してレンダリングできます。