Изменение контекстов
Чтобы создать контекст редактирования, приложение вызывает ITfDocumentMgr::CreateContext.
Текстовая служба часто использует текущий активный контекст редактирования. Текущий активный контекст редактирования — это контекст редактирования в верхней части стека активного диспетчера документов. Чтобы получить текущий активный контекст, текстовая служба вызывает ITfThreadMgr::GetFocus для получения активного диспетчера документов, а затем вызывает ITfDocumentMgr::GetTop , чтобы получить контекст редактирования в верхней части стека.
В некоторых случаях службе текста требуется собственный контекст редактирования. Чтобы создать контекст редактирования, текстовая служба вызывает ITfDocumentMgr::CreateContext.
Для многих методов, таких как ITfRange::SetText, требуется способ определения контекста редактирования, имеющего блокировку документа только для чтения или чтения и записи. Блокировка документа достигается путем согласования между диспетчером TSF и приложением. Служба текста не может выполнять это согласование напрямую. Текстовая служба может получить блокировку только путем запроса сеанса редактирования с определенным контекстом и доступом только для чтения или чтения и записи. При предоставлении сеанса редактирования службе текста предоставляется файл cookie редактирования , определяющий контекст редактирования с запрошенным доступом. Затем этот файл cookie передается методу для идентификации контекста редактирования с соответствующим доступом.
ITfDocumentMgr::CreateContext также предоставляет файл cookie редактирования создателю контекста. Этот файл cookie имеет доступ только для чтения, и изменить уровень доступа невозможно. По правде говоря, менеджер TSF не согласовывает блокировку документа для этого файла cookie редактирования. Файл cookie внутренне помечен как доступный только для чтения, но документ фактически не заблокирован. Например, если создатель контекста вызывает ITfContext::GetSelection с файлом cookie редактирования, возвращенным ITfDocumentMgr::CreateContext , это приводит к вызову ITextStoreACP::GetSelection или ITextStoreAnchor::GetSelection . Перед получением выбора приложение определит, существует ли блокировка документа. Так как блокировки не существует, приложение завершится сбоем с TS_E_NOLOCK. То есть, если приложение вызывает метод с этим файлом cookie, что приводит к вызову одного из методов хранилища текста приложения, оно должно обрабатывать этот случай внутренне, так как приложение фактически не будет иметь блокировки документа.
Если создателю контекста требуется файл cookie редактирования с доступом на чтение и запись, он должен создать собственный сеанс редактирования.