文本存储

应用程序字符位置 (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 客户端可以使用基于 定位点的方法,其中管理器使用 ITextStoreAnchorITextStoreAnchorSink 方法来包装 ITextStoreACPITextStoreACPSink 方法。

文档访问控制

文本存储使用 文档锁控制对文本流的访问。 若要读取或修改文本存储,管理器必须先安装支持 ITextStoreACPSink 接口的建议接收器,方法是调用 ITextStoreACP::AdviseSink 方法并将指针传递到建议接收器。 建议接收器使经理能够获取文本存储上的文档锁,并在文本存储被管理员以外的其他内容(例如用户通过应用程序输入)修改时接收通知。 本主题稍后将讨论建议接收器。

如何初始化文本存储

应用程序通过完成以下步骤初始化文本存储:

  1. 通过使用指向线程管理器对象的指针调用 CoCreateInstance 函数,基于 ITfThreadMgr 接口创建线程管理器对象。 下面是实现线程管理器对象的代码示例。

    hr = CoCreateInstance (CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, 
                            IID_ITfThreadMgr, (void**)&pThreadMgr);
    
  2. 通过调用 ITfThreadMgr::Activate 方法激活 线程管理器对象。 此方法提供指向用于创建上下文对象的 客户端标识符 的指针。 线程管理器用于实现文档管理器对象。

  3. 使用指向文档管理器对象的指针调用 ITfThreadMgr::CreateDocumentMgr 方法,基于 ITfDocumentMgr 接口创建文档管理器对象。 文档管理器对象用于实现作为文本存储的上下文对象。

  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