漫談WinCE的手寫識別技術(shù)(二)
{
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;
}
不知道大家看到這段代碼有什么感覺,反正我是挺高興的,因為讓我從繁瑣的識別過程中脫離出來.
關(guān)于代碼,也許最讓人疑惑的可能是這兩個宏:RECOGNIZE_FUNCTION_FROM_DLL,RECOGNIZE_FUNCTION_FROM_LIB.
顧名思義,RECOGNIZE_FUNCTION_FROM_DLL表明識別函數(shù)調(diào)用是來源于動態(tài)鏈接庫(DLL),同理,RECOGNIZE_FUNCTION_FROM_LIB則是編譯的時候鏈接到lib庫.為什么需要定義這兩個宏呢?因為在標準的SDK下,如果直接包含recog.h后調(diào)用相關(guān)識別函數(shù),是會報link錯誤.因為標準的SDK是不包含任何手寫識別組件的.從調(diào)試的便利性來說,這時候如果只拷貝識別庫到模擬器就可以順利測試程序,絕對比重新定制一個包含手寫識別引擎的系統(tǒng)要來得方便.
在示例代碼中,因為是識別繁體中文,所以包含的動態(tài)鏈接庫為:hwxcht.dll.如果需要識別其它文字,則只要更改該動態(tài)鏈接庫名稱即可.當然,還要更改DEFAULT_ALC宏,這個宏定義了識別的范圍.
因為示例代碼中的識別函數(shù)全部是宏定義,具體意義根據(jù)函數(shù)的來源而不同,所以RECOGNIZE_FUNCTION_FROM_DLL和RECOGNIZE_FUNCTION_FROM_LIB同一時間只能定義一個.如果兩個都定義,毫無疑問,出錯!^_^
最后,用偽代碼做范例說明如何使用該封裝類,以此做本章結(jié)尾:
CRecognizer recog;
Rect rcWnd;
/*rcWnd 獲取應(yīng)用窗口hWnd的大小*/
//初始化
//直接賦值窗口坐標,函數(shù)體內(nèi)部會根據(jù)標志直接轉(zhuǎn)換為屏幕坐標
recog.Initialize(hWnd,rcWnd,SCALE_APPWND);
評論