Поделиться через


Отображение курсора в двунаправленных строках

В однонаправленном тексте положение курсора не вызывает неоднозначности, так как передний край символа находится в том же месте, что и конечный край предыдущего символа. Тем не менее, в двунаправленном тексте положение каретки между фрагментами противоположного направления неоднозначно. Например, в абзаце слева направо "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>, равна длине. Для получения дополнительной информации см. раздел Управление размещением каретки и тестирование попаданий

Использование Uniscribe