Windows: вывод символов справа налево с использованием TextOut
Я хотел бы обратиться за помощью к собственной функции TextOutW в Win32, когда дело доходит до отображения символов с направлением текста справа налево. По сути, я хочу, чтобы TextOutW отображал текст с символами как есть, без применения каких-либо преобразований, форм и т. Д. К тексту.
То, что у меня есть, это простой код [1], подобный следующему:
WCHAR text[2] = { 0x5D3, 0x5E9 };
TextOutW(hdc, 100, 100, ( LPCWSTR ) text, 2);
что я использовал, потому что я хочу нарисовать два символа вместе, слева направо, сначала 0x5D3 (ד), а затем 0x5E9 (ש) . Я получаю противоположное - сначала рисуется 0x5E9, а затем 0x5D3:
דש
Конечно, я могу придумать множество обходных путей, как это переопределить, самое простое - просто добавить символ 0x202D [2] перед текстом. Но это кажется хакерским и, как правило, неправильным, и также не поможет мне, например, с арабским текстом, в котором буквы будут автоматически объединяться (и для этого потребуются еще более уродливые обходные пути).
Есть ли какая-либо информация об этом поведении Windows? Как я мог отключить это внутри программы? Это связано с Uniscribe? (Я никогда не использовал это и не собираюсь).
Спасибо!
[1] (Полный код здесь http://karasik.eu.org/misc/rtl.c).
[2] U + 202D (LRO) ПЕРЕЗАГРУЗКА ВЛЕВО НА ПРАВО: заставляет считать следующие символы сильными символами слева направо.
1 ответ
Посмотрите на функцию ExtTextOut(), особенно флаг ETO_GLYPH_INDEX.
Обратите внимание, что это поведение не характерно для Windows (но реализация в Windows макета Unicode немного отличается от других платформ). Вы не можете волшебным образом "выключить" свою программу, например, выбрав какой-то особый язык.