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


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

Для некоторых языков, таких как арабский и иврит, требуется направление чтения справа налево. Для объекта 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);
}