在双向字符串中显示插入点

在单向文本中,插入符号位置没有歧义,因为字符的前边缘与前一个字符的尾边缘位于同一位置。 但是,在双向文本中,反方向的运行之间的插入点位置不明确。 例如,在从左到右的段落“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 值限制为 TRUEFALSE,插入点的定位可能更简单,如下所示:

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

ScriptCPtoX 以逻辑方式处理范围外的位置。 它返回 iCharPos<0 的运行的前边缘,以及 iCharPos>= length 的运行的尾随边缘。 有关详细信息,请参阅 管理插入点放置和命中测试

使用 Uniscribe