Поделиться через


Диапазоны

Якоря

Диапазон разделен двумя привязками, начальной привязкой и конечной привязкой. Привязка существует в мнимом слоте между двумя символами. Начальная привязка относится к тексту, который следует привязке и конечной привязке относится к тексту, который предшествует привязке. И начальные, и конечные привязки могут существовать в одном расположении. В этом случае диапазон имеет нулевую длину.

Например, начните со следующего текста:

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. Резервные копии текста и свойств будут применены к новому диапазону. Например, используя приведенный выше пример перед вызовом 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.