범위
앵커
범위는 시작 앵커와 끝 앵커라는 두 개의 앵커로 구분됩니다. 앵커는 두 문자 사이의 가상 슬롯에 존재합니다. 시작 앵커는 앵커 뒤에 오는 텍스트와 관련이 있고 끝 앵커는 앵커 앞에 오는 텍스트와 관련이 있습니다. 시작 앵커와 끝 앵커는 모두 동일한 위치에 있을 수 있습니다. 이 경우 범위의 길이는 0입니다.
예를 들어 다음 텍스트로 시작합니다.
This is text.
이제 시작 앵커와 끝 앵커가 모두 0 위치에 있는 이 텍스트에 범위를 적용합니다. 시각적으로 다음과 같이 표시됩니다.
<anchor></anchor>This is text.
앵커는 텍스트 자체 내에서 공간을 차지하지 않습니다. 길이가 0인 범위이며 텍스트가 비어 있습니다.
이제 끝 앵커 +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를 호출할 때 범위 개체에 대한 포인터를 전달합니다. 백업된 텍스트 및 속성이 새 범위에 적용됩니다. 예를 들어 복원 호출 전에 위의 예제를 사용하여 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에서 다루는 텍스트의 일부가 변경되었으며 pRange와 일치하도록 pBackup이 변경되었습니다.