Freigeben über


Schussbereiche

Anker

Ein Bereich wird durch zwei Anker, einen Startanker und einen Endanker getrennt. Ein Anker ist in einem imaginären Slot zwischen zwei Zeichen vorhanden. Der Anfangsanker bezieht sich auf Text, der auf den Anker folgt, und der Endanker bezieht sich auf Text, der vor dem Anker steht. Sowohl die Start- als auch die Endanker können an derselben Position vorhanden sein. In diesem Fall weist der Bereich die Länge null auf.

Beginnen Sie beispielsweise mit dem folgenden Text:

This is text.

Wenden Sie nun einen Bereich auf diesen Text an, wobei sowohl die Anfangs- als auch die Endanker an Position 0 enthalten sind. Sie wird visuell dargestellt als:

<anchor></anchor>This is text.

Die Anker nehmen keinen Platz innerhalb des Texts selbst ein. Dies ist ein Bereich der Länge Null, und der Text ist leer.

Verschieben Sie nun die Endanker +3 Positionen. Sie wird visuell dargestellt als:

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

Der Startanker wird direkt vor dem Zeichen an Position 0 positioniert, und der Endanker wird direkt hinter dem Zeichen in Position 3 positioniert, da der Endanker an die rechten 3 Stellen verschoben wurde. Der Textbereich ist jetzt "Thi".

Darüber hinaus kann der Startanker nicht erfolgen, um dem Endanker zu folgen, und der Endanker kann nicht vor dem Startanker erfolgen.

Verankerungskraft

Jeder Anker verfügt über eine schwerkraft Einstellung, die bestimmt, wie der Anker reagiert, wenn Text an der Verankerungsposition in den Textstrom eingefügt wird. Wenn an der Position eines Ankers eine Einfügung vorgenommen wird, muss an der Position des Ankers eine Anpassung vorgenommen werden. Die Schwerkraft bestimmt, wie diese Ankerpositionsanpassung vorgenommen wird.

Zum Beispiel:

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

Wenn das Wort "sehr" 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 Verankerungskraft gibt an, wie der Anker neu positioniert wird, wenn eine Einfügung an der Position erfolgt. Die Schwerkraft kann entweder rückwärts oder vorwärtssein.

Wenn der Anker rückwärts schwer ist, bewegt sich der Anker rückwärts, relativ zur Einfügemarke, auf der Einfügemarke, damit der eingefügte Text dem Anker folgt:

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

Wenn der Anker die Schwerkraft vorwärts hat, bewegt sich der Anker (relativ zur Einfügemarke) bei der Einfügemarke vorwärts, sodass der eingefügte Text vor dem Anker steht:

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

Klonen und Sicherungen

Es gibt zwei Möglichkeiten, eine "Kopie" eines Bereichsobjekts zu erstellen. Die erste besteht darin, einen Klon des Bereichs mithilfe von ITfRange::Clonezu erstellen. Die zweite besteht darin, mithilfe von ITfContext::CreateRangeBackupeine Sicherungs- des Bereichs 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 im Kontext ab. Ein Klon ist ein Bereichsobjekt in aller Hinsicht. 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 Bereichs ändern, der vom Klon abgedeckt wird.

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 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 Bereichs ändern, der von der Sicherung abgedeckt wird.

Der folgende Bereich (pRange) beispielsweise 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);

Jetzt 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));

Jetzt enthalten die Objekte Folgendes:

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

Durch Festlegen des Texts wurde der Text im Kontext geändert. Es führte auch dazu, dass sich der Endanker von pRange und pClone änderte. pClone enthält jetzt "andere Wörter", da der Text innerhalb des Bereichs geändert wurde und diese Änderungen von allen Bereichen nachverfolgt werden. Wenn der von pRange und pClone abgedeckte Text geändert wurde, änderte sich auch der Text von pClone.

Der Text in pBackup hat sich nicht von der ursprünglichen pRange geändert, da die Daten (Text und Eigenschaften) in der Sicherung nicht mit dem Kontext verknüpft sind 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);

Jetzt 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 einen Zeiger auf das Bereichsobjekt, wenn Sie ITfRangeBackup::Restoreaufrufen. Der gesicherte Text und die Eigenschaften werden auf den neuen Bereich angewendet. Beispielsweise wird pRange mithilfe des obigen Beispiels vor dem aufruf Wiederherstellen geändert, um folgendes zu veranschaulichen:

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

Jetzt enthalten die Objekte Folgendes:

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

Als der Endanker von pRange an die linken beiden Stellen 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);

Jetzt 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-Änderungen an pRange.