基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(1)
2008年5月28日,微软即将退休的精神领袖比尔·盖茨和首席执行官史蒂夫·鲍尔默共同在北圣地亚哥四季艾维亚拉洲际度假村举办的2008 D6 All Things数字化大会上向到场的嘉宾展示了windows7的测试版.
鲍尔默向记者打趣道:“今天只给你们看一丁点儿(just a snippet)哟!”然而就是那么一丁点儿,已经让世界为之惊艳!
盖茨和鲍尔默在D6 All Things数字化大会上重点展示的是多触点技术(multitouch technology),这是运行Windows 7的硬件将具备的全新系统特性。和鼠标、键盘、光笔和传统触摸屏等输入设备完全不同的是,多触点技术“输入基本靠手”,系统能够同时处理多个手指触点,并 能够分析出触点的运动及其组合,而且即时给出结果。
微软副总裁茱莉·拉尔森-格林(Julie Larson-Green)在演示中,用手指在笔记本上画了一棵树,他说,“你们将在不同尺寸和外形的计算机上看到这一技术的应用。” 盖茨和鲍尔默表示,这项技术能够彻底改变现在的基本操作如图片编辑和地图浏览的使用习惯,茱莉当场用短短几分钟的时间,熟练地完全使用手指操作找到了离主 会场最近的一家星巴克咖啡馆,引起了观众的一片惊叹和热烈的掌声。
多触点技术起源于数字墨水技术,而名噪一时的平板电脑(Tablet PC)正是第一个提出以自然笔触实现数字输入的硬件设备。数字墨水技术的先行者亚历山大·格奈尔斯(Alexander Gounares)曾经一跃成为直接向盖茨汇报的技术助理,而数字墨水技术的中国区负责人王坚也指出“这是一场对传统的纸和笔发动的真正革命”。而多触点 技术则是这一先进技术的重要延伸,它处理的不仅是多个运动点,更重要的是它们的运动方向和趋势,以得出一个复杂的结果动作。比如在Windows 7中,就很有可能实现用手“整理”好一堆文件,然后“抓”起来“丢”进回收站的效果。这对于普通用户来说,无疑将是操作方面的一次不亚于鼠标发明的体验革命。
如果说Vista是一个革命性的产品,对传统形成了冲击。那么Windows 7将是一个成熟化的产品,有着极好的可伸缩性,并对从最老旧到最新潮的软件和硬件提供良好的支持,形成自己的新传统。比如,更多64位软件和硬件的支持将 是微软的一个目标,它为家庭和企业都提供了海量存储的前提,和计算性能的大幅提高。因此,从这个意义上来说,Windows 7并不是Vista的升级版,而是Windows XP的真正集成版本。
Windows 7更重大的意义所在,是给现在IT产业带来了全新变革和无穷商机。Windows 7最重大的变革之一是,将触摸技术全面引入了操作系统,这是一次比鼠标发明更为重要的体验革命,是Windows在人机交互界面的一次全新变革。可以肯定 的是,虽然说是苹果iPhone开了触摸技术的先河,但微软却可以凭借自己在软件领域中的垄断优势而让这一技术快速普及,这对软件行业来说,不啻一个全新 的变革。
实际上,触摸技术全面引入,不仅仅是微软,也是硬件领域的重大变革。在未来,加快触摸技术的应用和普及是大势所趋,而最大可能的新商机则在笔记 本电脑、多媒体上。想象一下,当触摸技术全面引入笔记本电脑后,那是一件多么美好的体验,以及蕴藏多大的商机?有多少全新IT产品将应运而生?
下面我见识一下,Windows 7卓越的触摸特性的视频
7测试版的触摸功能,同时还必须借助最新的多重触摸版驱动程序。这三款机器分别是惠普的TouchSmart All in one产品中的(IQ500系列和IQ800系列),惠普TouchSmart tx2平板电脑和戴尔的Latitude XT或XT2平板电脑。
这些支持Windows Touch徽标计划的计算机设备必须通过一套由微软团队设计的43项试验测试。该公司还有一个组件级别的认证计划,以帮助原始设备制造商选择他们产品的硬件组合。
合作伙伴开发的应用程序将使用触摸界面获得三个层次的微软平台,这三个层次分别为:好、较好、最佳的触摸体验。此外,最初级的层次是免费向开发商提供的,其设计是用于触摸不熟悉的应用程序。在“较好” 层次的平台增加了直接的鼠标手势(Gestures)支持。最后的“最佳” 层次的平台是为那些想要超越微软的核心工具并创建自定义的手势和自控模式的开发商设计的。
微软还为其最新的微软表面运算(surface computing)的两个应用程序编程接口(API)提供了一个“COM版本”的触摸技术,同样具有“可操作性”和“惯性”。 表面运算是微软的触摸电脑开发工具包,能够感受触摸体验。
作为我们开发人员是不是迫不及待的想尝试下,自己开发一个多点触摸特性的应用程序
1.启动VS2010,并创建MFC项目Touchpad
2 在应用程序类型,选择单文档。如下图所示,配置程序一直到结束。
3.在程序里面添加触摸功能的硬件检查,在程序初始化中加入
BYTE digitizerStatus = (BYTE) GetSystemMetrics(SM_DIGITIZER);if ((digitizerStatus & (0x80 + 0x40)) == 0) //检查程序准备完毕,并检测硬件{ AfxMessageBox(L"No touch input is currently available."); return FALSE;}BYTE nInputs = (BYTE) GetSystemMetrics(SM_MAXIMUMTOUCHES);CString str;str.Format(L"Touch input available with %d touch points.", nInputs);AfxMessageBox(str);return TRUE;
4.运行程序进行多点触摸检测
6.
为了注册应用程序客户端视图窗口接收触摸信息,我们需要调用MFC函数调用CWnd::RegisterTouchWindow()。我们将这样做后,认为已经建立,即在OnCreate()事件处理程序。
切换到类视图和选择CChildView class.In的属性页,转到消息属性表,找到WM_CREATE,然后添加在OnCreate从下拉框中()消息处理程序:
插入下列代码检测注册的多点触摸窗口
if (!RegisterTouchWindow())
{
ASSERT(FALSE);
}
我们会收到 touch窗口的 触摸消息: CWnd::OnTouchInput().
头文件ChildView.h加入下列函数
|
|
// Overrides protected: virtual BOOL OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput); BOOL CChildView::OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput) { // 在此处理多点触摸消息 return FALSE; } 加入多彩绘画文件,#include "Stroke.h" #include "StrokeCollection.h"
private: int m_iCurrColor; //笔迹颜色 CStrokeCollection m_StrkColFinished; // 收集轨迹绘图绘制成功 . CStrokeCollection m_StrkColDrawing; // 笔迹绘制 让颜色初始化CChildView::CChildView() : m_iCurrColor(0) { } 在CChildView::OnPaint() 加入下列代码进行绘图m_StrkColFinished.Draw(&dc);protected: // 定义多点触摸不同的触摸点 BOOL OnTouchInputDown(CPoint pt, PTOUCHINPUT pInput); BOOL OnTouchInputMove(CPoint pt, PTOUCHINPUT pInput); BOOL OnTouchInputUp(CPoint pt, PTOUCHINPUT pInput); 处理多点触摸函数 BOOL CChildView::OnTouchInputDown(CPoint pt, PTOUCHINPUT pInput) { // 创建多点触摸程序COLORREF strokeColor = GetTouchColor((pInput->dwFlags & TOUCHEVENTF_PRIMARY) != 0);
CStroke* pStrkNew = new CStroke(pInput->dwID, strokeColor); pStrkNew->Add(pt);
//添加新的笔记轨迹 m_StrkColDrawing.Add(pStrkNew);
return TRUE; }
BOOL CChildView::OnTouchInputMove(CPoint pt, PTOUCHINPUT pInput) { // 寻找笔迹轨迹 int strokeIndex = m_StrkColDrawing.FindStrokeById(pInput->dwID);
if (strokeIndex >= 0) { CStroke* pStrk = m_StrkColDrawing[strokeIndex];
// 加入绘图点 pStrk->Add(pt);
// 绘制图纸 pStrk->Draw(GetDC()); }
return TRUE; }
BOOL CChildView::OnTouchInputUp(CPoint pt, PTOUCHINPUT pInput) { // 寻找绘制的点 int strokeIndex = m_StrkColDrawing.FindStrokeById(pInput->dwID);
if (strokeIndex >= 0) { CStroke* pStrkCopy = m_StrkColDrawing[strokeIndex];
// 删除笔迹m_StrkColDrawing.RemoveAt(strokeIndex);
// 加入公用笔迹 m_StrkColFinished.Add(pStrkCopy); }
return TRUE; }
在CChildView::OnTouchInput() 进行处理每个消息 BOOL CChildView::OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput) { if ((pInput->dwFlags & TOUCHEVENTF_DOWN) == TOUCHEVENTF_DOWN) // 触摸按下{ return OnTouchInputDown(pt, pInput); } else if ((pInput->dwFlags & TOUCHEVENTF_MOVE) == TOUCHEVENTF_MOVE) // 触摸移动{ return OnTouchInputMove(pt, pInput); } else if ((pInput->dwFlags & TOUCHEVENTF_UP) == TOUCHEVENTF_UP) // 触摸放手{ return OnTouchInputUp(pt, pInput); }
return FALSE;
加入获取GetTouchColor()函数private: COLORREF GetTouchColor(bool bPrimaryContact);
COLORREF CChildView::GetTouchColor(bool bPrimaryContact) { static COLORREF c_arrColor[] = // Secondary colors array { RGB(255, 0, 0), // Red RGB(0, 255, 0), // Green RGB(0, 0, 255), // Blue RGB(0, 255, 255), // Cyan RGB(255, 0, 255), // Magenta RGB(255, 255, 0) // Yellow };
COLORREF color; if (bPrimaryContact) { // The primary contact is drawn in black. color = RGB(0,0,0); // Black } else { // Take current secondary color. color = c_arrColor[m_iCurrColor];
// Move to the next color in the array. m_iCurrColor = (m_iCurrColor + 1) % (sizeof(c_arrColor)/sizeof(c_arrColor[0])); }
return color; }在程序关闭时释放对象 CChildView::~CChildView() { for (int i = 0; i < m_StrkColDrawing.GetCount(); ++i) { delete m_StrkColDrawing[i]; }
for (int i = 0; i < m_StrkColFinished.GetCount(); ++i) { delete m_StrkColFinished[i]; } }
|
7.运行程序实验多点触摸
绘制函数源文件如下
#pragma once#include "afxtempl.h"#include using namespace std;class CStroke : public CArray{public: CStroke(int id, COLORREF clr); ~CStroke(void); COLORREF GetColor() const { return m_clr; } int GetId() const { return m_id; } void Draw(CDC* pDC) const;private: COLORREF m_clr; // Stroke color int m_id; // Stroke ID};#include "StdAfx.h"#include "Stroke.h"CStroke::CStroke(int id, COLORREF color): m_clr(color), m_id(id){ SetSize(0, 1000);}void CStroke::Draw(CDC* pDC) const{ if (GetCount() <= 0) return; CPen pen(PS_SOLID, 3, m_clr); CPen* oldPen = pDC->SelectObject(&pen); pDC->MoveTo(GetAt(0)); pDC->Polyline(GetData(), GetCount()); pDC->SelectObject(oldPen);}CStroke::~CStroke(void){}#pragma once#include "afxtempl.h"#include "Stroke.h"class CStrokeCollection : public CArray{public: CStrokeCollection(void); ~CStrokeCollection(void); // Search the collection for given ID. int FindStrokeById(int id) const; // Draw the collection of the strokes. void Draw(CDC* pDC) const;};#include "StdAfx.h"#include "StrokeCollection.h"CStrokeCollection::CStrokeCollection(void){}CStrokeCollection::~CStrokeCollection(void){}int CStrokeCollection::FindStrokeById(int id) const{ for (int i = 0; i < GetCount(); i++) { if (GetAt(i)->GetId() == id) { return i; } } return -1;}void CStrokeCollection::Draw(CDC* pDC) const{ for (int i = 0; i < GetCount(); ++i) { GetAt(i)->Draw(pDC); }}
如需要源代码,请在本人博客留言留下您的Email
本文作者专著《Visual C++2010开发权威指南》即将推出,敬请关注,Visual C++2010最近技术,Windows7开发最新技术!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~