在双向字符串中显示插入点
在单向文本中,插入符号位置没有歧义,因为字符的前边缘与前一个字符的尾边缘位于同一位置。 但是,在双向文本中,反方向的运行之间的插入点位置不明确。 例如,在从左到右的段落“hellosalaam”中,“hello”的最后一个字母紧接在“salaam”的第一个字母之前。 显示脱字号的最佳位置取决于它是否被视为遵循“hello”的“o”或位于“salaam”的“s”之前。
Uniscribe 使用下表中显示的插入点定位约定。
场景 | 可视插入点放置 |
---|---|
Typing | 键入的最后一个字符的尾边。 |
粘贴 | 粘贴的最后一个字符的尾边。 |
插入符号推进 | 传递的最后一个字符的尾边。 |
脱字符号即将停用 | 传递的最后一个字符的前导边缘。 |
主页 | 线条的前边缘。 |
结束 | 线条的尾部边缘。 |
插入点的位置可以如下例所示:
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>= length 的运行的尾随边缘。 有关详细信息,请参阅 管理插入点放置和命中测试
相关主题