Gerenciando o posicionamento do cursor e o teste de clique
Linguagens de script complexas são divididas em clusters por ScriptShape. A reordenação de caracteres sempre ocorre dentro dos limites do cluster. Os próprios clusters têm a garantia de avançar na direção da ordem de leitura.
As informações de cluster na matriz de cluster lógico são usadas para compartilhar a largura de um cluster de glifos igualmente entre os caracteres lógicos que eles representam. Por exemplo, o glifo lam alef é dividido em quatro áreas:
- A metade à esquerda da fuga.
- A metade à direita da fuga.
- A metade à esquerda do alef.
- A metade à direita do alef.
As convenções para o posicionamento de cursor em clusters dependem do script. Para o script árabe, se a posição do cursor estiver definida entre um caractere base e sua marca de combinação, o cursor será exibido na metade do caractere base. Para o script tailandês, o cursor não pode ser posicionado dentro de um cluster. Assim, quando o usuário avança o cursor, o aplicativo deve passar por todos os glifos que compõem o cluster.
As funções ScriptXtoCP e ScriptCPtoX são convertidas entre posições de cursor (em deslocamentos de ponto de código) e posições x (em pixels). A função ScriptXtoCP tem conhecimento das convenções de posição de cursor de cada script:
- Para indianos e tailandeses, as posições de cursor são ajustadas aos limites do cluster.
- Para árabe, as posições de cursor são interpoladas com clusters.
- Para hebraico, em versões anteriores a Usp10.dll, versão 1.420, as posições de cursor são interpoladas com clusters. A partir do Usp10.dll, versão 1.420, as posições de cursor são ajustadas aos limites do cluster.
ScriptXtoCP e ScriptCPtoX operam somente em execuções. As funções exigem que determinados parâmetros sejam provenientes de chamadas Uniscribe anteriores, conforme mostrado na tabela a seguir.
Parâmetro | Fonte |
---|---|
Psa | Conforme retornado por ScriptItemize. |
cGlyphspwLogClust psva |
Conforme retornado por ScriptShape. |
piAdvance | Conforme retornado por ScriptPlace. |
O aplicativo deve estabelecer a execução na qual um determinado deslocamento de cursor ou posição x é antes de passar as informações para ScriptCPtoX ou ScriptXtoCP. Se o aplicativo não salvar as informações de largura, ele poderá fazer testes de clique e posicionamento de cursor depois de exibir cada execução. Como alternativa, o aplicativo pode armazenar em cache informações suficientes para fazer testes de clique e posicionamento de cursor na linha atual sem a necessidade de reprocessamento do parágrafo.
ScriptXtoCP retorna um valor de borda à direita para que o aplicativo conheça o lado do caractere ou cluster no qual o usuário clicou. O valor é 0 ou a largura do caractere ou cluster em pontos de código. A posição do caractere retornado é a posição do caractere no qual o usuário clicou. Para obter mais informações, consulte Exibindo o cursor em cadeias de caracteres bidirecionais.
Para idiomas como tailandês, para os quais o usuário convencionalmente não deseja colocar o cursor em um cluster, ScriptXtoCP define o sinalizador lateral à direita como 0 ou para a largura do cluster. Para idiomas como árabe, para os quais o usuário espera poder editar em um cluster, ScriptXtoCP define o sinalizador lateral à direita como 0 ou 1.
Para ajudar o aplicativo a estabelecer locais válidos para o cursor ao manipular as teclas de direção, o Uniscribe fornece informações sobre posições de cursor válidas no membro fCharStop nos atributos lógicos retornados pelo ScriptBreak. TRUE é retornado para a maioria dos caracteres e FALSE para caracteres de intercluster em scripts como tailandês. O aplicativo deve marcar o valor fNeedsCaretInfo na estrutura SCRIPT_PROPERTIES de um item para ver se é necessário chamar ScriptBreak para marcar para posições de cursor válidas. Se o valor fNeedsCaretInfo for FALSE, todos os pontos de código serão posições de cursor válidas.
Tópicos relacionados