范围

定位点

范围由两个 定位点(一个开始定位点和一个结束定位点)分隔。 定位点存在于两个字符之间的虚槽中。 起始定位点与定位点后面的文本相关,结束定位点与定位点前面的文本相关。 起始定位点和结束定位点可以位于同一位置。 在本例中,该区域的长度为零。

例如,从以下文本开始:

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.

如果在范围位置插入单词“非常”,则可以在插入的单词之前或之后定位起始定位点:

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 时传递指向 range 对象的指针。 备份的文本和属性将应用于新区域。 例如,在 还原 调用之前使用上述示例,将修改 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。