Bereiche

Anchors

Ein Bereich wird durch zwei Anker getrennt, einen Startanker und einen Endanker. Ein Anker befindet sich in einem imaginären Slot zwischen zwei Zeichen. Der Startanker bezieht sich auf Text, der dem Anker folgt, und der Endanker bezieht sich auf Text, der dem Anker vorangestellt ist. Sowohl der Start- als auch der Endanker können am gleichen Ort vorhanden sein. In diesem Fall hat der Bereich die Länge null.

Beginnen Sie beispielsweise mit dem folgenden Text:

This is text.

Wenden Sie nun einen Bereich auf diesen Text an, wobei sowohl der Start- als auch der Endanker an Position 0 liegt. Sie wird visuell wie folgt dargestellt:

<anchor></anchor>This is text.

Die Anker nehmen keinen Platz im Text selbst ein. Dies ist ein Bereich der Länge null, und der Text ist leer.

Verschieben Sie nun den Endanker um +3 Positionen. Sie wird visuell wie folgt dargestellt:

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

Der Startanker befindet sich kurz vor dem Zeichen in Position 0 und der Endanker wird direkt hinter dem Zeichen in Position 3 positioniert, da der Endanker 3 Stellen nach rechts verschoben wurde. Der Textbereich ist jetzt "Thi".

Darüber hinaus kann der Startanker nicht so festgelegt werden, dass er dem Endanker folgt, und der Endanker kann nicht dem Startanker vorangestellt werden.

Ankergravitation

Jeder Anker verfügt über eine Schwerkrafteinstellung , die bestimmt, wie der Anker reagiert, wenn Text an der Ankerposition in den Textstream eingefügt wird. Wenn an der Position eines Ankers ein Eingefügt wird, muss eine Anpassung in der Position des Ankers vorgenommen werden. Die Schwerkraft bestimmt, wie diese Ankerpositionsanpassung erfolgt.

Beispiel:

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

Wenn das Wort "very" an der Bereichsposition eingefügt wird, kann der Startanker entweder vor oder nach dem eingefügten Wort positioniert werden:

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

- Oder -

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

Die Ankergravitität gibt an, wie der Anker neu positioniert wird, wenn an seiner Position ein Eingefügt wird. Die Schwerkraft kann entweder rückwärts oder vorwärts sein.

Wenn der Anker rückwärtsschwert ist, bewegt sich der Anker beim Einfügen relativ zur Einfügemarke nach hinten, sodass der eingefügte Text dem Anker folgt:

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

Wenn der Anker eine Vorwärtsgravitation aufweist, bewegt sich der Anker beim Einfügen nach vorne (relativ zur Einfügemarke), sodass der eingefügte Text dem Anker vorangestellt wird:

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

Klone und Sicherungen

Es gibt zwei Möglichkeiten, eine "Kopie" eines Bereichsobjekts zu erstellen. Die erste besteht darin, einen Klon des Bereichs mithilfe von ITfRange::Clone zu erstellen. Die zweite besteht darin, eine Sicherung des Bereichs mithilfe von ITfContext::CreateRangeBackup zu erstellen.

Ein Klon ist eine Kopie eines Bereichs, der keine statischen Daten enthält. Die Anker des Bereichs werden kopiert, aber der Klon deckt weiterhin einen Textbereich innerhalb des Kontexts ab. Ein Klon ist in allen Belangen ein Bereichsobjekt. Dies bedeutet, dass der Text und die Eigenschaften für einen geklonten Bereich dynamisch sind und sich ändern, wenn sich der Text und/oder die Eigenschaften des durch den Klon abgedeckten Bereichs ändern.

Eine Sicherung speichert den Text und die Eigenschaften eines Bereichs zum Zeitpunkt der Sicherung als statische Daten. Eine Sicherung klont auch den ursprünglichen Bereich, sodass Änderungen an der Größe und Position des ursprünglichen Bereichs nachverfolgt werden können. Dies bedeutet, dass der Text und die Eigenschaften für einen gesicherten Bereich statisch sind und sich nicht ändern, wenn sich der Text und/oder die Eigenschaften des von der Sicherung abgedeckten Bereichs ändern.

Beispielsweise der folgende Bereich (pRange) innerhalb des Kontexts:

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

Erstellen Sie nun einen Klon und eine Sicherung dieses Bereichs:

ITfRange *pClone;
ITfRangeBackup *pBackup;

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

Nun enthalten die -Objekte Folgendes:

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

Ändern Sie nun den Text von pRange:

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

Nun enthalten die -Objekte Folgendes:

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

Das Festlegen des Texts hat dazu geführt, dass sich der Text im Kontext änderte. Außerdem änderte sich der Endanker von pRange und pClone. pClone enthält jetzt "andere Wörter", da sich der Text innerhalb des Bereichs geändert hat und diese Änderungen von allen Bereichen nachverfolgt werden. Wenn sich der von pRange und pClone abgedeckte Text geändert hat, hat sich auch der Text von pClone geändert.

Der Text in pBackup hat sich gegenüber dem ursprünglichen pRange nicht geändert, da die Daten (Text und Eigenschaften) in der Sicherung nicht mit dem Kontext zusammenhängen und separat gespeichert werden. Der in der Sicherung enthaltene Klon ändert sich tatsächlich, aber die Daten sind statisch.

Beim Wiederherstellen einer Sicherung kann die Sicherung auf den Klon innerhalb der Sicherung oder vollständig auf einen anderen Bereich angewendet werden. Um die Sicherung auf den Klon innerhalb der Sicherung anzuwenden, übergeben Sie NULL an ITfRangeBackup::Restore , wie im folgenden Codebeispiel gezeigt:

pBackup->Restore(ec, NULL);

Nun enthalten die -Objekte Folgendes:

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

Um die Sicherung in einem anderen Bereich wiederherzustellen, übergeben Sie beim Aufrufen von ITfRangeBackup::Restore einen Zeiger auf das Bereichsobjekt. Der gesicherte Text und die Eigenschaften werden auf den neuen Bereich angewendet. Beispielsweise wird pRange mithilfe des obigen Beispiels vor dem Wiederherstellungsaufruf geändert, um dies zu veranschaulichen:

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

Nun enthalten die -Objekte Folgendes:

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

Als der Endanker von pRange an zwei Stellen nach links verschoben wurde, änderte sich der Endanker von pClone nicht.

Stellen Sie nun die Sicherung mithilfe von pRange mit dem folgenden Codebeispiel wieder her:

pBackup->Restore(ec, pRange);

Nun enthalten die -Objekte Folgendes:

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

Der von pRange abgedeckte Text wurde durch "text" ersetzt, ein Teil des von pClone abgedeckten Texts wurde geändert, und pBackup ändert sich, um pRange zu entsprechen.