漫谈WinCE的手写识别技术(二)
{
goto END;
}
//Get the character from recognizer
if(HWXGETRESULTS(m_hrc,iCount,0,1,phwxResults) == FALSE)
{
goto END;
}
//Set the character to the stored buffer
for(i = 0; i iNum; i++)
{
if(i == 0)
{
if(phwxResults[i].rgChar[0] != 0)
{
pWchar[iGetNum ++] = phwxResults[i].rgChar[0];
}
else
{
break;
}
}
else
{
//The indxBox member also store the character
if(phwxResults[i].indxBox != 0)
{
pWchar[iGetNum ++] = phwxResults[i].indxBox ;
}
else
{
break;
}
if(phwxResults[i].rgChar[0] != 0)
{
pWchar[iGetNum ++] = phwxResults[i].rgChar[0];
}
else
{
break;
}
}
}
END:
if(phwxResults != NULL)
{
delete [] phwxResults;
}
return iGetNum;
}
//Descriptiong:
// Input the stroke
//Parameter:
// lpPnt: [in] Pointer to the stroke POINT
// iCount: [in] The count of the lpPnt
// scale: [in] The scale base of lpPnt
BOOL CRecognizer::InputStroke(POINT *lpPnt, int iCount, ScaleType scale)
{
BOOL bRes = FALSE;
int i = 0;
POINT *pt;
pt = new POINT[iCount];
if(pt == NULL)
{
goto END;
}
for(i = 0; i iCount; i++)
{
pt[i] = lpPnt[i];
if(scale == SCALE_APPWND)
{
//Convert to the screen scale
pt[i].x *= 4;
pt[i].y *= 4;
MapWindowPoints(m_hWndRecog, HWND_DESKTOP, pt[i], 1);
}
}
//Input stroke
bRes = HWXINPUT(m_hrc,pt,iCount,0);
if(bRes == FALSE)
{
goto END;
}
bRes = TRUE;
END:
if(pt != NULL)
{
delete [] pt;
}
return bRes;
}
不知道大家看到这段代码有什么感觉,反正我是挺高兴的,因为让我从繁琐的识别过程中脱离出来.
关于代码,也许最让人疑惑的可能是这两个宏:RECOGNIZE_FUNCTION_FROM_DLL,RECOGNIZE_FUNCTION_FROM_LIB.
顾名思义,RECOGNIZE_FUNCTION_FROM_DLL表明识别函数调用是来源于动态链接库(DLL),同理,RECOGNIZE_FUNCTION_FROM_LIB则是编译的时候链接到lib库.为什么需要定义这两个宏呢?因为在标准的SDK下,如果直接包含recog.h后调用相关识别函数,是会报link错误.因为标准的SDK是不包含任何手写识别组件的.从调试的便利性来说,这时候如果只拷贝识别库到模拟器就可以顺利测试程序,绝对比重新定制一个包含手写识别引擎的系统要来得方便.
在示例代码中,因为是识别繁体中文,所以包含的动态链接库为:hwxcht.dll.如果需要识别其它文字,则只要更改该动态链接库名称即可.当然,还要更改DEFAULT_ALC宏,这个宏定义了识别的范围.
因为示例代码中的识别函数全部是宏定义,具体意义根据函数的来源而不同,所以RECOGNIZE_FUNCTION_FROM_DLL和RECOGNIZE_FUNCTION_FROM_LIB同一时间只能定义一个.如果两个都定义,毫无疑问,出错!^_^
最后,用伪代码做范例说明如何使用该封装类,以此做本章结尾:
CRecognizer recog;
Rect rcWnd;
/*rcWnd 获取应用窗口hWnd的大小*/
//初始化
//直接赋值窗口坐标,函数体内部会根据标志直接转换为屏幕坐标
recog.Initialize(hWnd,rcWnd,SCALE_APPWND);
评论