Поделиться через


Текстовые хранилища

Положение символов приложения (ACP)

ACP — это расположение символа или символов в текстовом потоке, которое выражается в виде количества символов от начала текстового потока. Так как модель ACP основана на нулях, первый символ в текстовом потоке имеет значение ACP, равное нулю. Пример:

Text Stream  H | e | l | l | o |   | W | o | r | l | d
ACP          0   1   2   3   4   5   6   7   8   9   10

Текстовое хранилище реализует объект, поддерживающий интерфейс ITextStoreACP , который позволяет выразить текстовый поток в ACP. Методы интерфейса ITextStoreACP используют диапазон ACP текстового потока для изменения текста.

Приложения Anchor-Based

Для работы с текстом диспетчер использует методы на основе ACP. Однако для клиентов Microsoft Active Accessibility , поддерживающих привязки, доступен подход, основанный на привязках, при котором менеджер использует методы ITextStoreAnchor и ITextStoreAnchorSink для переноса методов ITextStoreACP и ITextStoreACPSink .

Контроль доступа документов

Текстовое хранилище управляет доступом к текстовому потоку с помощью блокировок документов. Чтобы прочитать или изменить текстовое хранилище, руководитель должен сначала установить приемник рекомендаций, поддерживающий интерфейс ITextStoreACPSink , вызвав метод ITextStoreACP::AdviseSink и передав указатель на приемник рекомендаций. Приемник рекомендаций позволяет руководителю получать блокировки документов в текстовом хранилище и получать уведомления, когда текстовое хранилище изменяется не руководителем, например ввод данных пользователем через приложение. Рекомендуется, чтобы приемники обсуждались далее в этом разделе.

Инициализация хранилища текста

Приложение инициализирует текстовое хранилище, выполнив следующие действия.

  1. Создайте объект диспетчера потоков на основе интерфейса ITfThreadMgr , вызвав функцию CoCreateInstance с указателем на объект диспетчера потоков. Ниже приведен пример кода реализации объекта диспетчера потоков.

    hr = CoCreateInstance (CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, 
                            IID_ITfThreadMgr, (void**)&pThreadMgr);
    
  2. Активируйте объект диспетчера потоков, вызвав метод ITfThreadMgr::Activate . Этот метод предоставляет указатель на идентификатор клиента , используемый для создания объекта контекста. Диспетчер потоков используется для реализации объекта диспетчера документов.

  3. Создайте объект диспетчера документов на основе интерфейса ITfDocumentMgr , вызвав метод ITfThreadMgr::CreateDocumentMgr с указателем на объект диспетчера документов. Объект диспетчера документов используется для реализации объекта контекста, который является текстовым хранилищем.

  4. Создайте объект контекста из диспетчера документов, вызвав метод ITfDocumentMgr::CreateContext с указателем на объект хранилища текста и указателем на идентификатор клиента из активации диспетчера потоков. Ниже приведен пример создания объекта контекста.

    hr = pDocumentMgr->CreateContext(m_ClientID, 0, (ITextStoreACP*)this, 
                                    &pContext, pEditCookie);
    
  5. Отправьте объект контекста в стек с помощью метода ITfDocumentMgr::P ush . Ниже приведен пример отправки объекта контекста в стек:

    hr = pDocumentMgr->Push(pContext);
    

Изменение хранилища текста

Метод ITfDocumentMgr::P ush вызывает ITextStoreACP::AdviseSink с указателем на интерфейс приемника рекомендаций для установки нового приемника рекомендаций или изменения существующего приемника рекомендаций. Приемник рекомендаций получает уведомления, когда текстовое хранилище изменяется не руководителем, например ввод данных пользователем в приложение. Приложения должны вызывать метод ITfThreadMgrEventSink::OnSetFocus , когда входной метод получает фокус. Другие уведомления диспетчеру потоков предоставляются путем вызова соответствующих методов интерфейса ITextStoreACPSink .

Однако приложения не должны вызывать методы интерфейса ITextStoreACPSink в ответ на методы интерфейса ITextStoreACP . Приложения должны вызывать методы интерфейса ITextStoreACPSink , только если текстовое хранилище изменяется не диспетчером.

Содержимое текстового хранилища можно изменить с помощью временного входного состояния, называемого композицией.

Привязки

Композиции

Блокировки документов

ITextStoreACPSink

ITextStoreACP

ITextStoreAnchor

ITextStoreAnchorSink

ITfDocumentMgr

ITfThreadMgr

ITfThreadMgreventSink::OnSetFocus

TfClientId

Microsoft Active Accessibility