Отображение курсора в двунаправленных строках
В однонаправленном тексте положение курсора не вызывает неоднозначности, так как передний край символа находится в том же месте, что и конечный край предыдущего символа. Тем не менее, в двунаправленном тексте положение каретки между фрагментами противоположного направления неоднозначно. Например, в абзаце слева направо "hellosalaam" последняя буква "hello" сразу же предшествует первой букве "салама". Лучшее положение, в котором отображать курсор, зависит от того, следовать ли за "o" из "hello" или предшествовать "s" из "салам".
Uniscribe использует соглашения о позиционировании каретки, показанные в следующей таблице.
Ситуация | Размещение визуального курсора |
---|---|
Печатание | Конец последнего введённого символа. |
Склеивание | Задний край последнего вставленного символа. |
Кэрт продвигает | Конечный край последнего символа, который преодолен. |
Уход в отставку «Caret» | Передний край последнего символа пройден. |
Дом | Передний край линии. |
Конец | Конечный край линии. |
Курсор можно разместить, как показано в следующем примере:
if (fAdvancing) {
ScriptCPtoX(
iCharPos - 1, TRUE,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
} else {
ScriptCPtoX(
iCharPos, FALSE,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
}
Расположение курсора может быть проще, как показано ниже, при условии, что значение fAdvancing ограничено TRUE или FALSE:
ScriptCPtoX(
iCharPos - fAdvancing, fAdvancing,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
ScriptCPtoX логически обрабатывает позиции вне диапазона. Он возвращает начальный край отрезка для iCharPos<0, и конечный край отрезка для iCharPos>, равна длине. Для получения дополнительной информации см. раздел Управление размещением каретки и тестирование попаданий
Связанные разделы