双方向文字列でのキャレットの表示
一方向のテキストでは、キャレット位置は、文字の前の端が前の文字の末尾の端と同じ位置にあるため、あいまいさはありません。 ただし、双方向テキストでは、反対方向の実行間のキャレット位置があいまいです。 たとえば、左から右の段落 "hellosalaam" では、"hello" の最後の文字が "salaam" の最初の文字の直前に置かれます。 キャレットを表示する最適な位置は、"hello" の "o" に従うか、"サラーム" の "s" の前にあると見なされるかによって異なります。
Uniscribe では、次の表に示すキャレット配置規則を使用します。
状況 | ビジュアル キャレットの配置 |
---|---|
Typing (入力) | 最後に入力された文字の末尾の端。 |
貼り付け | 貼り付けた最後の文字の末尾の端。 |
キャレットの進行 | 最後に渡された文字の末尾の端。 |
キャレットの廃止 | 最後に渡された文字の先頭の端。 |
ホーム | 行の先頭の端。 |
End | 行の末尾の端。 |
キャレットは、次の例に示すように配置できます。
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 は 、範囲外の位置を論理的に処理します。 iCharPos0 の実行の先頭端と、iCharPos><= length の実行の末尾の端を返します。 詳細については、「キャレット配置とヒット テストの管理」を参照してください。
関連トピック