De caret weergeven in bidirectionele tekenreeksen
In unidirectionele tekst heeft de caretpositie geen dubbelzinnigheid omdat de voorlooprand van een teken zich op dezelfde plaats bevindt als de achterrand van het vorige teken. In bidirectionele tekst is echter de positie van de cursor tussen segmenten van tegengestelde richting dubbelzinnig. In de links-naar-rechts alinea 'hellosalaam', gaat de laatste letter van 'hello' direct vooraf aan de eerste letter van 'salaam'. De beste positie waarin de caret moet worden weergegeven, is afhankelijk van of het wordt beschouwd om de "o" van "hallo" te volgen of vooraf te gaan aan de "s" van "salaam".
Uniscribe maakt gebruik van de caret positioneringsconventies die worden weergegeven in de volgende tabel.
Situatie | Plaatsing van de visuele cursor |
---|---|
Typen | Achterste rand van het laatste getypte teken. |
Plakken | De achterrand van het laatste teken is geplakt. |
Caret gaat vooruit | Afsluitende rand van het laatste teken is gepasseerd. |
Caret buiten gebruik stellen | Voorrand van het laatste teken is gepasseerd. |
Thuis | Voorste rand van de lijn. |
Einde | Achterrand van de lijn. |
De caret kan worden geplaatst zoals getoond in het volgende voorbeeld:
if (fAdvancing) {
ScriptCPtoX(
iCharPos - 1, TRUE,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
} else {
ScriptCPtoX(
iCharPos, FALSE,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
}
Plaatsing van de caret kan eenvoudiger zijn, zoals hieronder wordt weergegeven, gezien een fAdvancing-waarde die beperkt is tot TRUE of FALSE:
ScriptCPtoX(
iCharPos - fAdvancing, fAdvancing,
cChars, cGlyphs, &wLogClust, &sva, &iAdvance, &sa, &iCaretX
);
ScriptCPtoX verwerkt logisch posities buiten het bereik. Het retourneert de voorlooprand van de run voor iCharPos<0, en de afsluitende rand van de run voor iCharPos>= lengte. Zie voor meer informatie Het beheren van de plaatsing van de cursor en hit-testing
Verwante onderwerpen
-
Uniscribe- gebruiken