norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142879次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 漫谈WinCE的手写识别技术(一)收藏

    新一篇: 漫谈WinCE的手写识别技术(二) | 旧一篇: 为什么下搜酷狗输入法那么快?

    //========================================================================
    //TITLE:
    //    漫谈WinCE的手写识别技术(一)
    //AUTHOR:
    //    norains
    //DATE:
    //    Wednesday  24-January -2007
    //Environment:
    //  EVC4.0 + Standard SDK
    //========================================================================
      WinCE从4.0开始,集成了手写识别输入法,可以识别繁体中文,日文和韩文.因此如果在WinCE下采用相应的API函数重写上述三种语言的手写识别输入似乎显得多此一举.但多余并不代表没有了解的价值,今天,就让我们抽丝剥茧来探究WinCE下的手写识别吧!

      大体上来说,调用WinCE自带的识别引擎进行文字识别需要经过如下十个步骤:

    1.调用HwxConfig ()函数初始化识别引擎.在每个应用程序中,该初始化只需要调用一次.


    2.调用HwxCreate()创建识别引擎句柄.

      函数原型为:HRC HwxCreate(HRC hrc).该函数有个形参hrc,保存的是已存在的识别引擎句柄.如果传入该形参,则可以根据已存在的引擎的设置来创建新的识别引擎.当然通常情况下我们仅仅是创建一个新的引擎,所以该函数更多情况下是不使用形参:
      

    3.调用HwxSetGuide()函数来设置识别框的范围.

      设置该识别框范围的重要性不言而喻,因为如果设置不恰当,则直接导致识别出错甚至无法识别.

      该函数传入的形参是一个HWXGUIDE结构,该结构包含了识别框的一切信息:

    typedef struct tagHWXGUIDE {
        UINT cHorzBox;
        UINT cVertBox;
        INT xOrigin;
        INT yOrigin;
        UINT cxBox;
        UINT cyBox;
        UINT cxOffset;
        UINT cyOffset;
        UINT cxWriting;
        UINT cyWriting;
        UINT cyMid;
        UINT cyBase;
        UINT nDir; 
      }
     HWXGUIDE, *PHWXGUIDE;

     

      

      如果用文字来描述各个形参的含义,我实在没这个能力让语言读起来不觉得乏味,所以最简单最直接最直观的方法,我还是用图片来标识出各个参数的含义,至少应该不会让脑袋觉得发晕:
     
      
      xOriginy,Origin分别定义了识别框的起始坐标,而cxBox,cyBox则分别定义了识别框的长度和宽度.需要注意的是,这四个参数是以屏幕坐标为基准,如果我们获得的是应用程序窗口的坐标,在赋值之前,我们需要调用MapWindowPoints()进行转换.当然,相同的道理也同样运用于该结构的其它形参.
      
      nDir定义了书写的顺序,我们一般使用HWX_HORIZONTAL,表明书写方式是水平书写.当然,如果有特殊要求,我们还可以设置HWX_BIDIRECTIONAL或HWX_VERTICAL.

     

    4.调用HwxALCValid()和HwxALCPriority()定义识别的标准.

      HwxALCValid()用来定义识别字符的范围,HwxALCPriority()则是定义返回字符的优先级.

      根据帮助文档,可以识别的字符文字为:简体中文,繁体中文,日文,韩文和英文.但在实际使用中,却是无法正确识别简体中文,这不能不说是一个遗憾.在平时应用中,我们一般只需识别一种文字,此时我们可以只是简单地设置HwxALCValid()即可:

      HwxALCValid(hrc,ALC_KANJI_ALL); //识别汉字
      

    5.调用HwxSetContext()设置前文,提高文字识别率.如果没有前文,可以不调用该函数.


    6.调用HwxInput()加入文字笔画.如果文字是多笔画,则应多次调用该函数.

      函数原型是:

      BOOL HwxInput( 
              HRC hrc, 
              POINT
    * lppnt, 
              UINT upoints, 
              DWORD timestamp 
            );



            
      lppnt是输入的笔画坐标,upoints是坐标的个数,和HWXGUIDE的参数一样,这里的坐标也是屏幕坐标系.timestamp是时间,一般情况下,我们可以设置为0.
      
      需要注意的是,如果是多笔画的文字,最好不要一次性将所有笔画点阵通过HwxInput()输入,否则最后的识别结果将会大相径庭.因为识别引擎是一笔一划进行输入识别的,如果多笔画文字一次性输入,引擎可能将所有笔画当成一个笔画,从而导致识别结果异常不准确.      
      
    7.调用HwxEndInput()告知引擎笔画输入结束,即将要进行识别部分.


    8.调用HwxProcess()让引擎进行识别处理.


    9.调用HwxResultsAvailable()获取识别的字符数.

      根据文档,HwxResultsAvailable()返回识别的字符数.然而在WinCE4.2中,调用hwxcht.dll的话,任何时候都是返回为0值,即使之后的函数能返回识别字符也依然如此.文档中描述,该函数如果返回的是-1,则代表调用失败,其它值代表可供使用的字符数.也许是WinCE4.2下识别引擎不完善的缘故,该函数根本没有发挥文档所描述的作用.
      
      
    10.调用HwxGetResults()获取结果.

      INT32 HwxGetResults( 
        HRC hrc, 
        UINT cAlt, 
        UINT iFirst, 
        UINT cBoxRes,
        HWXRESULTS
    * rgBoxResults 
      );

     

      初看起来,该函数形参似乎特别复杂,但实际上并非如此.
      
      根据文档,cAlt是期望的轮流返回的字符,iFirst是想要返回字符的索引,cBoxRes是返回的字符个数.但实际上,cAlt起主导作用,比如说cBoxRes设置为1,而cAlt设置为10,则返回的字符个数依然为10.所以我在平常使用中,一般是将iFirst设为0,cBoxRes设为1,而cAlt设为所需返回的字符个数.
      
      rgBoxResults指向储存字符的缓冲区.不过,返回结果比较有意思,除了第一个rgBoxResults以外的所有结构的indxBox成员都储存了返回字符.
      比如返回五个字符'与子于飞干',则rgBoxResults的数组列数值为:
      rgBoxResults[0].indxBox :      0
      rgBoxResults[0].rgChar[0] :  '与'
      rgBoxResults[1].indxBox :     '子'
      rgBoxResults[1].rgChar[0] :  '于'
      rgBoxResults[2].indxBox :     '飞'
      rgBoxResults[2].rgChar[0] :  '干'
      
    11.调用 HwxDestroy()销毁引擎,本次识别过程结束.如果需要继续识别文字,从步骤2重新开始. 

    发表于 @ 2007年01月24日 23:30:00|评论(loading...)|编辑

    新一篇: 漫谈WinCE的手写识别技术(二) | 旧一篇: 为什么下搜酷狗输入法那么快?

    评论

    #chenyuanfeng2008 发表于2008-03-26 15:33:07  IP: 121.35.91.*
    请问wince5.0自带的手写输入法支持简体手写吗?
    2008-03-27 15:51:01作者回复
    文档中有简体识别标志,但实际上不支持的。
    #jiess 发表于2008-04-08 16:52:31  IP: 116.25.66.*
    cBoxRes应当是指识别框的个数.
    #jiess 发表于2008-04-08 16:54:01  IP: 116.25.66.*
    以下资料摘自MSDN:
    The following code example shows how to simultaneously retrieve results for 10 input boxes, with five alternatives per box.
    HANDLE hMem = GlobalAlloc(GHND, 10 * (sizeof(HWXRESULTS) + (5-1) * sizeof(WCHAR)) );
    HWXRESULTS * rgBoxR = (HWXRESULTS * ) GlobalLock( hMem);

    do
    {
    int iRes = HwxGetResults ( hrc, 5, indx, 10, rgBoxR);
    .
    . // check for errors and use rgBoxR
    .
    indx += (UINT) iRes;
    }
    while (iRes == 10);
    2008-04-08 19:51:10作者回复
    MSDN中关于“cBoxRes”的说明为“[in] Number of characters to return.”翻译为中文应该是需要返回的字符数。但根据你摘录的资料来看,这个应该是input boxes的个数。因为最近比较忙,所以也没办法去确认这个参数真正代表什么意思。还麻烦jiess您测试一下,给我们一个明晰的答案。谢谢!
    #jiess 发表于2008-04-08 17:23:34  IP: 116.25.66.*
    HwxResultsAvailable()返回识别的字符数.然而在WinCE4.2中,调用hwxcht.dll的话,任何时候都是返回为0值----------我猜想可能是HwxResultsAvailable()调用太早,引擎识别处理还没完成.
    HwxResultsAvailable()文档里有讲到,此函数还可以用来检测引擎识别处理完没有.怕自己理解有误故抄原文如下:
    With this function, an application can check the progress of the handwriting recognition engine
    2008-04-08 19:53:44作者回复
    理论上应该是如此。印象当时我在调试的时候,无论将该函数的调用放入哪个代码段,都会返回0。所以比较疑惑。
    #jiess 发表于2008-04-09 16:55:37  IP: 121.35.91.*
    昨天是我第一天接触手写,
    准备写一个繁体的手写识别GUI.
    简体手写识别引擎的资料.网上太少了,暂时无从下手.

    我会做相应的测试的.
    感谢你从百忙中抽时间来回复.
    2008-04-10 10:13:41作者回复
    繁体的识别库好解决,简体的话,你只能找汉王了。
    #yuanfeigao 发表于2008-10-25 22:07:51  IP: 202.99.210.*
    我想问一下,调用这些函数时,需不需要对话框或文档的支持啊。还是直接调用啊??
    2008-10-30 14:19:22作者回复
    如果仅仅只是调用函数,和对话框和文档无关呢。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains