范围
锚
范围由两个 定位点分隔,、开始定位点和结束定位点。 定位点存在于两个字符之间的虚槽中。 开始定位点与定位点后面的文本相关,结束定位点与定位点前面的文本相关。 开始定位点和结束定位点可以位于同一位置。 在这种情况下,范围长度为零。
例如,从以下文本开始:
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时,将指针传递给 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。