编辑上下文

应用程序

若要创建编辑上下文,应用程序会调用 ITfDocumentMgr::CreateContext

文本服务

文本服务通常使用当前处于活动状态的编辑上下文。 当前活动编辑上下文是活动文档管理器堆栈顶部的编辑上下文。 若要获取当前活动上下文,文本服务调用 ITfThreadMgr::GetFocus 以获取活动文档管理器,然后调用 ITfDocumentMgr::GetTop 以获取堆栈顶部的编辑上下文。

在某些情况下,文本服务需要自己的编辑上下文。 若要创建编辑上下文,文本服务会调用 ITfDocumentMgr::CreateContext

编辑 Cookie

许多方法(如 ITfRange::SetText)都需要一种方法来标识具有只读或读/写 文档锁的编辑上下文。 文档锁是通过 TSF 管理器与应用程序之间的协商获取的。 文本服务无法直接执行此协商。 文本服务只能通过请求具有特定上下文和只读或读/写访问权限的 编辑会话 来获取锁。 授予编辑会话后,文本服务会提供 一个编辑 Cookie ,用于标识具有所请求访问权限的编辑上下文。 然后,将此 Cookie 传递给 方法,以识别具有适当访问权限的编辑上下文。

ITfDocumentMgr::CreateContext 还向上下文创建者提供编辑 Cookie。 此 Cookie 具有只读访问权限,无法修改访问级别。 事实上,TSF 管理器不会协商此编辑 Cookie 的文档锁。 Cookie 在内部标记为只读,但文档实际上未锁定。 例如,如果上下文创建者使用 ITfDocumentMgr ::CreateContext 返回的编辑 Cookie 调用 ITfContext::GetSelection ,则会导致调用应用程序的 ITextStoreACP::GetSelectionITextStoreAnchor::GetSelection 。 在获取所选内容之前,应用程序将确定文档锁是否存在。 由于不存在锁,因此应用程序将失败并TS_E_NOLOCK。 也就是说,如果应用程序使用此 Cookie 调用方法,导致调用应用程序的文本存储方法之一,则必须在内部处理这种情况,因为应用程序实际上不会具有文档锁。

如果上下文创建者需要具有读/写访问权限的编辑 Cookie,则必须建立自己的编辑会话。

ITfContext

ITfDocumentMgr::CreateContext

ITfThreadMgr::GetFocus

ITfDocumentMgr::GetTop

ITfRange::SetText

文档锁定

编辑会话

ITfContext::GetSelection

ITextStoreACP::GetSelection

ITextStoreAnchor::GetSelection