在TSF框架中有时候我们需要通过框架上屏一些占位字符来进行定位,这时候我们就需要对预先上屏的字符进行管理,以微软的输入法为例图中红框框选出来的部分就是预先上屏的字符。

image.png

在TSF框架中通过ITfRange类来对这个上屏的字符串进行控制。在进行控制的时候我们通过ITfComposition的接口来获取对应的ITfRange实例,在获取对应的实例之后,我们就可以通过ITfRange的对应的接口来进行控制上屏的字符串了。
ITfRange中的几个比较关键的接口说明如下:

//改接口主要负责设置预先上屏的字符串的内容
HRESULT SetText(
  [in] TfEditCookie ec,       //会话实例
  [in] DWORD        dwFlags,  //是否纠正内容一般设置为TF_IE_CORRECTION
  [in] const WCHAR  *pchText, //显示的内容
  [in] LONG         cch       //内容的长度
);
//ITfRange通过两个anchor锚来对预先上屏的字符串进行选择和定位
//start-anchor......end-anchor
//ShiftEnd负责对结束的锚点进行移动
HRESULT ShiftEnd(
  [in]  TfEditCookie      ec,     //上下文状态
  [in]  LONG              cchReq, //指定移动的偏移量
  [out] LONG              *pcch,  //实际移动的偏移量
  [in]  const TF_HALTCOND *pHalt //指定移动的条件,一般给定为空就行
);
//ShiftStart负责对开始的锚点进行移动
HRESULT ShiftStart(
  [in]  TfEditCookie      ec,
  [in]  LONG              cchReq,
  [out] LONG              *pcch,
  [in]  const TF_HALTCOND *pHalt
);
//如果想要移动预先上屏的字符串中的光标的话,同时移动两个锚点就可以了
//将两个锚点同时移动到某一个位置,该位置可以是
//TF_ANCHOR_START(开头)TF_ANCHOR_END(结束)
HRESULT Collapse(
  [in] TfEditCookie ec,
  [in] TfAnchor     aPos
);

   下面介绍如何在TSF输入法框架中添加ITfRange预先上屏的内容。并对其中的光标进行移动。

//TSF框架传递进来的Composition实例
ITfComposition* _pComposition;
//预先上屏的字符串内容的实例
ITfRange* _pCompositionRange;

//获取当前编辑状态的ITfRange
if (SUCCEEDED(_pComposition->GetRange(&_pCompositionRange)))
{
    //获取需要显示的文本内容的长度
    wchar_t* content = L"ce'shi'shu'ru'fa";
    int str_len = _tcslen(content);
    wstring output_wstr;
 
    //屏蔽掉音节分割的分割符号
    for (int index = 0; index < str_len; ++index)
    {
        if (content[index] == wchar_t(L'\''))
        {
            continue;
        }
        output_wstr.push_back(content[index]);
    }
 
    //向ITfRange中添加需要显示的字符
    _pCompositionRange->SetText(ec, TF_IE_CORRECTION, output_wstr.c_str(),
      output_wstr.length());
   
    //获取当前操作环境中的光标位置
    int pos = context->cursor_pos;
   //设置光标的偏移位置
    int sel_start = pos, sel_end = pos;
    //对光标位置进行移动
    LONG cch;
    TF_SELECTION tfSelection_tmp;
   //将初始位置设置到内容开始的地方
    pRangeComposition->Collapse(ec, TF_ANCHOR_START);
   //根据光标位置对预先上屏的内容中的光标进行移动
    pRangeComposition->ShiftEnd(ec, sel_end, &cch, NULL);
    pRangeComposition->ShiftStart(ec, sel_start, &cch, NULL);
 
   //将修改设置会TSF框架
    tfSelection_tmp.range = pRangeComposition;
    tfSelection_tmp.style.ase = TF_AE_NONE;
    tfSelection_tmp.style.fInterimChar = FALSE;
    context->SetSelection(ec, 1, &tfSelection_tmp);
}



相关推荐

基于文本服务框架(tsf)拼音输入法研究与实现

摘要:目前的输入法大多采用输入法管理器-输入法编辑器(IMM-IME)进行开发,对于微软发布的新型输入法技术―文本服务框架(TSF)的研究一直比较滞后,该文论述了 TSF 的基本构成、主要接口、输入法

输入法tsf框架候选栏定位研究

在开发输入法应用的时候,我们需要让候选栏时刻跟踪输入光标的位置,来进行输入。但候选栏定位不准,一直会困扰输入法的开发者。windows老的输入法框架imm在部分场景下比如chrome应用中会定位不准,

输入法管理器(IMM)函数大全(Windows CE 5.0)

imm好像要被弃用了 还是研究TSF输入法 吧 ,虽然没啥鸟用了 但是还是搬运一下下吧EnumRegisterWordProc此函数是与一起使用的应用程序定义的回调函数ImmEnumRegisterW

输入法编程之 输入法管理输入法上下文

完整的文档参考:https://docs.microsoft.com/zh-cn/windows/win32/intl/input-context"输入上下文" 是由 IMM 维护

tsftext services framework)和输入法

1.TSF输入接口IMM-IME架构成熟,稳定,易于实现,在Windows中被广泛使用,甚至在Linux曾大量使用的中文输入接口SCIM中也可以看到IMM-IME的影子。但是由于IMM-IME在操作权

微软输入法tsf sampleIME 源码分析(转载)

类:CCandidateWindow,候选字窗口CCompositionPricessorEngine,拼写引擎CSampleIME,主程序CStringRange, 一个特殊的字符串类 见于 Sam

64位输入法DLL注 (tsf)方案

微软两种输入法方案XP和XP以前是imm(Input Method Manager)输入方案.xp之后的系统是imm和TSF(Text Service Framework)输入方案.共存. win8

tsf输入法

TSF 即文本服务框架的英文缩写微软官方文档(文本服务框架) https://learn.microsoft.com/zh-cn/windows/win32/tsf/text-services-fra

输入法开发之:疑难杂症

套娃开始:当键盘事件被触发时,获得的参数是ITfContext。但是ITfContext并不能直接修改内容添加文字等,需要调用RequestEditSession,传入一个ITfEditSession

获取输入法坐标

以下是微软TSF输入法取坐标的方法,从里面扒出来的int 取坐标(ITfContext *pContext, TfEditCookie ec, ITfComposition* pRangeCompos