该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
总算弄明白怎么设置输入法的显示位置了!!
直接用ImmSetCompositionWindow就是了,不需要用ImmSetCandidateWindow
手动改掉SDL中WIN_SetTextInputRect的实现,就可以正常设置输入法的位置。
不过 状态栏 在全屏模式不能显示
原本 SDL是打算自己渲染候选列表及状态框什么的,
所以SetTextInputRect就鸡肋了,是设置了它自己的UI的位置,
同样的理由,它没把控制返回给操作系统,截获掉渲染任务。
然而 UI根本没加载成功,也就无法渲染成了,
我们就看不到输入法状态栏及候选列表之类的东西了。
videodata->ime_uiless = UILess_SetupSinks(videodata);
没成功初始化,
因为CoCreateInstance(&CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfThreadMgrEx, (LPVOID *)&videodata->ime_threadmgrex)
这行create不成功。
综上
几乎不指望SDL能如我所愿了,它的目的与我想的不一样,它想自己控制输入的渲染。
但通过改源码已经可以达成目的
具体为:
IME_HandleMessage 最后行 return SDL_FALSE;
嘛其实还不太稳妥 如果你用了SDL_CreateWindowFrom 估计又会有某些影响
似乎还要改src\video\windows\SDL_windowsevents.c
好麻烦不管了 。
要SetTextInputRect能用的话
在WIN_SetTextInputRect中使用ImmSetCompositionWindow
大致是这样干:
RECT set_rect={rect->x,rect->y,rect->w,rect->h};
POINT pos={rect->x,rect->y};
COMPOSITIONFORM com_pos;
BOOL res=0;
com_pos.dwStyle=CFS_RECT;
com_pos.ptCurrentPos=pos;
com_pos.rcArea=set_rect;
res=ImmSetCompositionWindow(videodata->ime_himc,&com_pos);
if(res==0)按道理应该检查的,但WIN_SetTextInputRect根本没返回值,
嘛,其实可以把返回值扔进用户提供的那rect (逃...
//SDL打算自己渲染于是干脆利落的断定不会出错么?