Поделиться через


Убедитесь, что текст отображается с правильным направлением чтения

Для некоторых языков, таких как арабский и иврит, требуется направление чтения справа налево. Для объекта форматирования текста DirectWrite направление чтения по умолчанию — слева направо. DirectWrite не автоматически выводит направление чтения из языкового стандарта, поэтому это необходимо сделать самостоятельно.

Сначала получите флаги расширенного стиля для окна, в которое будет отображаться текст с помощью макроса GetWindowStyleEx, определенного в windowsx.h.

// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);

Макрос возвращает значение DWORD, состоящее из нескольких флагов, в сочетании с побитовыми операциями OR. Необходимо определить, существуют ли определенные флаги, влияющие на направление чтения.

Существует 2 различных флага, связанных с направлением чтения: WS_EX_LAYOUTRTL и WS_EX_RTLREADING.

Используйте побитовый оператор AND (&) с переменной dwStyle и макросом WS_EX_LAYOUTRTL для хранения значения 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);
}