基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入...

搭建好Visual C++2010与windows SDK fo windows7的开发平台以后,

小试牛刀,检验下开发windows7的下的tabletpc应用,这个东西财务记账比较多,

大家先看效果,然后讲解详细代码

 

 

 

 

 

 

 

 

详情请见代码注释

 

 

 

 

// Windows 头文件 #include <windows.h> //tabletpc头文件 #include <micaut.h> #include <micaut_i.c> // Asserts header #include "assert.h" #define ASSERT assert #include "resource.h" // main symbols, including command IDs #include "EventSinks.h" // 声明事件 #include "MathInputControl.h" // 定义数学输入头文件 const WCHAR gc_wszAppName[] = L"CSDN Math Input Control "; // 数学输入控件指针 CMathInputControlHost* g_pMathInputControlHost; //初始化 HRESULT CMathInputControlHost::Init(HWND hWnd, HWND hWndEdit) { HRESULT hr; m_hWnd = hWnd; m_hWndEdit = hWndEdit; // 创建对象 hr = CoCreateInstance(CLSID_MathInputControl, NULL, CLSCTX_INPROC_SERVER, IID_IMathInputControl, (void **)&m_pIMathInputControl); if (FAILED(hr)) { // 失败则返回 ASSERT("failed" && FALSE); return hr; } // 让数学输入控件自动适应变化 LONG right = mc_left + mc_width; LONG bottom = mc_top + mc_height; hr = m_pIMathInputControl->SetPosition(mc_left, mc_top, right, bottom); if (FAILED(hr)) { ASSERT("Failed to set Math Input Control position." && FALSE); return hr; } m_pIMathInputControl->EnableExtendedButtons(VARIANT_TRUE); m_pEventListener = new CMathInputControlEventListener(this); if (!m_pEventListener) { ASSERT("Failed to create event listener for Math Input Control."); return E_FAIL; } // 开始识别数学控件输入 hr = m_pEventListener->AdviseMathInputControl(m_pIMathInputControl); if (FAILED(hr)) { // 识别笔迹事件 ASSERT("Failed to advise on MIC events" && FALSE); return hr; } return S_OK; } HRESULT CMathInputControlHost::OnMICInsert( BSTR bstrRecoResultMathML ) { if (!m_hWndEdit) { ASSERT("Edit box control is not initialized." && FALSE); return E_UNEXPECTED; } // 显示识别结果 SetWindowText(m_hWndEdit, (LPCWSTR)bstrRecoResultMathML); // 隐藏控件 HideMIC(); return S_OK; } //关闭识别 HRESULT CMathInputControlHost::OnMICClose(void) { return HideMIC(); } //清理识别结果 HRESULT CMathInputControlHost::OnMICClear(void) { HRESULT hr = S_OK; if (!m_pIMathInputControl) { ASSERT("Math Input Control not initialized" && FALSE); return E_UNEXPECTED; } if (!m_hWndEdit) { ASSERT("Edit box control is not initialized." && FALSE); return E_UNEXPECTED; } LONG left, right, top, bottom; hr = m_pIMathInputControl->GetPosition(&left, &top, &right, &bottom); if (FAILED(hr)) { ASSERT("Failed to get minimal window position." && FALSE); return E_FAIL; } right = mc_left + mc_width; bottom = mc_top + mc_height; hr = m_pIMathInputControl->SetPosition(left, top, right, bottom); if (FAILED(hr)) { ASSERT("Failed to set window position." && FALSE); return E_FAIL; } // 清理识别结果 SetWindowText(m_hWndEdit, L""); return hr; } //显示控件 LRESULT CMathInputControlHost::OnMICShow() { HRESULT hr = S_OK; if (!m_pIMathInputControl) { ASSERT("Math Input Control not initialized" && FALSE); return E_UNEXPECTED; } VARIANT_BOOL vbShown = VARIANT_FALSE; hr = m_pIMathInputControl->IsVisible(&vbShown); if (FAILED(hr)) { ASSERT("Failed to get visibility" && FALSE); return E_FAIL; } if (vbShown != VARIANT_TRUE) { hr = m_pIMathInputControl->Show(); ASSERT("Failed to show Math Input Control window" && SUCCEEDED(hr)); } return hr; } //隐藏控件 HRESULT CMathInputControlHost::HideMIC() { HRESULT hr = S_OK; if (!m_pIMathInputControl) { ASSERT("Math Input Control not initialized" && FALSE); return E_UNEXPECTED; } VARIANT_BOOL vbShown = VARIANT_FALSE; hr = m_pIMathInputControl->IsVisible(&vbShown); if (FAILED(hr)) { ASSERT("Failed to get visibility" && FALSE); return E_FAIL; } if (vbShown == VARIANT_TRUE) { hr = m_pIMathInputControl->Hide(); ASSERT("Failed to hide Math Input Control window" && SUCCEEDED(hr)); } return hr; } //清理 void CleanUp() { // Release all objects if (g_pMathInputControlHost != NULL) { delete g_pMathInputControlHost; } CoUninitialize(); } //消息循环 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: { // 重新设置输入区间的大小 HWND hWndEdit = g_pMathInputControlHost->GetEditWindow(); MoveWindow( hWndEdit, 0, LOWORD(lParam), HIWORD(lParam), TRUE ); } break; case WM_COMMAND: if (wParam == ID_SHOW) { g_pMathInputControlHost->OnMICShow(); } else { return DefWindowProc(hWnd, uMsg, wParam, lParam); } break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } //注册窗口类名 BOOL RegisterWindowClass(HINSTANCE hInstance) { WNDCLASSEX WndClassEx; WndClassEx.cbSize = sizeof(WndClassEx); WndClassEx.style = CS_HREDRAW | CS_VREDRAW; WndClassEx.lpfnWndProc = WndProc; WndClassEx.cbClsExtra = 0; WndClassEx.cbWndExtra = 0; WndClassEx.hInstance = hInstance; WndClassEx.hIcon = NULL; WndClassEx.hIconSm = NULL; WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); WndClassEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndClassEx.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); WndClassEx.lpszClassName = gc_wszAppName; if (!RegisterClassEx(&WndClassEx)) { MessageBox(NULL, L"Failed to register window class!", gc_wszAppName, MB_ICONERROR); false; } return true; } //起始窗体初始化 int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPWSTR /* lpCmdLine */, int nCmdShow) { if (!RegisterWindowClass(hInstance)) { return 0; } HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { CleanUp(); return 0; } // 创建程序窗体 HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, gc_wszAppName, gc_wszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, . hInstance, NULL ); if (NULL == hWnd) { MessageBox(NULL, L"Error creating the window", L"Error", MB_OK | MB_ICONINFORMATION); CleanUp(); return 0; } //创建文本框接受识别结果 HWND hWndEdit = CreateWindow( L"edit", NULL, // Specifies the style of the window being created. WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInstance, NULL ); if (NULL == hWnd) { MessageBox(NULL, L"Error creating the edit box control", L"Error", MB_OK | MB_ICONINFORMATION); CleanUp(); return 0; } // 创建数学监听控件与开始监听数学监听控件事件 g_pMathInputControlHost = new CMathInputControlHost(); if (!g_pMathInputControlHost) { ASSERT("Failed to create Math Input Control host."); CleanUp(); return -1; } // 初始化数学控件 hr = g_pMathInputControlHost->Init(hWnd, hWndEdit); if (FAILED(hr)) { ASSERT("Failed to initialize Math Input Control host."); CleanUp(); return -1; } // 显示主窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 开始消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } CleanUp(); return (int)msg.wParam; }

需要源代码,请在本人CSDN博客留言email

转载于:https://www.cnblogs.com/yincheng01/archive/2010/03/15/2213280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你所阅读的,决定你是什么样的人

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

下图为双总线结构机器的数据通路_海康机器人为物流加码:进击吧,双11新“打工人”...

今年的双11开启了迄今最长“战线”据国家邮政局初步预计&#xff0c;11月1日-16日全行业处理的邮(快)件业务量将达57.8亿件同比增长47%左右双11期间业务量将达29亿件比去年同期增长28%庞大的业务量和超快的物流速度&#xff0c;离不开智能终端、物联网、大数据等多重技术的支持…

设计模式之状态

状态模式介绍状态模式是一种行为设计模式&#xff0c;让你能在一个对象的内部状态变化时改变其行为&#xff0c;使其看上去就像改变了自身所属的类一样。根据状态不同&#xff0c;行为也不同状态模式描述的是一个行为下的多种状态变更&#xff0c;比如我们最常见的一个网站的页…

阿里最新面试必备项之Java的String类,持续更新中!

最新腾讯面试必备项之Java的String类&#xff0c;持续更新中&#xff01; 1.1 String的特性 String类&#xff1a;代表字符串。Java程序中的所有字符串字面值&#xff08;如“abc”&#xff09;都作为此类的实例实现。 String是一个final类&#xff0c;代表不可变的字符序列。…

Juster的MVP奋斗之路

大家好是朱震&#xff08;juster zhu&#xff09;MVP唯一id是5004326&#xff0c;这里主要给大家分享一下参选上MVP喜悦。首先非常感谢大伙对我的支持&#xff0c;在过去的8个多月里几乎每天都在写博客和做视频以及回答技术问题中度过。整个过程非常艰苦&#xff0c;身体不好真…

被嫌弃的蝗虫的一生

全世界只有3.14 % 的人关注了爆炸吧知识转载来源&#xff1a;混子曰部分素材源于网络&#xff0c;版权归原作者所有如有侵权请留言联系删除&#xff0c;感谢合作选购数学科普正版读物严选“数学思维好物”送给孩子的阅读礼物 | 办公室神器有益孩子一生的玩具 | 居家高科…

直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊

开始进入正题 一、技术介绍 SpringBoot整合MongoDB的实现步骤一、技术介绍1.MongoDB是什么&#xff1f;二、使用步骤1.MongoDB是什么&#xff1f; MongoDB&#xff08;来自于英文单词“Humongous”&#xff0c;中文含义为“庞大”&#xff09;是可以应用于各种规模的企业、各…

复工后,看看他们都是怎么上班的!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;大叔爱吐槽 人民日报本周全国各地终于逐步复工&#xff01;听&#xff01;小伙伴在召唤你&#xff01;你大概从未想过&#xff0c;有一天自己竟会盼望上班&#xff1f;困守家中的20多天&#xff0c;积累了天量防疫知识&a…

使用 OpenLDAP 集中管理用户帐号

关键字&#xff1a; OpenLDAP ReiserFS SCTP nmon 正则表达式 使用轻量级目录访问协议&#xff08;LDAP&#xff09;构建集中的身份验证系统可以减少管理成本&#xff0c;增强安全性&#xff0c;避免数据复制的问题&#xff0c;并提高数据的一致性。随着 Linux&reg; 的不断…

【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~

以前我刚入行&#xff0c;总是会犯这样几个常见错误&#xff0c;后面想起来是真的SB。当然每个程序员会犯错&#xff0c;重要的是从中吸取教训&#xff0c;得到成长。那么这些错误到底是什么呢&#xff1f;我来给大家盘点一下&#xff01;&#xff01;&#xff01; 当我感觉我…

解决ubuntu下eclipse 经常崩溃的问题

2019独角兽企业重金招聘Python工程师标准>>> ubuntu对SWT程序支持的不怎么好&#xff0c;基于SWT的eclipse在ubuntu下经常崩溃和失去响应&#xff0c;要解决这个问题需要1.需要卸载掉 overlay-scrollbar libwebkit-1.02.eclipse.ini中加入 -Dsun.awt.disablegrabtru…

揭秘神仙高校的课堂!网友跪了:这就是差距啊!

全世界只有3.14 % 的人关注了爆炸吧知识疫情之下&#xff0c;家家闭门谢客&#xff0c;宅着就是做贡献了。原本一晃而过的7天假期变得“漫长”&#xff0c;延迟复工、居家办公&#xff1b;学生党们把寒假过成了暑假。随着各高校公布延迟开学时间到二月底&#xff0c;各种网络直…

oracle中prad函数_024 SQL函数

1. 使用ORDER BY排序(1) ORDER BY 子句的作用是什么&#xff1f;用ORDER BY子句排序。用于对结果集进行排序处理&#xff0c;提供了升序排序&#xff08;ASC&#xff09;与降序排序&#xff08;DESC&#xff09;如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在…

世道变了,面试初级Java开发会问到Arrays!!!你不会还不知道吧!

一、基本定义 Arrays类&#xff0c;全路径java.util.Arrays&#xff0c;主要功能为操作数组&#xff0c;Arrays类的所有方法均为静态方法&#xff0c;所以 调用方式全部为Arrays.方法名 二、常用方法 1. <T> List<T> asList(T... a)可以将数组转化为相应的lis…

DNS(三)--子域授权和视图

实验题目&#xff1a;1.子域授权&#xff08;委派&#xff09;2.视图实验环境&#xff1a;1.vmware虚拟机2.linux子机两台3.XP测试机实验过程&#xff1a;一、子域授权在现实生活中我们世界互联网中的每个主机并不是在同一个域内&#xff0c;而是通过不同的依据将将其划分到不同…

11尺寸长宽 iphone_LED显示屏的尺寸规格计算方法

LED屏幕在生活中&#xff0c;随处可见&#xff0c;显示屏、广播屏等等&#xff0c;但是LED尺寸怎么计算的&#xff0c;你知道吗&#xff1f;今天我们来了解一下LED屏幕尺寸的计算方法。一、点间距的计算1、各单元板常见型号及尺寸LED屏普遍是用单元板做的。LED单元板常见型号及…

盘点数学里十大不需语言的证明

全世界只有3.14 % 的人关注了爆炸吧知识当谈到复杂数学定理的证明时&#xff0c;很多人常常为之色变&#xff0c;认为这只是一个枯燥的公式堆砌和深奥的数学推导过程。这当然是一个让笔者感到纠结的误解。因为数学证明中包含的美丽与精巧实在是一道亮丽的风景线&#xff0c;而这…

好端端的程序员,咋就成了新生代农民工!

实锤&#xff0c;程序员被划为新生代农民工&#xff0c;码农的称号终获官方认定&#xff0c;网上一片热议。虽然农民工的称呼有点突兀&#xff0c;然而更多的评论都是在羡慕程序员的高薪&#xff0c;尤其是那些能进一线大厂的幸运儿。往年.NET进大厂难&#xff0c;而今年腾讯、…

大厂Java初级开发工程师!!!面试必问项之Set实现类:TreeSet

一、TreeSet 概述 1、TreeSet是 SortedSet 接口的实现类&#xff0c; TreeSet 可以确保集合元素处于排序状态。 2、TreeSet顾名思义他内部维护的是一个TreeMap&#xff0c;底层是红黑二叉树&#xff0c;他使得集合内都是有序的序列。 3、Tree可以按照添加对象的指定属性&…

【Android笔记】如何创建列表视图3

接着上一篇实现一个带有复选框的列表视图&#xff0c;这要求对Adapter有比较清楚的理解。1. ArrayAdapter从Layout读取TextView控件&#xff0c;返回给ListView显示&#xff0c;这个处理在ArrayAdapter的getView方法里&#xff0c;我们可以继承这个类&#xff0c;覆盖getView&…