新聞中心

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



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 京山县| 桓台县| 临潭县| 大连市| 威宁| 固始县| 金平| 江源县| 乌鲁木齐县| 加查县| 大理市| 中西区| 错那县| 灵台县| 梅州市| 东兴市| 都江堰市| 洪雅县| 罗定市| 凤阳县| 宁河县| 柯坪县| 泗阳县| 石林| 仲巴县| 南靖县| 忻州市| 贡嘎县| 宁乡县| 阿拉尔市| 临泉县| 宜都市| 麻栗坡县| 吴桥县| 惠东县| 都江堰市| 湄潭县| 昭苏县| 龙胜| 德钦县| 万山特区|