Win7 屏幕觸控API揭秘

2010/1/16 11:12:11    編輯:軟媒 - 笨笨     字體:【

Win7之家afsion.com.cn):Win7 屏幕觸控API揭秘

  Win7有一些酷炫的功能是XP、Vista系統(tǒng)沒(méi)有的,例如窗口分組預(yù)覽、快速隱藏桌面圖標(biāo)、搖走其他窗口……這些酷炫的功能是怎么設(shè)計(jì)的?我們開(kāi)發(fā)的個(gè)人軟件如何使用這些功能,給用戶帶來(lái)驚喜?

  在《少數(shù)派報(bào)告》中阿湯哥直接用雙指在觸摸屏上操作程序,酷斃了。這種功能Win 7也支持,只要有觸摸設(shè)備,我們也可以在Win7上用雙手玩轉(zhuǎn)電腦。雙指觸控如縮放、雙指放大、雙指翻頁(yè)等特效都可以在Win 7中實(shí)現(xiàn)。

  Win7常用的兩種觸控手勢(shì)

  1.縮放手勢(shì)

  縮放手勢(shì)用于界面放大或縮小,在瀏覽圖片、文章閱讀等程序中常常會(huì)用到。雙指縮放的手勢(shì)如圖1所示:雙指并攏置于窗體中,一指向上滑動(dòng),一指向下滑動(dòng),這是放大,雙指分開(kāi)置于窗體上,兩指向中間滑動(dòng),則是縮小。



  程序要識(shí)別出這個(gè)手勢(shì),第一步,要得到手指點(diǎn)到屏幕的消息。第二步,根據(jù)兩指的坐標(biāo)計(jì)算出距離,根據(jù)一個(gè)經(jīng)驗(yàn)值對(duì)兩指距離進(jìn)行比較,來(lái)得到這是兩指分開(kāi)或兩指并攏。第三步,可以根據(jù)一個(gè)定時(shí)器來(lái)實(shí)時(shí)捕捉手指點(diǎn)的坐標(biāo),來(lái)計(jì)算出移動(dòng)方向及速率,進(jìn)一步就可判斷出兩指是反向滑動(dòng)還是相向滑動(dòng)。

  2.平移手勢(shì)

  平移手勢(shì)往往用于導(dǎo)航。例如在一個(gè)圖片查看程序中,使用向左平移手勢(shì)可以導(dǎo)航到上一張,使用向右平移手勢(shì)導(dǎo)航到下一張圖片。平移手勢(shì)如圖2所示:雙指同時(shí)向左滑動(dòng),或向右滑動(dòng)。如何區(qū)分用戶是要改變圖片的位置還是翻頁(yè)呢?這里必須使用到加速度。



  可以在一個(gè)定時(shí)器中實(shí)時(shí)捕捉手指坐標(biāo),計(jì)算出速率和加速度,可以通過(guò)一個(gè)經(jīng)驗(yàn)值去和加速度比較,當(dāng)加速度比較大的時(shí)候,可以認(rèn)為是翻頁(yè),反之則是拖動(dòng)。當(dāng)然,這還不夠,當(dāng)拖動(dòng)時(shí),還需要進(jìn)一步判斷是否到達(dá)程序邊界,如果到達(dá)邊界,也認(rèn)為是翻頁(yè)。對(duì)于翻頁(yè)的處理,向左快速移動(dòng)或到達(dá)左邊界,則認(rèn)為是上一頁(yè)。

  雙指觸控API揭秘

  雙指觸控的核心是把原始觸摸數(shù)據(jù)放入運(yùn)動(dòng)模型中去計(jì)算,以識(shí)別出用戶的手勢(shì)。原始觸摸數(shù)據(jù)可以從WM_TOUCH消息中得到。通過(guò)WM_TOUCH識(shí)別出縮放和平移手勢(shì)。

  第一步:檢查多點(diǎn)觸控硬件

  這里使用GetSystemMetrics API來(lái)獲取硬件是不是就緒:

  BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
  if ((digitizerStatus & (0x80 + 0x40)) == 0){
  //沒(méi)檢測(cè)到多點(diǎn)觸控設(shè)備或設(shè)備沒(méi)有就緒
  }
  //檢查設(shè)備支持幾個(gè)觸摸點(diǎn),需要注意的是目前Win 7對(duì)2個(gè)觸摸點(diǎn)支持得比較好
  BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES);

  第二步:切換到原始觸摸消息

  在默認(rèn)情況下,Win 7默認(rèn)提供 WM_GESTURE(手勢(shì))消息。這個(gè)手勢(shì)是系統(tǒng)根據(jù)原始觸摸數(shù)據(jù)來(lái)識(shí)別的手勢(shì),使用 RegisterTouchWindow API函數(shù)可讓系統(tǒng)返回WM_TOUCH原始觸摸輸入消息,核心代碼:

  RegisterTouchWindow(hWnd, 0)) //hwnd為當(dāng)前窗口的句柄。

  第三步:得到原始觸摸數(shù)據(jù)

  使用GetTouchInputInfo API得到原始觸摸數(shù)據(jù),核心代碼:

  GetTouchInputInfo((HTOUCHINPUT)lParam,numInputs,ti,sizeof(TOUCHINPUT)))
  numInputs為預(yù)先聲明的變量,用于存儲(chǔ)有幾個(gè)觸摸點(diǎn),如果是5個(gè)手指同時(shí)在屏幕滑動(dòng),那么numInputs就為5。
  ti是TOUCHINPUT結(jié)構(gòu),其包含了觸點(diǎn)的X和Y坐標(biāo)、發(fā)生時(shí)間、觸摸類(lèi)型(類(lèi)似于鼠標(biāo)按下、鼠標(biāo)移動(dòng)、鼠標(biāo)釋放等)。

  for(unsigned int i=0; i<numInputs; ++i){ //根據(jù)觸摸輸入點(diǎn)循環(huán)
  if (ti[i].dwFlags & TOUCHEVENTF_DOWN){
  OnTouchDownHandler(hWnd, ti[i]);//交給觸點(diǎn)按下函數(shù)處理
  }else if (ti[i].dwFlags & TOUCHEVENTF_MOVE){
  OnTouchMoveHandler(hWnd, ti[i]);//交給觸點(diǎn)移動(dòng)函數(shù)處理
  }else if (ti[i].dwFlags & TOUCHEVENTF_UP){
  OnTouchUpHandler(hWnd, ti[i]);} //交給觸點(diǎn)釋放函數(shù)處理
  }

  這里的觸點(diǎn)按下、移動(dòng)、釋放等函數(shù),實(shí)際上是一個(gè)運(yùn)動(dòng)仿真模型,我們?cè)谀P椭�,要將觸點(diǎn)的軌跡生成若干條運(yùn)動(dòng)曲線,并計(jì)算出每個(gè)點(diǎn)的方位角、速率、法向加速度、切向加速度等,以識(shí)別出具體的手勢(shì)。

  小知識(shí):讓程序支持多點(diǎn)觸控最簡(jiǎn)單的方法是用Win 7的手勢(shì)識(shí)別功能,主要用到以下API:
  GetSystemMetrics,用于檢查多點(diǎn)觸控硬件設(shè)備是否存在并就緒。
  GetGestureInfo,用于獲取手勢(shì)類(lèi)型及相關(guān)數(shù)據(jù)。

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,Win7之家所有文章均包含本声明。