Compartilhar via


Exibindo o cursor em cadeias de caracteres bidirecionais

No texto unidirecional, a posição do cursor não tem ambiguidade porque a borda esquerda de um caractere está no mesmo lugar que a borda à direita do caractere anterior. No entanto, no texto bidirecional, a posição do cursor entre execuções de direção oposta é ambígua. Por exemplo, no parágrafo da esquerda para a direita "hellosalaam", a última letra de "hello" precede imediatamente a primeira letra de "salaam". A melhor posição na qual exibir o cursor depende se ele é considerado para seguir o "o" de "olá" ou preceder os "s" de "salaam".

Uniscribe usa as convenções de posicionamento de cursor mostradas na próxima tabela.

Situação Posicionamento do cursor visual
Digitação Borda à direita do último caractere digitado.
Colar Borda à direita do último caractere colado.
Cursor avançando Borda à direita do último caractere passado.
Desativação do Cursor Borda à esquerda do último caractere passado.
Página Inicial Borda à esquerda da linha.
End Borda à direita da linha.

 

O cursor pode ser posicionado conforme mostrado no exemplo a seguir:

if (fAdvancing) {
    ScriptCPtoX(
        iCharPos - 1, TRUE, 
        cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
        );
} else {
    ScriptCPtoX(
        iCharPos, FALSE, 
        cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
        );
}

O posicionamento do cursor pode ser mais simples, conforme mostrado abaixo, considerando um valor fAdvancing restrito a TRUE ou FALSE:

ScriptCPtoX(
    iCharPos - fAdvancing, fAdvancing, 
    cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
    );

ScriptCPtoX manipula posições fora do intervalo logicamente. Ele retorna a borda superior da execução para iCharPos<0 e a borda à direita da execução para iCharPos>= length. Para obter mais informações, consulte Managing Caret Placement and Hit Testing

Usando Uniscribe