Gammes
Ancres
Une plage est délimitée par deux ancres , une ancre de début et une ancre de fin. Une ancre existe dans un emplacement imaginaire entre deux caractères. L’ancre de début concerne le texte qui suit l’ancre et l’ancre de fin est liée au texte qui précède l’ancre. Les ancres de début et de fin peuvent exister dans le même emplacement. Dans ce cas, la plage a une longueur nulle.
Par exemple, commencez par le texte suivant :
This is text.
Appliquez maintenant une plage à ce texte avec les ancres de début et de fin à la position 0. Elle est représentée visuellement comme suit :
<anchor></anchor>This is text.
Les ancres ne prennent pas d’espace dans le texte lui-même. Il s’agit d’une plage de longueur nulle et son texte est vide.
Maintenant, déplacez l’ancre de fin +3 positions. Elle est représentée visuellement comme suit :
<anchor>Thi</anchor>s is text.
L’ancre de début est positionnée juste avant le caractère à la position 0 et l’ancre de fin est positionnée juste après le caractère à la position 3, car l’ancre de fin est déplacée vers les 3 emplacements droit. La plage de texte est maintenant « Thi ».
En outre, l’ancre de début ne peut pas être faite pour suivre l’ancre de fin et l’ancre de fin ne peut pas être faite pour précéder l’ancre de début.
Gravité de l’ancrage
Chaque ancre a une gravité paramètre qui détermine la façon dont l’ancre répond lorsque le texte est inséré dans le flux de texte à la position d’ancrage. Lorsqu’une insertion est effectuée à la position d’une ancre, un ajustement doit être effectué à la position de l’ancre. La gravité détermine la façon dont cet ajustement de position d’ancrage est effectué.
Par exemple:
It is <anchor></anchor>cold today.
Si le mot « très » est inséré à la position de plage, l’ancre de début peut être positionnée avant ou après le mot inséré :
It is <anchor>very </anchor>cold today.
-Ou-
It is very <anchor></anchor>cold today.
La gravité de l’ancre spécifie comment l’ancrage est repositionné lorsqu’une insertion est effectuée à sa position. La gravité peut être arrière ou avant.
Si l’ancre a une gravité descendante, l’ancre se déplace vers l’arrière, par rapport au point d’insertion, afin que le texte inséré suit l’ancre :
It is <anchor>very </anchor>cold today.
Si l’ancre a une gravité vers l’avant, l’ancrage avance (par rapport au point d’insertion) lors de l’insertion afin que le texte inséré précède l’ancre :
It is very <anchor></anchor>cold today.
Clones et sauvegardes
Il existe deux façons d’effectuer une « copie » d’un objet de plage. La première consiste à créer un clone de la plage à l’aide de ITfRange ::Clone. La deuxième consiste à effectuer une de sauvegarde de la plage à l’aide de ITfContext ::CreateRangeBackup.
Un clone est une copie d’une plage qui n’inclut pas de données statiques. Les ancres de la plage sont copiées, mais le clone couvre toujours une plage de texte dans le contexte. Un clone est un objet de plage à tous égards. Cela signifie que le texte et les propriétés d’une plage cloné sont dynamiques et changeront si le texte et/ou les propriétés de la plage couvertes par les modifications du clone sont modifiées.
Une sauvegarde stocke le texte et les propriétés d’une plage au moment où la sauvegarde est effectuée en tant que données statiques. Une sauvegarde clone également la plage d’origine afin que les modifications apportées à la taille et à la position de la plage d’origine puissent être suivies. Cela signifie que le texte et les propriétés d’une plage sauvegardée sont statiques et ne changent pas si le texte et/ou les propriétés de la plage couvertes par les modifications de sauvegarde sont modifiées.
Par exemple, la plage suivante (pRange) dans le contexte :
"This is some <pRange>text</pRange>."
À présent, effectuez un clone et une sauvegarde de cette plage :
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
À présent, les objets contiennent les éléments suivants :
pRange = "text"
pClone = "text"
pBackup = "text"
Modifiez maintenant le texte de pRange :
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
À présent, les objets contiennent les éléments suivants :
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
La définition du texte a provoqué la modification du texte dans le contexte. Elle a également provoqué la modification de l’ancre de fin de pRange et de pClone. pClone contient désormais « d’autres mots », car le texte a changé dans la plage et ces modifications sont suivies par toutes les plages. Lorsque le texte couvert par pRange et pClone a changé, le texte de pClone a également changé.
Le texte de pBackup n’a pas changé à partir du pRange d’origine, car les données (texte et propriétés) dans la sauvegarde ne sont pas liées au contexte et sont stockées séparément. Le clone contenu dans la sauvegarde change réellement, mais les données sont statiques.
Lors de la restauration d’une sauvegarde, la sauvegarde peut être appliquée au clone au sein de la sauvegarde ou à une plage différente. Pour appliquer la sauvegarde au clone dans la sauvegarde, passez NULL à ITfRangeBackup ::Restore, comme illustré dans l’exemple de code suivant :
pBackup->Restore(ec, NULL);
À présent, les objets contiennent les éléments suivants :
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Pour restaurer la sauvegarde dans une autre plage, transmettez un pointeur à l’objet de plage lors de l’appel de ITfRangeBackup ::Restore. Le texte sauvegardé et les propriétés sont appliqués à la nouvelle plage. Par exemple, en utilisant l’exemple ci-dessus avant l’appel Restore, pRange sera modifié pour illustrer ceci :
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
À présent, les objets contiennent les éléments suivants :
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
Lorsque l’ancre de fin de pRange a été décalée vers les deux emplacements gauches, l’ancre de fin de pClone n’a pas changé.
Restaurez maintenant la sauvegarde à l’aide de pRange avec l’exemple de code suivant :
pBackup->Restore(ec, pRange);
À présent, les objets contiennent les éléments suivants :
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
Le texte couvert par pRange a été remplacé par « text », une partie du texte couvert par pClone a changé et pBackup change pour correspondre à pRange.