範圍

錨點

範圍是以兩個 錨點分隔,即開始錨點和結束錨點。 錨點存在於兩個字元之間的虛置位置。 開始錨點與錨點後面的文字相關,而結束錨點與錨點前面的文字相關。 開始和結束錨點可以存在於相同的位置。 在此情況下,範圍長度為零。

例如,以下列文字開頭:

This is text.

現在,將範圍同時套用至此文字,開頭和結尾錨點位於位置 0。 它會以視覺化方式表示為:

<anchor></anchor>This is text.

錨點不會佔用文字本身中的任何空間。 這是長度為零的範圍,其文字是空的。

現在,將結束錨點 +3 位置移位。 它會以視覺化方式表示為:

<anchor>Thi</anchor>s is text.

開始錨點位於位置 0 中的字元之前,而結束錨點位於位置 3 中的字元後面,因為結束錨點移到右邊 3 個位置。 文字範圍現在是 「Thi」。

此外,無法讓開始錨點遵循結束錨點,而且無法讓結束錨點在開始錨點之前。

錨點重力

每個錨點都有 一個重力 設定,決定錨點在錨點位置插入文字資料流程時,錨點的回應方式。 在錨點的位置進行插入時,必須在錨點的位置進行調整。 重力決定這個錨點位置調整的方式。

例如:

It is <anchor></anchor>cold today.

如果在範圍位置插入 「very」 這個字,則可以在插入的字之前或之後放置開始錨點:

It is <anchor>very </anchor>cold today.

- 或 -

It is very <anchor></anchor>cold today.

錨點重力會指定當插入位於其位置時,錨點重新置放的方式。 重力可以是 向後向前

如果錨點具有向後重力,錨點會在插入時向後移動,相對於插入點,讓插入的文字遵循錨點:

It is <anchor>very </anchor>cold today.

如果錨點具有正向重力,錨點會向前移動 (相對於插入點) ,讓插入的文字位於錨點之前:

It is very <anchor></anchor>cold today.

複製和備份

有兩種方式可以建立範圍物件的「複本」。 第一個是使用ITfRange::Clone建立範圍的複製品。 第二個是使用ITfCoNtext::CreateRangeBackup備份範圍。

複製是不包含靜態資料的範圍複本。 複製範圍的錨點,但複製仍涵蓋內容中的文字範圍。 複製品是所有方面的範圍物件。 這表示複製範圍的文字和屬性是動態的,如果複製所涵蓋範圍的文字和/或屬性變更,將會變更。

備份會在備份建立為靜態資料時儲存範圍的文字和屬性。 備份也會複製原始範圍,以便追蹤原始範圍的大小和位置變更。 這表示備份範圍的文字和屬性是靜態的,如果備份所涵蓋範圍的文字和/或屬性變更,則不會變更。

例如,下列範圍 (內容中的 pRange) :

"This is some <pRange>text</pRange>."

現在製作複製品和此範圍的備份:

ITfRange *pClone;
ITfRangeBackup *pBackup;

pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);

現在,物件包含下列專案:

pRange  = "text"
pClone  = "text"
pBackup = "text"

現在變更 pRange 的文字:

WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));

現在,物件包含下列專案:

Context = "This is some other words."
pRange  = "other words"
pClone  = "other words"
pBackup = "text"

設定文字會導致內容內的文字變更。 它也會導致 pRange 和 pClone 的結束錨點變更。 pClone 現在包含「其他字」,因為範圍內的文字已變更,而且所有範圍都會追蹤這些變更。 當 pRange 和 pClone 所涵蓋的文字變更時,pClone 的文字也會變更。

pBackup 中的文字尚未從原始 pRange 變更,因為備份中 (文字和屬性的資料) 與內容無關,而且會個別儲存。 備份中包含的複製品實際上會變更,但資料是靜態的。

還原備份時,備份可以套用至備份內的複製或完全套用至不同的範圍。 若要將備份套用至備份內的複製品,請將 Null 傳遞至 ITfRangeBackup::Restore ,如下列程式碼範例所示:

pBackup->Restore(ec, NULL);

現在,物件包含下列專案:

Context = "This is some text."
pRange  = "text"
pClone  = "text"
pBackup = "text"

若要將備份還原至不同的範圍,請在呼叫 ITfRangeBackup::Restore時,傳遞範圍物件的指標。 備份的文字和屬性將會套用至新的範圍。 例如,在 Restore 呼叫之前使用上述範例,將會修改 pRange 來示範:

LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);

現在,物件包含下列專案:

Context = "This is some other words."
pRange  = "other wor"
pClone  = "other words"
pBackup = "text"

當 pRange 的結束錨點移轉至左側兩個位置時,pClone 的結束錨點不會變更。

現在,使用 pRange 搭配下列程式碼範例還原備份:

pBackup->Restore(ec, pRange);

現在,物件包含下列專案:

Context = "This is some textds."
pRange  = "text"
pClone  = "textds"
pBackup = "text"

pRange 所涵蓋的文字已取代為 「text」、pClone 所涵蓋的部分文字已變更,而 pBackup 變更為符合 pRange。