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