搭建好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

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

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

    搭建好Visual C++2010与windows SDK fo windows7的开发平台以后, 小试牛刀,检验下开发windows7的下的tabletpc应用,这个东西财务记账比较多, 大家先看效 ...

  2. 基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(1)

    2008年5月28日,微软即将退休的精神领袖比尔·盖茨和首席执行官史蒂夫·鲍尔默共同在北圣地亚哥四季艾维亚拉洲际度假村举办的2008 D6 All Things数字化大会上向到场的嘉宾展示了windo ...

  3. 基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路

    为什么做这个? 今年初接到一个项目任务,客户要求在自己的音视频平台系统中集成webrtc功能(原系统是基于SIP协议开发的,已经稳定运行多年,有很多客户).在比对了多家RTC产品的效果后,.他们对声网 ...

  4. 计算道路超高lisp_基于Visual LISP的地铁轨道综合图辅助设计程序开发

    基于Visual LISP的地铁轨道综合图辅助设计程序开发 基于Visual LISP的地铁轨道综合图辅助设计程序开发 吴凯伟,石玮荃 (中铁工程设计咨询集团有限公司,北京 100055) 摘 要:为 ...

  5. Kinect for Windows SDK v2.0 开发笔记 (十) 高清面部帧(1) FACS 介绍

    转载于:https://blog.csdn.net/dustpg/article/details/38892783 使用SDK: Kinect for Windows SDK v2.0 public ...

  6. android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...

    专利名称:一种基于Android系统的手写数学公式识别及生成MathML的方法 技术领域: 本发明属于模式识别技术领域,涉及数学公式中字符间的空间结构分析,具体涉及一种基于Android系统的手写数学 ...

  7. matlab为什么要升维数,基于MATLAB和升维投影法的手写字符识别输入系统

    256 现代交际·2019年6期 作者简介:王思达,长春师范大学学生,研究方向:计算机科学与技术:刘勇,长春师范大学学生,研究方向:计算机科学与技术:袁汇灵, 长春师范大学学生,研究方向:计算机科学与 ...

  8. 基于Visua C++2010 与 Windows 7 SDK开发windows7 Shell应用(1)-搜索文件夹

    windows7 shell 就是windows7操作系统的的控制台 对于熟悉了命令行的人而言,用键盘调用程序比鼠标更快更省力 您可以用"Shell:"命令调用一切可以用资源管理器 ...

  9. 基于Visual C 2010开发Windows7应用 多点触摸图片处理应用程序 1 同时处理多张图片

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! wind ...

  10. 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...

    windows7的触摸功能开辟了一个电脑的全新世纪.从此,您可以丢掉鼠标和键盘,直接用手在屏幕上玩游戏.用笔来写字编辑文档,聊天. windows7最重要特性之一就是:支持多点触摸.比尔盖茨说,不久, ...

最新文章

  1. Android MTK平台最完备的开机动画修改教程
  2. Linux之系统文件管理
  3. EAI的Spring集成教程
  4. u3d打包成exe以及调试
  5. BZOJ 1014: [JSOI2008]火星人prefix
  6. 使用脚本 Nodesource快速安装nodejs环境
  7. 解决:惠普HP LaserJet Pro M126a MFP 驱动 安装失败,及其它同类打印机失败问题
  8. 计算机丢失d3dx934,d3dx9_34.dll
  9. newifi3 web认证_新路由3newifi3路由器刷机newifi3breed解锁小白刷机教程路由器刷breed老毛子Padavan固件...
  10. 对网上一些Java笔试题的总结,答案与自我理解(400道)
  11. 协议栈数据包快速转发的实现(2)
  12. snapchat_Snapchat的新地图功能介绍(以及如何禁用它)
  13. 不是买一台电脑就能敲代码!学习java必须了解的计算机知识以及准备工作
  14. 《鱿鱼游戏》开场了|谁才是影评人的御用写作工具
  15. STM32F1和F4的区别
  16. Serial Programming HOWTO
  17. 分享我用Qt写的游戏组队群聊系统
  18. 【xitongshoucang.com】全方位对Shift键大揭秘
  19. 原生javascript手风琴导航
  20. 用过留痕,谁动了我的档案?

热门文章

  1. 【webrtc 桌面采集】DXGI 流程
  2. 微信公众号文章编辑排版工具+自动采集+使用视频教程
  3. 计算机在高分子材料与工程中的应用,计算机技术在高分子材料工程中的应用.doc...
  4. kali更新sqlmap命令以及更新后无法使用的解决方法
  5. linux daemontools 安装
  6. ROOT友华PT921G光猫
  7. 哈工大车万翔团队:口语语言理解的最新进展与前沿
  8. 根据stc89原理图画pcb_STC89C51单片机对AD模数转换学习板的控制原理解析
  9. 联想g510拆键盘的简单方法_联想g510笔记本电脑键盘拆卸视频
  10. 二阶有源带通滤波器滤波原理