テキストが正しい読み取り方向で表示されていることを確認する
アラビア語やヘブライ語などの一部の言語では、右から左への読み取り方向が必要です。 DirectWriteテキスト形式オブジェクトの場合、既定の読み取り方向は左から右です。 DirectWriteはロケールからの読み取り方向を自動的に推論しないため、自分で行う必要があります。
まず、windowsx.h で定義されている GetWindowStyleEx マクロを使用して、テキストがレンダリングされるウィンドウの拡張スタイル フラグを取得します。
// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);
このマクロは、ビットごとの OR 演算と組み合わせた複数のフラグで構成される DWORD 値を返します。 読み取り方向に影響を与える特定のフラグがあるかどうかを判断する必要があります。
読み取り方向に関連する 2 つの異なるフラグがあります。WS_EX_LAYOUTRTLとWS_EX_RTLREADING。
dwStyle 変数と WS_EX_LAYOUTRTL マクロでビットごとの AND 演算子 (&) を使用して、レイアウトがミラー化されているかどうかを示す BOOL 値を格納します。
// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;
WS_EX_RTLREADING フラグに対して同じことを行います。
// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;
IDWriteTextFormat::SetReadingDirection メソッドを使用して読み取り方向を設定します。 既定値は左から右であるため、読み取り方向を設定する必要があるのは、右から左の場合のみです。
注意
WS_EX_LAYOUTRTLはレイアウト全体を反映し、右から左への読み取り方向を意味するため、これらのフラグのいずれかが存在する場合にのみ読み取り方向を設定します。 両方が存在する場合は、互いに取り消し合い、テキスト形式の読み取り方向を左から右に設定する必要があります。
// If either the WS_EX_LAYOUTRTL flag or the WS_EX_RLTREADING flag is present,
// but NOT BOTH, set the reading direction to right to left.
if ((bWSLayout && !bWSReading)
|| (!bWSLayout && bWSReading))
{
pTextFormat_->SetReadingDirection(DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
}