久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 漫談WinCE的手寫識別技術(二)

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

作者: 時間:2016-09-12 來源:網絡 收藏

{

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



關鍵詞:

評論


相關推薦

技術專區

關閉