您的位置:首页 > 编程语言 > C语言/C++

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

2013-04-21 23:17 465 查看
2008年5月28日,微软即将退休的精神领袖比尔·盖茨和首席执行官史蒂夫·鲍尔默共同在北圣地亚哥四季艾维亚拉洲际度假村举办的2008D6AllThings数字化大会上向到场的嘉宾展示了windows7的测试版.
鲍尔默向记者打趣道:“今天只给你们看一丁点儿(justasnippet)哟!”然而就是那么一丁点儿,已经让世界为之惊艳!
盖茨和鲍尔默在D6AllThings数字化大会上重点展示的是多触点技术(multitouchtechnology),这是运行Windows7的硬件将具备的全新系统特性。和鼠标、键盘、光笔和传统触摸屏等输入设备完全不同的是,多触点技术“输入基本靠手”,系统能够同时处理多个手指触点,并能够分析出触点的运动及其组合,而且即时给出结果。
  微软副总裁茱莉·拉尔森-格林(JulieLarson-Green)在演示中,用手指在笔记本上画了一棵树,他说,“你们将在不同尺寸和外形的计算机上看到这一技术的应用。”盖茨和鲍尔默表示,这项技术能够彻底改变现在的基本操作如图片编辑和地图浏览的使用习惯,茱莉当场用短短几分钟的时间,熟练地完全使用手指操作找到了离主会场最近的一家星巴克咖啡馆,引起了观众的一片惊叹和热烈的掌声。
  多触点技术起源于数字墨水技术,而名噪一时的平板电脑(TabletPC)正是第一个提出以自然笔触实现数字输入的硬件设备。数字墨水技术的先行者亚历山大·格奈尔斯(AlexanderGounares)曾经一跃成为直接向盖茨汇报的技术助理,而数字墨水技术的中国区负责人王坚也指出“这是一场对传统的纸和笔发动的真正革命”。而多触点技术则是这一先进技术的重要延伸,它处理的不仅是多个运动点,更重要的是它们的运动方向和趋势,以得出一个复杂的结果动作。比如在Windows7中,就很有可能实现用手“整理”好一堆文件,然后“抓”起来“丢”进回收站的效果。这对于普通用户来说,无疑将是操作方面的一次不亚于鼠标发明的体验革命。
如果说Vista是一个革命性的产品,对传统形成了冲击。那么Windows7将是一个成熟化的产品,有着极好的可伸缩性,并对从最老旧到最新潮的软件和硬件提供良好的支持,形成自己的新传统。比如,更多64位软件和硬件的支持将是微软的一个目标,它为家庭和企业都提供了海量存储的前提,和计算性能的大幅提高。因此,从这个意义上来说,Windows7并不是Vista的升级版,而是WindowsXP的真正集成版本。
  Windows7更重大的意义所在,是给现在IT产业带来了全新变革和无穷商机。Windows7最重大的变革之一是,将触摸技术全面引入了操作系统,这是一次比鼠标发明更为重要的体验革命,是Windows在人机交互界面的一次全新变革。可以肯定的是,虽然说是苹果iPhone开了触摸技术的先河,但微软却可以凭借自己在软件领域中的垄断优势而让这一技术快速普及,这对软件行业来说,不啻一个全新的变革。
  实际上,触摸技术全面引入,不仅仅是微软,也是硬件领域的重大变革。在未来,加快触摸技术的应用和普及是大势所趋,而最大可能的新商机则在笔记本电脑、多媒体上。想象一下,当触摸技术全面引入笔记本电脑后,那是一件多么美好的体验,以及蕴藏多大的商机?有多少全新IT产品将应运而生?
下面我见识一下,Windows7卓越的触摸特性的视频
http://you.video.sina.com.cn/b/18868705-1578909250.html
目前仅有三款机型支持当前的Windows7测试版的触摸功能,同时还必须借助最新的多重触摸版驱动程序。这三款机器分别是惠普的TouchSmartAllinone产品中的(IQ500系列和IQ800系列),惠普TouchSmarttx2平板电脑和戴尔的LatitudeXT或XT2平板电脑。
  这些支持WindowsTouch徽标计划的计算机设备必须通过一套由微软团队设计的43项试验测试。该公司还有一个组件级别的认证计划,以帮助原始设备制造商选择他们产品的硬件组合。
  根据微软的声明,微软的一些硬件合作伙伴已经提交设备和驱动程序以待加入微软的内部设施测试。
  合作伙伴开发的应用程序将使用触摸界面获得三个层次的微软平台,这三个层次分别为:好、较好、最佳的触摸体验。此外,最初级的层次是免费向开发商提供的,其设计是用于触摸不熟悉的应用程序。在“较好”层次的平台增加了直接的鼠标手势(Gestures)支持。最后的“最佳”层次的平台是为那些想要超越微软的核心工具并创建自定义的手势和自控模式的开发商设计的。
  微软还为其最新的微软表面运算(surfacecomputing)的两个应用程序编程接口(API)提供了一个“COM版本”的触摸技术,同样具有“可操作性”和“惯性”。表面运算是微软的触摸电脑开发工具包,能够感受触摸体验。


作为我们开发人员是不是迫不及待的想尝试下,自己开发一个多点触摸特性的应用程序

1.启动VS2010,并创建MFC项目Touchpad





2在应用程序类型,选择单文档。如下图所示,配置程序一直到结束。














3.在程序里面添加触摸功能的硬件检查,在程序初始化中加入
BYTEdigitizerStatus=(BYTE)GetSystemMetrics(SM_DIGITIZER); if((digitizerStatus&(0x80+0x40))==0)//检查程序准备完毕,并检测硬件 { AfxMessageBox(L"Notouchinputiscurrentlyavailable."); returnFALSE; } BYTEnInputs=(BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES); CStringstr; str.Format(L"Touchinputavailablewith%dtouchpoints.",nInputs); AfxMessageBox(str); returnTRUE;

4.运行程序进行多点触摸检测



6.
为了注册应用程序客户端视图窗口接收触摸信息,我们需要调用MFC函数调用CWnd::RegisterTouchWindow()。我们将这样做后,认为已经建立,即在OnCreate()事件处理程序。
切换到类视图和选择CChildViewclass.In的属性页,转到消息属性表,找到WM_CREATE,然后添加在OnCreate从下拉框中()消息处理程序:




插入下列代码检测注册的多点触摸窗口
if(!RegisterTouchWindow()) { ASSERT(FALSE); }
我们会收到touch窗口的触摸消息:CWnd::OnTouchInput().
头文件ChildView.h加入下列函数
//Overrides
protected:
virtualBOOLOnTouchInput(CPointpt,intnInputNumber,intnInputsCount,PTOUCHINPUTpInput);
ChildView.cpp源文件中加入下列函数
[code]BOOLCChildView::OnTouchInput(CPointpt,intnInputNumber,intnInputsCount,PTOUCHINPUTpInput)
{
//在此处理多点触摸消息
returnFALSE;
}
加入多彩绘画文件,
#include"Stroke.h"
#include"StrokeCollection.h"
private:intm_iCurrColor;//笔迹颜色CStrokeCollectionm_StrkColFinished;//收集轨迹绘图绘制成功.CStrokeCollectionm_StrkColDrawing;//笔迹绘制[/code]
让颜色初始化
[code]CChildView::CChildView():m_iCurrColor(0)
{
}
在CChildView::OnPaint()加入下列代码进行绘图
m_StrkColFinished.Draw(&dc);
protected:
//定义多点触摸不同的触摸点
BOOLOnTouchInputDown(CPointpt,PTOUCHINPUTpInput);
BOOLOnTouchInputMove(CPointpt,PTOUCHINPUTpInput);
BOOLOnTouchInputUp(CPointpt,PTOUCHINPUTpInput);
处理多点触摸函数
BOOLCChildView::OnTouchInputDown(CPointpt,PTOUCHINPUTpInput)
{
//创建多点触摸程序
COLORREFstrokeColor=GetTouchColor((pInput->dwFlags&TOUCHEVENTF_PRIMARY)!=0);

CStroke*pStrkNew=newCStroke(pInput->dwID,strokeColor);
pStrkNew->Add(pt);

//添加新的笔记轨迹
m_StrkColDrawing.Add(pStrkNew);

returnTRUE;
}

BOOLCChildView::OnTouchInputMove(CPointpt,PTOUCHINPUTpInput)
{
//寻找笔迹轨迹
intstrokeIndex=m_StrkColDrawing.FindStrokeById(pInput->dwID);

if(strokeIndex>=0)
{
CStroke*pStrk=m_StrkColDrawing[strokeIndex];

//加入绘图点
pStrk->Add(pt);

//绘制图纸
pStrk->Draw(GetDC());
}

returnTRUE;
}

BOOLCChildView::OnTouchInputUp(CPointpt,PTOUCHINPUTpInput)
{
//寻找绘制的点
intstrokeIndex=m_StrkColDrawing.FindStrokeById(pInput->dwID);

if(strokeIndex>=0)
{
CStroke*pStrkCopy=m_StrkColDrawing[strokeIndex];

//删除笔迹
m_StrkColDrawing.RemoveAt(strokeIndex);

//加入公用笔迹
m_StrkColFinished.Add(pStrkCopy);
}

returnTRUE;
}
在CChildView::OnTouchInput()进行处理每个消息
BOOLCChildView::OnTouchInput(CPointpt,intnInputNumber,intnInputsCount,PTOUCHINPUTpInput)
{
if((pInput->dwFlags&TOUCHEVENTF_DOWN)==TOUCHEVENTF_DOWN)//触摸按下
{
returnOnTouchInputDown(pt,pInput);
}
elseif((pInput->dwFlags&TOUCHEVENTF_MOVE)==TOUCHEVENTF_MOVE)//触摸移动
{
returnOnTouchInputMove(pt,pInput);
}
elseif((pInput->dwFlags&TOUCHEVENTF_UP)==TOUCHEVENTF_UP)//触摸放手
{
returnOnTouchInputUp(pt,pInput);
}

returnFALSE;

[code]加入获取GetTouchColor()函数
private:
COLORREFGetTouchColor(boolbPrimaryContact);
[code]COLORREFCChildView::GetTouchColor(boolbPrimaryContact)
{
staticCOLORREFc_arrColor[]=//Secondarycolorsarray
{
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
};

COLORREFcolor;
if(bPrimaryContact)
{
//Theprimarycontactisdrawninblack.
color=RGB(0,0,0);//Black
}
else
{
//Takecurrentsecondarycolor.
color=c_arrColor[m_iCurrColor];

//Movetothenextcolorinthearray.
m_iCurrColor=(m_iCurrColor+1)%(sizeof(c_arrColor)/sizeof(c_arrColor[0]));
}

returncolor;
}
在程序关闭时释放对象
CChildView::~CChildView()
{
for(inti=0;i<m_StrkColDrawing.GetCount();++i)
{
deletem_StrkColDrawing[i];
}

for(inti=0;i<m_StrkColFinished.GetCount();++i)
{
deletem_StrkColFinished[i];
}
}
7.运行程序实验多点触摸




绘制函数源文件如下
#pragmaonce
#include"afxtempl.h"

#include<vector>
usingnamespacestd;

classCStroke:publicCArray<POINT,POINT>
{
public:
CStroke(intid,COLORREFclr);
~CStroke(void);

COLORREFGetColor()const{returnm_clr;}

intGetId()const{returnm_id;}

voidDraw(CDC*pDC)const;

private:
COLORREFm_clr;//Strokecolor
intm_id;//StrokeID
};

#include"StdAfx.h"
#include"Stroke.h"

CStroke::CStroke(intid,COLORREFcolor):
m_clr(color),
m_id(id)
{

SetSize(0,1000);
}

voidCStroke::Draw(CDC*pDC)const
{
if(GetCount()<=0)
return;

CPenpen(PS_SOLID,3,m_clr);
CPen*oldPen=pDC->SelectObject(&pen);

pDC->MoveTo(GetAt(0));

pDC->Polyline(GetData(),GetCount());
pDC->SelectObject(oldPen);
}

CStroke::~CStroke(void)
{
}

#pragmaonce
#include"afxtempl.h"
#include"Stroke.h"

classCStrokeCollection:publicCArray<CStroke*,CStroke*>
{
public:
CStrokeCollection(void);
~CStrokeCollection(void);

//SearchthecollectionforgivenID.
intFindStrokeById(intid)const;

//Drawthecollectionofthestrokes.
voidDraw(CDC*pDC)const;

};
#include"StdAfx.h"
#include"StrokeCollection.h"

CStrokeCollection::CStrokeCollection(void)
{
}

CStrokeCollection::~CStrokeCollection(void)
{
}

intCStrokeCollection::FindStrokeById(intid)const
{
for(inti=0;i<GetCount();i++)
{
if(GetAt(i)->GetId()==id)
{
returni;
}
}

return-1;
}
voidCStrokeCollection::Draw(CDC*pDC)const
{
for(inti=0;i<GetCount();++i)
{
GetAt(i)->Draw(pDC);
}
}

如需要源代码,请在本人CSDN博客留言留下您的Email
本文作者专著《VisualC++2010开发权威指南》即将推出,敬请关注,VisualC++2010最近技术,Windows7开发最新技术!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐