管理插入點放置和命中測試
複雜腳本語言被 ScriptShape分成 叢集。 字元重新排序一律發生在叢集界限內。 叢集本身保證會往閱讀順序的方向前進。
邏輯叢集陣列中的叢集資訊用於使叢集中的字形寬度在它們所代表的邏輯字元之間均等共享。 例如,lam alef 圖像分成四個區域:
- lam的前半部分。
- 林的後半部分。
- 阿爾夫的領先一半。
- 阿列夫的後半部分。
叢集中插入號放置的慣例取決於腳本。 若為阿拉伯文文稿,如果插入號位置設定在基底字元與其合併標記之間,插入號會在基底字元中間顯示。 對於泰文腳本,插入號不能放在叢集內。 因此,當用戶移動游標時,應用程式必須移動過組成叢集的所有字形。
ScriptXtoCP 和 ScriptCPtoX 函式會轉譯插入號位置(在代碼點位移中)和 x 位置(以像素為單位)。 ScriptXtoCP 函式了解每種腳本的游標位置慣例:
- 對於印度和泰語中的文字,插入點的位置會自動對齊到字元叢集的界限。
- 若為阿拉伯文,插入點位置會與字元叢集一起進行內插。
- 針對希伯來文,在 Usp10.dll之前的版本,例如 1.420 版中,游標位置會插入到叢集內。 從版本 1.420 的 Usp10.dll開始,游標位置會貼齊到叢集界限。
ScriptXtoCP 和 ScriptCPtoX 只能在執行中運作。 函式會要求某些參數來自先前的 Uniscribe 呼叫,如下表所示。
參數 | 源 |
---|---|
psa | 如 scriptItemize 所傳回,。 |
cGlyphspwLogClust psva |
如 ScriptShape所傳回。 |
piAdvance | 由 ScriptPlace所傳回。 |
應用程式必須在將資訊傳遞至 ScriptCPtoX 或 ScriptXtoCP前,確定行的上下文,其中包含指定的插入號位移或 x 位置。 如果應用程式未儲存寬度資訊,可以在顯示每一段處理過程後進行點擊測試和游標位置設定。 或者,應用程式可以快取足夠的資訊,以在目前的行上進行命中測試和插入點放置,而無需重新處理段落。
ScriptXtoCP 傳回一個用來表示尾端邊緣的值,讓應用程式知道使用者點擊了字元或叢集的哪一側。 此值為 0 或字元或叢集的寬度,以字碼點表示。 傳回的字元位置是用戶按一下的字元位置。 如需詳細資訊,請參閱 在雙向字串中顯示插入點。
對於泰文等語言,使用者通常不會想將游標放在字集內,ScriptXtoCP 會將尾端標誌設定為 0 或字集的寬度。 對於阿拉伯文等語言,使用者預期能夠在叢集中編輯的語言,ScriptXtoCP 會將尾端旗標設定為 0 或 1。
為了協助應用程式在處理箭頭鍵時建立游標的有效位置,Uniscribe 會在 ScriptBreak所傳回的邏輯屬性 中,提供有關 fCharStop 成員中有效游標位置資訊。 TRUE 會回傳於大部分字元,而像泰文這類語言的聚簇字元則回傳 FALSE。 應用程式應該檢查 SCRIPT_PROPERTIES 結構中的 fNeedsCaretInfo 值,以查看是否需要呼叫 ScriptBreak 來檢查有效的插入點位置。 如果 fNeedsCaretInfo值為 FALSE,則所有碼位都是有效的插入符位置。
相關主題