输入法编程漫谈(08-09-07更新)
大家好!我是路路通。记得那是2007年,北京的第一场雪,比以往时候来的更晚一些,我在此发表了一篇题为《2007全方位、无障碍、奇妙无穷的输入方式闪亮登场》(注:帖子的标题管理员已在百忙中赐名为《路路通键盘和输入法》)的帖子,得到韦剑大版主的赞赏,并拿得了一份数量为1的订单,当时的心情是何等的激动呀!不久,还将这一广告帖置顶,人生最幸福的事莫过于此,如果老天让我遇见韦剑这个人的话,我会对他说:“爱辣味油!”,如果我的发明变成了产品的话,我希望送他——一套键盘。此后天天泡在北大论坛,静候Microsoft、IBM等公司的收购支票,可是等了3个月有余,也没半点音信,夜沉沉,路茫茫,革命一时转入了低潮。
轻轻的我走了,点了点鼠标,带着我依依的不舍。
今天我胡汉三又回来了!看到韦剑这个版主近来当得这么轻松,我就来气,因此决定出来搅搅局,让他少几分清闲,^_^
还有,北大论坛、加加论坛、五笔爱好者论坛等等众多大师、高手、牛人,他们的码表呀,
资料呀等等全免费奉送,让我几万大洋的输入法开发经费一分钱也没花出去,最后只好挪作它用;李振春老师的开源代码让我连当面拜师的机会都失去了,被迫自学成才,他们的行为已到了是可忍熟不可忍地步,今天我如果不出几招让他们瞧瞧,那也太不象话了。
《输入法编程漫谈》小学阶段示范程序
《输入法编程漫谈》初中阶段示范程序
输入法安装程序
拼音码表(供输入法程序测试用)
汉字生成工具源代码
微软DDKIME源代码
自由拼音3.0源代码
自由拼音3.0文档
输入法编程难学吗?
不难,一点都不难。你这是忽悠人吧,不是,咱们IT界的人什么素质,会干本山大叔的那些勾当?只要你有点C语言基础,了解一点windows的运行机制,不出1个月,准能精通。如果这两样都不会,还能学吗?能!如果你能做到妻离子散、父子反目,丢官下岗你都不管了,哪绝对没有问题!比如我,当初买电脑不过是想赶赶时髦,从来也没有想过编程呀啥的,一开始鼠标摆弄得都不利索,双击永远都是两次单击,系统每周得摆上好酒好菜请人重装一次。就这个水平因练五笔练烦了,也想自己编一个输入法。记得当时我宣布这一伟大的决定时候,话音刚落,众人已是满地牙!我可不管这些,去买了本谭浩强《C程序设计》,整天什么活都不干,不分日夜的啃了起来,时间一长,老婆大人不干了,下了最后通谍:“要电脑还是要我”,我说两样都要,老婆说不可能,最后我就一句话:“电脑是要定了,你爱怎的怎的!”。臭娘们敢威胁我,从小吓大的,还怕你不成,等学会了输入法编程,就是IT界的人了,IT界的人还愁没老婆,说实话如果不是法律的限制还不是要多少就有多少。经过半年的奋斗,辛勤的汗水终于有了回报,独立的写出了一个有模有样又实用的程序——路路通输入法1.0。
所以说:“入门既不难,深造也是办得到的”。
输入法程序是什么东东?
输入法是一个小小的动态链接库程序。
动态链接库又是什么呢?
我们知道电脑有很多文件,大体上可分为数据文件和可执行文件两类,数据文件如文本文档、音视频文件等;可执行文件如记事本、Word和Excel等,它们的扩展名一般是exe,com,Dll,eml等。动态链接库的扩展名是Dll,输入法程序的扩展名是将Dll改成了ime。
动态链接库一般不能单独运行,需要借助宿主程序才能执行相关操作,打个比方,动态链接库(输入法)就是保姆,宿主程序(记事本)就是雇主。
动态链接库又有动态加载和静态加载两种方式,它们的区别就像保姆和小时工,保姆要包吃包住——静态加载,费用稍高;小时工只需预约——动态加载,费用较低。那种方式更好呢?看你的需要,比如你家有小宝宝,24小时都需要有人伺候,保姆比较合适;如果只是搞搞室内卫生,擦擦玻璃什么的,小时工就比较合算。当然啦,如果保姆长的美若天仙,又有大学文凭,又聪明能干,你想将她转正(集成到你的程序去)也行,但做这个决定之前可
要想好啦,以后感情不和想离婚可就没那么容易了。和平分手,民政局你得跑N个来回,强行分手,法院你得去N次,而且还要分大半家产,可不像保姆、小时工那么好打发的。
输入法程序不太可能静态加载,因为雇主来自五湖四海。它的加载方式一般是手工动态加载,当然也可以做到自动加载,但这样做一般会让人骂流氓。
输入法编程从那入手
一般人学输入法编程都是从研究源代码开始的,网上开源的有《自由拼音》、微软的DDK,其它还有一些都是根据这两个改写的。从源代码入手是个不错的法子,但很遗憾,这两个代码不是带你入门的,与国内的计算机书籍一样都是给计算机的本科生、研究生、博士之类作参考用的。网上还有一些关于输入法编程的文章,但也只是碰碰嘴唇,并没有把舌头伸进去狂搅一番,初学者看了也是不得要领。研究源代码难,又无相关的书籍,想入门还真的是不容易。造成这种局面,说白了就是输入法这种小程序,低手不会,高手不屑。
实际上输入法很简单,它实际上就是一个查表操作。不相信的朋友,可将你的码表导入到Excel。假设你的码表是基于拼音的,码表分两列,一列是拼音,一列是汉字串,那么用
鼠标点击编辑->查,在查内容框中敲入shishi,点击查下一个按钮,黑矩形框立即就跳到A列的shishi的行上面,对应的B列就是“试试、事事、实施、时世、史实……”等等这些汉字串,输入法的原理就是这样。
编程哪一家比较好 既然输入法这么简单,可是做起来却不是那么容易呢?这还得从那晕到死的消息机制谈起。消息机制是什么?打个比方,两个人面对面有话不能直说,要这样子:你的话->老盖手下->老盖->老盖手下->对方,对方也是如此。由于老盖事多,还得排队,就像你去银行取款,先在营业厅门口的机子上拿一个号比如是A911,然后到一边去等候,当营业员用喇叭喊:“请A911到XX窗口……”时,你方可去柜台取款,如果这时你还在对刚才路上碰见的美眉想入非非而没有听见,对不起,重新再去拿一个号排队。
这还不算完,你电脑的所有的东西都得经他批准才能使用,再打个比方:你两口子久别重逢,正准备上演儿童不宜的画面,这时老盖说:“哥们,别急,给我手下打个报告等我批了先”。如果你不听,那会死得很难看。没办法,在他的统治之下,咱们就得按他的旨意办事。
所以学输入法编程,先得对消息机制、硬件访问机制有所了解。
你的《输入法编程漫谈》分个阶段?
分两个阶段:小学阶段、初中阶段。每个阶段都有示范程序。
小学阶段
Win32对话框的创建
组合窗体、候选窗体的创建和操作
码表的操作
初中阶段
状态窗体的创建和操作
输入法消息处理
输入法程序与IME的接口处理
注:文章可转载须经本人同意,不得用于商业用途,而且必须注明:
转:中华人民共和国->北大中文论坛->中文信息处理->输入法讨论专区->路路通网友教授的《输入法编程漫谈》。
这个有点长,为了节约网络资源,可用缩写
转:北大路教授《输入法编程漫谈》。
在此告诉大家一个消息:路路通键盘经过一年多的改进,如今是要多小就有多小,按键的数量要多大就有多大,操作要多简单就有多简单,以后形码基本上就不用拆了。
《输入法编程漫谈》小学阶段示范程序
本程序在Win2k、WinXP下、VC6编译通过。
编译时,请进入:Project->settings->Preprocessor definitions,将_MBCS去掉,加上_UNICODE,UNICODE
再进入:Build->set Active Configuration,选中:srf-Win32 Release 点击OK。
码表是基于拼音的,含有声调,没有按字频排序。网友可以换上自己的码表,将目录下srf\Release\BHFile下的py.txt替换掉即可。
程序默认只支持打开UNICODE的文本,有能力的网友可自行修改增加它的兼容性。
“学习输入法编程,要带着问题学,活学活用,学用结合,急用先学,立杆见影,在“用”字上狠下功夫。为了把输入法编程的精髓真正学到手,要反复学习输入法编程的结构和算法,有些概念、算法最好要背熟,反复学习,反复运用。”
Win32对话框的创建
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
hInst = hInstance;
if (!InitApplication(hInstance)) return(FALSE);
if (!InitInstance(hInstance,nCmdShow)) return(FALSE);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
这是Win32程序的入口函数,完成窗口类的注册、窗口创建、获取调用线程的消息、消息转换、消息分派等操作。
InitApplication()函数的使用:windows操作系统的最大特点是什么?当然是大大小小、无处不在的窗口,想创建一个程序,一般情况下当然要创建窗口了。这个有点像开商店,先选好场地,然后到工商局申请营业执照:
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
……
商店名称、经营范围等等在这里填清楚。开多少家都可以,只要你的本钱足够。
之后是等候审批,这个审批速度比咱们工商局快多了,只要是合法经营,瞬间就给你批下来。不用关系送烟什么的,老盖这点还算清廉。
if( !RegisterClassEx( (LPWNDCLASSEX)&wc )) return FALSE;
如果批准了,那么你就可以准备开张了,否则,就是无照经营。无照经营,在老盖的统治下是绝对不可以的啊。
InitInstance()函数的使用:执照批了,下一步就是装修门面了。
hWnd = CreateWindowEx (),
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论