ITfEditSession接口
ITfEditSession 接口由文本服务实现,用于TSF 管理器对Context的访问。
1.方法
该接口只有一个DoEditSession方法,用于实现文本服务对Context内容的读写。原型为:
HRESULT DoEditSession(
TfEditCookie ec
);
该方法只有一个TfEditCookie类型的参数ec,其为EditSession的唯一标识。
该方法操作成功,应反回S_OK;否则应返回E_FIAL。
2.开启
(1)文本服务通过调用 ITfContext::RequestEditSession方法,传入ITfEditSession接口的实例指针来开启编辑会话。编辑会话授予后,TSF 管理器将调用 DoEditSession。
(2)编辑会话有三种开启模式:
一是同步模式,标志为TF_ES_SYNC。以该模式开启的编辑会话会被立即处理,并在所有被挂起的异步编辑会话之前得到处理。
二是异步模式,标志为TF_ES_ASYNC。以该标志开启的编辑会话不会立即处理而会被挂起,然后按接收的先后顺序处理。
三是自动模式,标志为TF_ES_ASYNCDONTCARE。以该模式开启的编辑会话,即可以是同步,也可以是异步,具体由TSF 管理器自行决定。管理器将尝试优先安排同步编辑会话,以提高性能。
(3)编辑会话有两种访问方式:一是只读方式,标志为TF_ES_READ。以该方式开启的编辑会话,只能对Context进行读取操作。二是读写方式,标志为TF_ES_REAFWRITE。以该方式开启的编辑会话,可以对Context进行读写操作。
(4)文本服务可以在已有编辑会话的Context中开启一个新的编辑会话。前提是在只读编辑会话中不开启读写编辑会话。在由另一个文本服务建立的编辑会话的Context中不能开启新的编辑会话。
(5)在以下的接口方法中,不能以同步读写的方式开启编辑会话,否则将失败:在处理以下通知之一时,如果发出同步读/写请求,将失败。
ITfTexteditsink::onEndEdit;
ITfTextlayoutsink::onLayoutChange;
ITfStatussink::OnStatuschange;
3.备注
(1)如果Context在应用程序授予锁之前被销毁,或者调用的文本服务在授予锁之前被停用, DoEditSession 方法都不会调用。因此,文本服务应在 ITfEditSession 接口的析构函数中,而不是在 DoEditSession 方法中为编辑会话执行清理操作。
(2)一般而言,Composition应通过同步编辑会话开启,在其生存期内的的编辑会话(包括Composition的结束)则应以自动模式开启,以防止会话冲突(会话冲突会引发onCompositionTerminated提前结束Composition)。