新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 漫談WinCE的手寫識別技術(shù)(二)

漫談WinCE的手寫識別技術(shù)(二)

作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

{

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);



關(guān)鍵詞:

評論


技術(shù)專區(qū)

關(guān)閉