Текстовые хранилища
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 текстового потока для изменения текста.
Для работы с текстом диспетчер использует методы на основе ACP. Однако для клиентов Microsoft Active Accessibility , поддерживающих привязки, доступен подход, основанный на привязках, при котором менеджер использует методы ITextStoreAnchor и ITextStoreAnchorSink для переноса методов ITextStoreACP и ITextStoreACPSink .
Текстовое хранилище управляет доступом к текстовому потоку с помощью блокировок документов. Чтобы прочитать или изменить текстовое хранилище, руководитель должен сначала установить приемник рекомендаций, поддерживающий интерфейс ITextStoreACPSink , вызвав метод ITextStoreACP::AdviseSink и передав указатель на приемник рекомендаций. Приемник рекомендаций позволяет руководителю получать блокировки документов в текстовом хранилище и получать уведомления, когда текстовое хранилище изменяется не руководителем, например ввод данных пользователем через приложение. Рекомендуется, чтобы приемники обсуждались далее в этом разделе.
Приложение инициализирует текстовое хранилище, выполнив следующие действия.
Создайте объект диспетчера потоков на основе интерфейса ITfThreadMgr , вызвав функцию CoCreateInstance с указателем на объект диспетчера потоков. Ниже приведен пример кода реализации объекта диспетчера потоков.
hr = CoCreateInstance (CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr);
Активируйте объект диспетчера потоков, вызвав метод ITfThreadMgr::Activate . Этот метод предоставляет указатель на идентификатор клиента , используемый для создания объекта контекста. Диспетчер потоков используется для реализации объекта диспетчера документов.
Создайте объект диспетчера документов на основе интерфейса ITfDocumentMgr , вызвав метод ITfThreadMgr::CreateDocumentMgr с указателем на объект диспетчера документов. Объект диспетчера документов используется для реализации объекта контекста, который является текстовым хранилищем.
Создайте объект контекста из диспетчера документов, вызвав метод ITfDocumentMgr::CreateContext с указателем на объект хранилища текста и указателем на идентификатор клиента из активации диспетчера потоков. Ниже приведен пример создания объекта контекста.
hr = pDocumentMgr->CreateContext(m_ClientID, 0, (ITextStoreACP*)this, &pContext, pEditCookie);
Отправьте объект контекста в стек с помощью метода ITfDocumentMgr::P ush . Ниже приведен пример отправки объекта контекста в стек:
hr = pDocumentMgr->Push(pContext);
Метод ITfDocumentMgr::P ush вызывает ITextStoreACP::AdviseSink с указателем на интерфейс приемника рекомендаций для установки нового приемника рекомендаций или изменения существующего приемника рекомендаций. Приемник рекомендаций получает уведомления, когда текстовое хранилище изменяется не руководителем, например ввод данных пользователем в приложение. Приложения должны вызывать метод ITfThreadMgrEventSink::OnSetFocus , когда входной метод получает фокус. Другие уведомления диспетчеру потоков предоставляются путем вызова соответствующих методов интерфейса ITextStoreACPSink .
Однако приложения не должны вызывать методы интерфейса ITextStoreACPSink в ответ на методы интерфейса ITextStoreACP . Приложения должны вызывать методы интерфейса ITextStoreACPSink , только если текстовое хранилище изменяется не диспетчером.
Содержимое текстового хранилища можно изменить с помощью временного входного состояния, называемого композицией.