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


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

В однонаправленном тексте позиция курсора не имеет неоднозначности, так как передний край символа находится в том же месте, что и конечный край предыдущего символа. Однако в двунаправленном тексте положение курсора между прогонами противоположного направления неоднозначно. Например, в абзаце hellosalaam слева направо последняя буква "hello" непосредственно предшествует первой букве "salaam". Наилучшее положение для отображения курсора зависит от того, следует ли следовать за "o" из "hello" или перед "s" "salaam".

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