QT集成Windows手寫輸入法

QT集成Windows手寫輸入法

關(guān)鍵詞:qt柿冲、手寫輸入法呵晚、顧客簽名

此 Demo 是利用 windows Tablet_PC_SDK 版本壶栋,實(shí)現(xiàn)的在Windows下實(shí)現(xiàn)手寫識別结胀,截簽名按鈕是將簽名的區(qū)域截取保存成png圖片赞咙,整體效果如下:

Demo展示效果.gif

簡介

  1. 此Demo使用QT Creator 4.11.0, Based on Qt 5.14.0 編寫,大部分qt版本均適用糟港。

  2. 開發(fā)編譯時(shí)攀操,需要安裝 Tablet_PC_SDK,開發(fā)完畢后秸抚,實(shí)際部署時(shí)速和,不需要安裝此SDK。

  3. Demo源碼鏈接在本文最后提供剥汤。

使用步驟

  1. Tablet_PC_SDK_v1.7.exe 安裝此文件健芭,此工程將此文件安裝到了C:\MicrosoftTablet目錄下,文件是開發(fā)SDK秀姐,開發(fā)完畢編譯后慈迈,在部署的機(jī)器上不需要安裝此文件;安裝過程中,選擇用戶自定義安裝 Custom痒留,安裝路徑不要使用默認(rèn)的谴麦,選擇C:\MicrosoftTablet(沒有則新建)。

    此SDK可在以下鏈接中下載伸头,或在本文最后提供的鏈接上下載匾效。

<https://getintopc.com/softwares/development/microsoft-tablet-pc-sdk-free-download/</pre>

  1. 在.pro中加入:

    QT += axcontainer
    INCLUDEPATH +=C:\MicrosoftTablet\Include //此為SDK安裝地址,注意不要使用默認(rèn)的恤磷,因?yàn)橛械腝T不支持中文的()</pre>

  2. 在頭文件中需包含以下頭文件:

    Windows_handwriting\hand\handsinput.h 頭文件中包含了C:\MicrosoftTablet\Include 中的以下頭文件:

    include <msinkaut_i.c>

    include <msinkaut.h></pre>

  3. 直接編譯會出錯(cuò)面哼,需要注釋掉以下文件中的兩行:

    C:\MicrosoftTablet\Include\msinkaut.h 中的:
    475行://void * __RPC_USER MIDL_user_allocate(size_t);
    ?
    C:\MicrosoftTablet\Include\tpcshrd.h 中的:
    59行://void * __RPC_USER MIDL_user_allocate(size_t);</pre>

  4. 編譯通過后,即可運(yùn)行扫步。

核心代碼

此Demo的核心代碼如下魔策,可以根據(jù)SDK自行編碼調(diào)試,或下載源碼修改調(diào)試:

void handsInput::inputInit(HWND hwnd)
{
// 初始化 COM 接口
CoInitialize(NULL);
HRESULT hr;
?
// 使用默認(rèn)的識別器創(chuàng)建一個(gè)識別上下文
// 這個(gè)上下文會被所有的識別對象使用
hr = CoCreateInstance(CLSID_InkRecognizerContext,NULL, CLSCTX_INPROC_SERVER,IID_IInkRecognizerContext,(void **) &g_pIInkRecoContext);
if (FAILED(hr)) {
qDebug() << "沒有安裝手寫識別軟件=";
return ;
}
// 創(chuàng)建一個(gè)墨跡收集對象
hr = CoCreateInstance(CLSID_InkCollector,NULL, CLSCTX_INPROC_SERVER,IID_IInkCollector,(void *) &g_pIInkCollector);
if (FAILED(hr))
return ;
?
// 獲取墨跡對象的指針
hr = g_pIInkCollector->get_Ink(&g_pIInkDisp);
if (FAILED(hr))
return ;
?
// 將墨跡對象關(guān)聯(lián)一個(gè) hWnd 的窗口
hr = g_pIInkCollector->put_hWnd((long)hwnd);
if (FAILED(hr))
return ;
?
// 設(shè)置顏色
IInkDrawingAttributes
p;
if (SUCCEEDED(g_pIInkCollector->get_DefaultDrawingAttributes(&p)))
{
p->put_Color(RGB(0,0,255));
}
?
// 打開墨跡輸入的開關(guān)
hr = g_pIInkCollector->put_Enabled(VARIANT_TRUE);
if (FAILED(hr))
return ;
?

if 1

//設(shè)置手寫只識別為一個(gè)字
IInkRecognizerGuide *RecognizerGuide;
hr = CoCreateInstance(CLSID_InkRecognizerGuide,NULL, CLSCTX_INPROC_SERVER,IID_IInkRecognizerGuide,(void **) &RecognizerGuide);
if (FAILED(hr))
return;
InkRecoGuide recoguide;
RECT rect;
rect.bottom = 2;//不能為1
rect.left = 0;
rect.right = 2;//不能為1
rect.top = 0;
?
recoguide.rectWritingBox = rect;
recoguide.rectDrawnBox = rect;
recoguide.cRows = 1;//不要過大
recoguide.cColumns = 1;
recoguide.midline = -1;
RecognizerGuide->put_GuideData(recoguide);
g_pIInkRecoContext->putref_Guide(RecognizerGuide);

endif

}
?
void handsInput::RegDataEx(InPutRltS &Rlts)
{
// 將鼠標(biāo)變?yōu)樯陈?br> // HCURSOR hCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
// 獲取指向墨跡收集器的指針
// 這個(gè)收集器是整個(gè)墨跡的快照
if (!Rlts.empty())
{
Rlts.clear();
}
IInkStrokes* pIInkStrokes = NULL;
HRESULT hr = g_pIInkDisp->get_Strokes(&pIInkStrokes);
if (SUCCEEDED(hr))
{
// 將筆觸收集器傳遞給識別器
hr = g_pIInkRecoContext->putref_Strokes(pIInkStrokes);
if (SUCCEEDED(hr))
{
// 識別
IInkRecognitionResult* pIInkRecoResult = NULL;
InkRecognitionStatus RecognitionStatus = IRS_NoError;
?
hr = g_pIInkRecoContext->Recognize(&RecognitionStatus, &pIInkRecoResult);
if (SUCCEEDED(hr) && (pIInkRecoResult!= NULL))
{
// 枚舉可能的所有結(jié)果
// CComPtr<IInkRecognitionAlternates> spIInkRecoAlternates;
IInkRecognitionAlternates* spIInkRecoAlternates;
hr = pIInkRecoResult->AlternatesFromSelection(
0, // in: selection start
-1, // in: selection length; -1 means "up to the last one"
10, // in: the number of alternates we're interested in
&spIInkRecoAlternates // out: the receiving pointer
);
long lCount = 0;
if (SUCCEEDED(hr) && SUCCEEDED(spIInkRecoAlternates->get_Count(&lCount)))
{
// 獲取所有的識別結(jié)果
IInkRecognitionAlternate* pIInkRecoAlternate = NULL;
for (LONG iItem = 0; (iItem < lCount) && (iItem < 10); iItem++)
{
// Get the alternate string if there is one
if (SUCCEEDED(spIInkRecoAlternates->Item(iItem, &pIInkRecoAlternate)))
{
BSTR bstr = NULL;
if (SUCCEEDED(pIInkRecoAlternate->get_String(&bstr)))
{
InputRlt temp = {0};
QString str = QString::fromWCharArray(bstr);
//qDebug() << "字體=" << str.toUtf8().data();
strcpy(temp.rlt, str.toUtf8().data());
Rlts.push_back(temp);
}
pIInkRecoAlternate->Release();
}
}
//枚舉結(jié)束河胎,顯示出來
}
}
// 重置識別器內(nèi)容
g_pIInkRecoContext->putref_Strokes(NULL);
}
pIInkStrokes->Release();
}
// 重置鼠標(biāo)
// ::SetCursor(hCursor);
}</pre>

相關(guān)鏈接

SDK安裝文件與源碼包下載鏈接闯袒。
http://blog.hyrscloud.com/topic/index?id=8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市游岳,隨后出現(xiàn)的幾起案子政敢,更是在濱河造成了極大的恐慌,老刑警劉巖胚迫,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喷户,死亡現(xiàn)場離奇詭異,居然都是意外死亡访锻,警方通過查閱死者的電腦和手機(jī)摩骨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朗若,“玉大人,你說我怎么就攤上這事昌罩】扌福” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵茎用,是天一觀的道長遣总。 經(jīng)常有香客問我,道長轨功,這世上最難降的妖魔是什么旭斥? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮古涧,結(jié)果婚禮上垂券,老公的妹妹穿的比我還像新娘。我一直安慰自己羡滑,他們只是感情好菇爪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布算芯。 她就那樣靜靜地躺著,像睡著了一般凳宙。 火紅的嫁衣襯著肌膚如雪熙揍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天氏涩,我揣著相機(jī)與錄音届囚,去河邊找鬼。 笑死是尖,一個(gè)胖子當(dāng)著我的面吹牛意系,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析砸,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼昔字,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了首繁?” 一聲冷哼從身側(cè)響起作郭,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弦疮,沒想到半個(gè)月后夹攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年咏尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啸罢。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡编检,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扰才,到底是詐尸還是另有隱情允懂,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布衩匣,位于F島的核電站蕾总,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琅捏。R本人自食惡果不足惜生百,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柄延。 院中可真熱鬧蚀浆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秕衙,卻和暖如春蠢甲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背据忘。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工鹦牛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勇吊。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓曼追,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汉规。 傳聞我的和親對象是個(gè)殘疾皇子礼殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前面的三章,我們說了多態(tài)的一些技術(shù)內(nèi)幕還有一些關(guān)于C++對象模型的內(nèi)容针史,所以我就在想是要繼續(xù)深入C++的知識點(diǎn)呢還...
    代碼人生ll閱讀 510評論 0 0
  • 在Ubuntu 16.04中安裝了SublimeText 3之后發(fā)現(xiàn)既然不支持輸入中文晶伦。 根據(jù)網(wǎng)上資料和自身的安裝...
    浩林林閱讀 171評論 0 0
  • 2017.8.1更新支持Qt5.9.1,需要重做步驟4啄枕,編譯fcitx-qt5婚陪。 Ubuntu 14.04安裝QT...
    trumolong閱讀 7,201評論 0 1
  • 久違的晴天,家長會频祝。 家長大會開好到教室時(shí)泌参,離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)常空。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,512評論 16 22
  • 創(chuàng)業(yè)是很多人的夢想沽一,多少人為了理想和不甘選擇了創(chuàng)業(yè)來實(shí)現(xiàn)自我價(jià)值,我就是其中一個(gè)漓糙。 創(chuàng)業(yè)后铣缠,我由女人變成了超人,什...
    亦寶寶閱讀 1,802評論 4 1