Сложные рукописные шрифты
В то время как функции, рассмотренные в предшествующей статье хороши для многих языков, они не могут работать с нужными сложными рукописными шрифтами.
Сложные рукописные шрифты (Complex Scripts) являются способами изображения языка, печатаемая форма которого предоставлена не простым способом. Например, сложный рукописный шрифт может дать возможность двунаправленного воспроизведения, контекстного формирования глифа, или комбинаций символов. Вследствие этих специальных требований, управление выводом текста должны быть очень гибким.Windows 2000/XP: Функции, которые показывают на экране текст -
TextOut, ExtTextOut, TabbedTextOut, DrawText и GetTextExtentExPoint - были доработаны, чтобы поддерживать сложные рукописные шрифты. В большинстве случаев, эта поддержка является прозрачной для приложения. Однако, прикладные программы должны хранить символы в буфере и показывать на экране целую строку текста сразу, так, чтобы сложный рукописный шрифт, формирующий модули мог использовать контекст переупорядочивания и создания глифа корректно. Кроме того, поскольку ширина глифа может изменяться контекстом, прикладные программы должны использовать функцию GetTextExtentExPoint, чтобы выяснить линейную длину, а не пользоваться кэшированной шириной символа.Кроме того, прикладные программы знающие сложный рукописный шрифт - должны учитывать дополнение поддержки для порядка чтения справа налево и правильного выравнивания их приложениями. Вы можете переключать порядок чтения или выравнивания между левым и правым при помощи нижеследующего кода:
// Сохраняем переменную lAlign (в этом примере используются статические переменные) staticLONG lAlign = TA_LEFT; // Когда пользователь переключает выравнивание (заданный флажок TA_CENTER не поддерживается). lAlign = TA_RIGHT; // Когда пользователь переключает порядок чтения. lAlign = TA_RTLREADING; // Перед вызовом функции ExtTextOut, например когда обрабатывается сообщение WM_PAINT SetTextAlign (hDc, lAlign); |
Чтобы переключить оба атрибута сразу, исполните нижеследующую инструкцию, а затем вызовите функцию
SetTextAlign и ExtTextOut, как показано выше:
lAlign = TA_RIGHT^TA_RTLREADING; |
Вы можете также обрабатывать сложные рукописные шрифты при помощи
Uniscribe. Uniscribe - это набор функций, которые обеспечивают высокую степень управления сложными рукописными шрифтами. Для получения дополнительной информации, см. статью Uniscribe и обработка сложного рукописного шрифта.