北大中文论坛 www.pkucn.com

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
楼主: 路路通

输入法编程漫谈(08-09-07更新)

[复制链接]
发表于 2008-6-10 15:49:56 | 显示全部楼层
路路通不但技术过硬,还很适合写小说,寓教于乐啊。
 楼主| 发表于 2008-6-10 16:25:33 | 显示全部楼层
原帖由 谢振斌 于 2008-6-10 15:49 发表
路路通不但技术过硬,还很适合写小说,寓教于乐啊。


众多码友,精于编码,苦于编程。尔等个个武功盖世,却没人肯出来传授一二,害得我这种无门无派的人出来献丑。

对了,谢兄的全息码何时问世?
 楼主| 发表于 2008-6-10 20:57:25 | 显示全部楼层

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 (),
      
       装修得合乎城建的规定,如果违章,那你还是不能开业。
        if(!hWnd) return(FALSE);
一切工作都做好了,就可以开门营业了:

         ShowWindow(hWnd,nCmdShow);
         UpdateWindow(hWnd);

获得系统信息。
while (GetMessage(&msg,NULL,0,0))
{
          TranslateMessage(&msg);
          DispatchMessage(&msg);
}
         这段我觉得跟咱们村公所非常像。
         GetMessage()接待、接电话、跑腿的,一天24小时都在村公所呆着。TranslateMessage(支书)、DispatchMessage(村长)一般都在家里干私活,有事才到村公所,不像咱们上班一族那么正规的。如果乡党委、政府有事找支书、村长,GetMessage这人马上就会去通知他们,不至于因为找不着人把官给丢了。
  
        MainWndProc()函数的使用:你的买卖就在这里进行。
        
        如果不想做买卖了,记得去工商局注销执照,还有商场租用合同、水呀、电呀、闭路电视、电话等等都得报停结算清楚,我想没有谁还很乐意继续交这些费吧。
        
case WM_DESTROY:
      DeleteObject(MyFont);
      FreeMBArray();
      PostQuitMessage(0);
      break;
default:
      return(DefWindowProc(hWnd,message,wParam,lParam));
}
    return(DefWindowProc(hWnd,message,wParam,lParam));
    系统给每个窗体过程的消息、数据都是标配的,很多根本就用不着,这时就需要返回给默认的函数处理。     
         
        跟老盖打交道,一定要记住:“早请示,晚汇报,先申请,后使用,用后归还”,

[ 本帖最后由 路路通 于 2008-6-11 11:39 编辑 ]
发表于 2008-6-10 22:30:54 | 显示全部楼层
原帖由 路路通 于 2008-6-10 16:25 发表


众多码友,精于编码,苦于编程。尔等个个武功盖世,却没人肯出来传授一二,害得我这种无门无派的人出来献丑。

对了,谢兄的全息码何时问世?


能写一些心得其实是蛮不错的,既可以让他人受益,也可以对自己进行总结和整理。

可惜,我是有心无力,一是时间紧,二是水平有限(包括文字的水平)。

所以路路通兄此举,也是功德无量,赞一下。

我的输入法,基本的都做好了,用起来也还满意,但需要细调的东西很多。编码细调是重点,技术细调在其后。努力赶工中。

还请继续你的主题吧,别因插话弄乱了主题。
发表于 2008-6-10 22:47:53 | 显示全部楼层
樓主的解說文章竟然比書本上所寫的內容還更容易懂
樓主真是功德無量啊!感謝!感謝!感恩!感恩!
发表于 2008-6-11 12:22:36 | 显示全部楼层
路路通很伟大,能把复杂的东东简单化,能把宝贵的经验给大家分享。
发表于 2008-6-11 15:34:30 | 显示全部楼层
表中的按键组合如“125”表示同时按下第1、第2和第5号键,“2345”表示同时按下“第2、第3、第4和第5号键,其余依次类推。实际应用中2个、3个、4个按键的组合用路路通键盘输入时,只需按一个按键就可完成输入。
=======================================================
对于输入法编程我的确不感兴趣,我只感兴趣路路通网站的上面这段话的真伪.速录机发明已经十多年了,还只能够"同时按下",而不可能又是"一个按键就可完成输入".
 楼主| 发表于 2008-6-11 17:19:19 | 显示全部楼层

回复 22楼 的帖子

99.9999%的键盘是一个指头操作一个按键,一键一字符;速录机是一个指头操作二个按键;路路通键盘是一个指头操作多个按键。一个指头一击不是输入一个信息,而是输入更多的信息,这就是我的研究课题。

        人与人交流,一瞬间给出的信息是太丰富了,而现有的计算机只能接收一个字符的信息,这就是瓶颈。

        把思维放宽,一切皆有可能。

        这么回答你吧:可请一个10人左右的专家鉴定小组或国内外权威媒体,我拿出20万人民币,如果我不能用现有的材料、方法证明我所说的,这笔款就归他们。这个“请”不限定是你,谁不相信都可以。
 楼主| 发表于 2008-6-11 23:03:10 | 显示全部楼层

创建文本框

学会了对话框的创建之后,我们学习在对话框上创建一个文本框,它的作用就是用来接收键盘输入。   
            hWndEdit = CreateWindowEx (WS_EX_WINDOWEDGE,
                                _T("EDIT",
                                NULL,
                                WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_LEFT |
                                ES_MULTILINE | ES_AUTOVSCROLL| ES_AUTOHSCROLL,
                                0,
                                0,
                                0,
                                0,
                                hWnd,
                                (HMENU)ID_EDITCHILD,
                                (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
                                NULL);

                //让文本框获得焦点
                SetFocus(hWndEdit);

        case WM_SIZE:
                //让文本框填满整个对话框窗口
                MoveWindow (
                        hWndEdit,
                        0,
                        0,
                        LOWORD(lParam),
                        HIWORD(lParam),
                        TRUE);
                break;
               
        我们不能让文本框直接接收键盘消息,我们要把它截下来经过一番加工后才让它发送出去。就像打仗一样,我们要想办法把敌人的情报偷出来,改成对我们有利的情报后再放回去。
        
        这里要要用到一个窗口子类化的技术,因这个技术与输入法的关系不大,在正规的输入法程序也不会用到它,在这里就不详细解说了,有兴趣的网友可去查相关的资料。在这里使用它主要是基于初学者容易理解的考虑。
        
        输入法就是:把键盘的消息截下来,经加工后再放回去,没有什么神秘的东西。
发表于 2008-6-11 23:54:49 | 显示全部楼层
我想学用VC编输入法程序,路路通先生是否愿意收下我这个徒弟哟?
 楼主| 发表于 2008-6-12 07:46:33 | 显示全部楼层

回复 21楼 的帖子

伟大的是这些人(排名部分先后):韦剑版主、谢振斌、Ahman、xml00、海峰、mfl1335、京典、67781530 、采采卷耳 和加加论坛的众多英雄,还有我一时想不起来的高手牛人,他们都是我的楷模,我跟他们差远了。
 楼主| 发表于 2008-6-12 07:50:03 | 显示全部楼层

回复 25楼 的帖子

收徒弟,恐不够资格,交个朋友吧。
        你的詹码做得那么好,还要学习?是逗我玩吧,或者想收我做徒弟?
发表于 2008-6-12 09:34:08 | 显示全部楼层
原帖由 路路通 于 2008-6-12 07:46 发表
伟大的是这些人(排名部分先后):韦剑版主、谢振斌、Ahman、xml00、海峰、mfl1335、京典、67781530 、采采卷耳 和加加论坛的众多英雄,还有我一时想不起来的高手牛人,他们都是我的楷模,我跟他们差远了。


晕,没有我的份。
也怪我,这一、两年来,都是潜水的多。
 楼主| 发表于 2008-6-12 12:22:27 | 显示全部楼层

回复 28楼 的帖子

都有。“还有我一时想不起来的高手牛人”就是包括一切无私奉献的网友。
 楼主| 发表于 2008-6-12 12:27:55 | 显示全部楼层
网友给了几顶高帽,已是飘飘然,韦版主再送一顶官帽,两脚都不粘地了。表个态吧,就算再忙,也要把这件事做好,否则,对不起这些帽子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大中文系 ( 京ICP备12040209号

GMT+8, 2016-3-24 20:41 , Processed in 0.144260 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表