netlib.narod.ru | < Назад | Оглавление | Далее > |
Выше я сказал, что по функциональности программа TypeAway почти полностью соответствует элементу управления TextBox, работающему в режиме обработки одной строки, кроме двух моментов. Первая проблема в том, что TypeAway не поддерживает буфер обмена, вторая — TypeAway некорректно показывает каретку при наборе текста, который пишется справа налево, например, на арабском и иврите.
Рассмотрим эти проблемы. Запустите TypeAway и переключитесь на раскладку для иврита. Мы наберем фразу «Доброе утро» на иврите: . Ее латинская транслитерация выглядит как «boker tov». Чтобы сделать этот маленький трюк на английской клавиатуре, надо знать, какие символы иврита соответствуют ее клавишам.
Алфавит иврита
Код Unicode | Буква | Начертание | Клавиша | Код Unicode | Буква | Начертание | Клавиша |
0x05D0 | Алеф | t | 0x05DE | Мэм | n | ||
0x05D1 | Бет | c | 0x05DF | Нун конечная | i | ||
0x05D2 | Гимел | d | 0x05E0 | Нун | b | ||
0x05D3 | Далет | s | 0x05E1 | Самех | x | ||
0x05D4 | Хэй | v | 0x05E2 | Фин | g | ||
0x05D5 | Вав | u | 0x05E3 | Пэй конечная | ; | ||
0x05D6 | Заин | z | 0x05E4 | Пэй | p | ||
0x05D7 | Хэт | j | 0x05E5 | Цади конечная | . | ||
0x05D8 | Тэт | y | 0x05E6 | Цади | m | ||
0x05D9 | Йод | h | 0x05E7 | Коф | e | ||
0x05DA | Каф конечная | l | 0x05E8 | Реш | r | ||
0x05DB | Каф | f | 0x05E9 | Шин | a | ||
0x05DC | Ламед | k | 0x05EA | Тав | , | ||
0x05DD | Мэм конечная | o | |||||
Названия этих букв я нашел в описании третьей версии стандарта Unicode. Как видите, в название некоторых из них входит слово «конечная»: такие буквы пишутся иначе, если стоят в конце слова.
Также следует знать, что на иврите пишут справа налево. Таким образом, чтобы набрать вышеуказанную фразу на иврите в TypeAway, надо вводить буквы в таком порядке: бет (клавиша c), вав (клавиша u), коф (клавиша e), реш (клавиша r), пробел, тэт (клавиша y), вав (клавиша u) и снова бет (клавиша c). TypeAway хранит символы Unicode в символьной строке в порядке их ввода, и это правильно. Метод DrawString выводит эти символы справа налево, что тоже правильно. Поэтому методу DrawString надо отдать должное и поздравить его с тем, что он смог узнать и правильно вывести текст, читающийся справа налево.
Теперь вы знаете, почему TypeAway должна полностью стирать ранее нарисованную текстовую строку: вводимый текст вовсе не обязательно добавляется к концу строки. При наборе на иврите новый текст должен выводиться в начале, а не в конце строки. Набор арабских текстов еще сложнее: в арабском письме соседние символы часто объединяются и образуют символы с другим начертанием. Чтобы корректно обработать такую ситуацию, DrawString должен рисовать всю строку сразу, а не отдельные символы.
Позиционирование каретки — именно то, с чем не справляется TypeAway. При вводе текста справа налево каретка не соответствует точке вставки. Решение этой проблемы нетривиально, особенно когда приходится иметь дело со строками, включающими текст, читающийся в разных направлениях. Похоже, что в Windows Forms не хватает средств для решения этих проблем. Если вам интересно, как они решаются при помощи API Win32, прочитайте статью «Supporting Multilanguage Text Layout and Complex Scripts with Windows NT 5.0» в ноябрьском выпуске журнала Microsoft Systems Journal за 1998 г.
netlib.narod.ru | < Назад | Оглавление | Далее > |