关于IME
sdl吧
全部回复
仅看楼主
level 11
铃铛兮 楼主
@仅剩的梦
目前你给出的解决方法是最靠谱的
http://www.freeors.com/bbs/forum.php?mod=viewthread&tid=22189&extra=page%3D1%26filter%3Dtypeid%26typeid%3D40
官方论坛那边的外国人似乎没办法搞这问题。
似乎他们用的很顺利?见Jiang Jiang的回帖
http://forums.libsdl.org/viewtopic.php?t=9389
2015年03月21日 13点03分 1
level 11
铃铛兮 楼主
2015年03月21日 13点03分 2
结果却是不了了之
2015年03月21日 13点03分
level 11
铃铛兮 楼主
[啊!]突然发现我火星了
乃是不是早就提交过buglist什么的了?
2015年03月21日 13点03分 3
level 11
WIN7普及以前windows使用的是IME作为输入方式。WIN7以后,改用TSF输入,对IME的支持仅仅提供了IME的接口,且接口并不完全支持,导致以前有些用IME的输入法,在WIN7上并不友好。五笔那个恰好是IME之一。这个是操作系统的问题。
sdl本身对于输入法并没有考虑中文的需求,且国内用的较少,所以以后会不会考虑支持还很难说。解决方案比较容易的就是直接引入比如Widgets之类可以支持输入控件的第三方库。虽然在sdl显示上比较难看。但至少可以不用考虑输入法的问题。
至于手机上能否支持中文输入的问题,没有尝试过,不发表看法。
2015年03月21日 13点03分 4
主要是在SDL里我开不了输入法,并不是不能用五笔,连个输入法窗口都木有。 另外在手机上还是勉强能用的。具体我没测试好,但显然可以弹出输入法键盘, 但不能切换输入法,至于有没有其他硬伤我也没时间试了。虽然也不指望SDL可以解决这问题,但看到有人几乎成功了还是比较震惊的,于是想把他召唤出来。
2015年03月21日 14点03分
回复
��Ȫ��
: 目前我也正打算用窗口随便搞搞就是了,但想想可能外观略疼。我也想了解如何直接用api自己实现个SDL_StartInput什么的。但现在最简洁的办法就是1楼链接里的做法,因为他已经完成了。
2015年03月21日 15点03分
回复
������
:IMM框架输入法基本可以放弃了。TSF的是一个不错的选择。1楼那个你实验过能用吗?
2015年03月21日 15点03分
回复
������
:http://www.cccl.com.hk/ccclnew/cccllee/cccllee30.html http://www.techbang.com/posts/12222-windows-8-free-so-difficult-to-use sdl好像支持的就是IMM,TSF刚才查了一下,SDL网站好像有个GLTSF,但是没找到太多的其他信息。
2015年03月21日 16点03分
level 13
为什么这个吧发帖这么少啊[不高兴]
2015年03月24日 09点03分 5
都没空
2015年03月25日 03点03分
回复
������
:。。。。你怎么有空了???
2015年03月25日 10点03分
回复 小牛_牛sky : 忙里偷闲,只有爪机可用,码字累._(_^_)_
2015年03月25日 14点03分
用的人少
2015年05月12日 05点05分
level 1
我英文不好,很难表述关于IME问题,因而我没在SDL官方论坛发关于IME的贴子。不过我在那论坛有发过其它内容,那里我使用的ID是ancientcc。
在Windows平台,SDL处理IME有使用COM形式的TSF,具体见它处理IME的源代码:SDL_windowskeyboard.c。
iOS平台已能较好支持输入中文。在iOS,只要弹出软键盘,是操作系统而不是SDL掌管切换输入法,SDL做的是把形成的字通过SDL_TEXTINPUT传给上层。但是,我认为SDL使用的传输机制存在缺陷,它默认是弹开软键盘时把应用窗口向上弹一定高度(估计是为了不让软键盘遮住输入框),可这种做法是不够的,尤其是当中控件复杂的窗口。我对此进行修改,具体见这贴:http://www.freeors.com/bbs/forum.php?mod=viewthread&tid=22181
在Android,只是要能输入中文也是没问题的。但由于近一年我没管Android,如果它也能读出软键盘高度(我猜应该能),那也就能和iOS一样让自个窗口和软键盘做到无缝配合。
我正在编写一个叫Rose的开源项目,一个C++跨平台SDK,这个SDK基于SDL。这个月的主要工作是让SDK内置支持聊天(使用IRC协议)。可以想见,处理中文输入自然是聊天的一个基本功能,在Windows、iOS,我可以确定SDL是能很好处理输入的,至于其它平台,得等有时间再去完善了。
Rose项目源码:https://github.com/freeors/Rose。那里有我修改过的SDL源码,改动不大,用文件比较工具,像UlterEdit,很容易就能看到我对SDL 2.0.3改了什么。要没意外,这个月底就要发布支持IRC聊天的V0.0.5。
2015年03月25日 02点03分 6
果然术业有专攻。[真棒]
2015年03月25日 04点03分
对了,用SDL_SetTextInputRect不可以设置高度吗?
2015年03月25日 14点03分
回复
������
:我一直没用过 SDL_SetTextInputRect,不清楚这函数功能。但有一点,软键盘高度是操作系统决定的,应该不会允许应用程序(像SDL)去修改这高度。要是可以修改软键盘高度,那输入区域这些就乱套了。
2015年03月25日 14点03分
我去试试..
2015年03月25日 15点03分
level 11
铃铛兮 楼主
多谢了.
2015年03月25日 03点03分 7
level 11
如果需要windows使用输入法,是否仅需要修改SDL_keyboard.c,其他文件需要改动吗?
2015年03月25日 04点03分 8
应该是的,只要改SDL_windowskeyboard.c就可以了。要是你改好了,希望能分享下呵[呵呵]
2015年03月25日 06点03分
回复
��ʣ����
:黄泉客: 回复 仅剩的梦 :我做pc单机,一时半会用不上输入法,所以暂时不会改,等某时打算做网游的时候,如果官方还不支持,那就一定会去改一下。当前的话,@铃铛兮 这个历史性重任就交给你了,劳驾在windows上测试一下吧。直接下github上那个替换就好。[哈哈]
2015年03月25日 09点03分
win下没VS,编译sdl各种痛, 被折腾惨了.TAT
2015年03月25日 14点03分
回复
������
:我的看法,Windows下不使用VS那真是不可想像的。而且VS有着最强C/C++调试功能,要开发C/C++程序它都是必备工具。至于VS下如何编译SDL以及相关库,我在书中(《Rose: C++跨平台SDK》)第一章有写,你可以按那步骤来。进入这链接https://github.com/freeors/Rose后有这书的入口。
2015年03月25日 14点03分
level 11
来个windows的吧
2015年03月26日 05点03分 10
现在只能用爪机。
2015年03月26日 05点03分
回复 铃铛兮 :等到你能用pc得时候。
2015年03月26日 05点03分
回复 黄泉客 : [狂汗]我还得等3天.
2015年03月26日 05点03分
回复 铃铛兮 :没关系,就算三周,在这吧里,这贴也还在第一页上。
2015年03月26日 05点03分
level 11
铃铛兮 楼主
才发现我误解了IME的含义[拍砖]
其实是需要IMM才对。
SDL似乎是IME-aware windows,感知IME的存在并打算实现IME的UI。
但还没实现好,有 FIX标志...
2015年03月28日 15点03分 12
level 11
铃铛兮 楼主
总算弄明白怎么设置输入法的显示位置了!!
直接用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打算自己渲染于是干脆利落的断定不会出错么?
2015年04月06日 08点04分 13
忽略了一些重要因素 全屏模式SDL_WINDOW_FULLSCREEN_DESKTOP 必须ctrl+space才能调出输入法[喷]
2015年04月06日 09点04分
level 11
很好的研究笔记,希望当我需要这个功能得时候,可以直接调用而不用再去修改。
2015年04月06日 11点04分 14
算是有点理解sdl为什么想自己画ui了,据说很多全屏游戏都这么干。 莫名其妙的又能用ctrl shift了 明明是同一个程序[揉脸]隔了一周运行就不同了= =
2015年04月12日 07点04分
level 1
这是基于SDL写的聊天客户端(IRC协议),既然聊天,那肯定须支持输入中文。过几天就会上传所有源码。
2015年04月15日 11点04分 15
全屏时会有问题么,据说真全屏是不能用IMM的,应借助TSF,不过我这TSF根本没初始化好。另外 你是怎么实现输入法跟随光标的?
2015年04月19日 05点04分
回复
������
:https://github.com/freeors/Rose,这里的代码更新到最近版本,你可以运行它则试你提涉及到的功能。上面已给出所有源码。
2015年04月19日 07点04分
level 1
http://forums.libsdl.org/viewtopic.php?t=11204
这贴子是这里的人发的吗?
2015年04月19日 11点04分 16
level 11
可能不是,这里做具体应用的不多。
2015年04月19日 18点04分 17
才发现自己英文拙计了。。 ( ゚д゚)
2015年04月20日 04点04分
回复
������
:没关系。能用到的机会不多。
2015年04月20日 05点04分
回复
��Ȫ��
: 那贴也是我发的。然而5天过去了。。。 是不是我英文表达有问题(TдT)
2015年04月24日 15点04分
回复
������
:应该不是,只能说这方面应用真的不多。
2015年04月24日 16点04分
level 9
[委屈]前排
膜拜
2015年04月30日 02点04分 18
level 1
楼主我想问下
在WINDOWS环境中
系统自带的中文输入法或者第三方输入法的候选词怎么不见了。。
我用的SDL2实现的文字输入
敲出来的文字确实是输入法的文字
这一点毫无问题
2019年03月29日 20点03分 19
1