1. 程式人生 > >基於Visual C 2010與windows SDK fo windows7開發Windows 7的多點觸控特性應用

基於Visual C 2010與windows SDK fo windows7開發Windows 7的多點觸控特性應用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

       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卓越的觸控特性的視訊

http://you.video.sina.com.cn/b/18868705-1578909250.html

 

目前僅有三款機型支援當前的Windows 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.在程式裡面新增觸控功能的硬體檢查,在程式初始化中加入

[cpp] view plain copy print ?
  1. BYTE digitizerStatus = (BYTE) GetSystemMetrics(SM_DIGITIZER);  
  2. if ((digitizerStatus & (0x80 + 0x40)) == 0) //檢查程式準備完畢,並檢測硬體  
  3. {  
  4.   AfxMessageBox(L"No touch input is currently available.");  
  5.   return FALSE;  
  6. }  
  7.   
  8. BYTE nInputs = (BYTE) GetSystemMetrics(SM_MAXIMUMTOUCHES);  
  9.   
  10. CString str;  
  11. str.Format(L"Touch input available with %d touch points.", nInputs);  
  12. AfxMessageBox(str);  
  13.   
  14. return TRUE;  
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加入下列函式

   
// Overridesprotected:    virtual BOOL OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput);
 
 ChildView.cpp原始檔中加入下列函式
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.執行程式實驗多點觸控

 

 

 

 

繪製函式原始檔如下

 

 

 

[cpp] view plain copy print ?
  1. #pragma once  
  2. #include "afxtempl.h"  
  3.   
  4. #include <vector>  
  5. using namespace std;  
  6.   
  7. class CStroke : public CArray<POINT, POINT>  
  8. {  
  9. public:  
  10.     CStroke(int id, COLORREF clr);  
  11.     ~CStroke(void);  
  12.   
  13.     COLORREF GetColor() const { return m_clr; }  
  14.   
  15.   
  16.     int GetId() const { return m_id; }  
  17.   
  18.   
  19.     void Draw(CDC* pDC) const;  
  20.   
  21. private:  
  22.     COLORREF m_clr;       // Stroke color  
  23.     int m_id;             // Stroke ID  
  24. };  
  25.   
  26. #include "StdAfx.h"  
  27. #include "Stroke.h"  
  28.   
  29. CStroke::CStroke(int id, COLORREF color):  
  30.     m_clr(color),  
  31.     m_id(id)  
  32. {  
  33.       
  34.     SetSize(0, 1000);  
  35. }  
  36.   
  37.   
  38. void CStroke::Draw(CDC* pDC) const  
  39. {  
  40.     if (GetCount() <= 0)  
  41.         return;  
  42.   
  43.     CPen pen(PS_SOLID, 3, m_clr);  
  44.     CPen* oldPen = pDC->SelectObject(&pen);  
  45.   
  46.     pDC->MoveTo(GetAt(0));  
  47.   
  48.     pDC->Polyline(GetData(), GetCount());  
  49.     pDC->SelectObject(oldPen);  
  50. }  
  51.   
  52. CStroke::~CStroke(void)  
  53. {  
  54. }  
  55.   
  56.   
  57.   
  58.   
  59.   
  60. #pragma once  
  61. #include "afxtempl.h"  
  62. #include "Stroke.h"  
  63.   
  64. class CStrokeCollection : public CArray<CStroke*, CStroke*>  
  65. {  
  66. public:  
  67.     CStrokeCollection(void);  
  68.     ~CStrokeCollection(void);  
  69.   
  70.     // Search the collection for given ID.  
  71.     int FindStrokeById(int id) const;  
  72.   
  73.     // Draw the collection of the strokes.  
  74.     void Draw(CDC* pDC) const;  
  75.   
  76. };  
  77. #include "StdAfx.h"  
  78. #include "StrokeCollection.h"  
  79.   
  80.   
  81. CStrokeCollection::CStrokeCollection(void)  
  82. {  
  83. }  
  84.   
  85.   
  86. CStrokeCollection::~CStrokeCollection(void)  
  87. {  
  88. }  
  89.   
  90. int CStrokeCollection::FindStrokeById(int id) const  
  91. {  
  92.     for (int i = 0; i < GetCount(); i++)  
  93.     {  
  94.         if (GetAt(i)->GetId() == id)  
  95.         {  
  96.             return i;  
  97.         }  
  98.     }  
  99.   
  100.     return -1;  
  101. }  
  102. void CStrokeCollection::Draw(CDC* pDC) const  
  103. {  
  104.     for (int i = 0; i < GetCount(); ++i)  
  105.     {  
  106.         GetAt(i)->Draw(pDC);  
  107.     }  
  108. }  
#pragma once#include "afxtempl.h"#include <vector>using namespace std;class CStroke : public CArray<POINT, POINT>{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<CStroke*, CStroke*>{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);    }}

 

 

 

 如需要原始碼,請在本人CSDN部落格留言留下您的Email

本文作者專著《Visual C++2010開發權威指南》即將推出,敬請關注,Visual C++2010最近技術,Windows7開發最新技術!

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述