2009年10月1日 星期四

Silverlight 3 中的multi-Touch程式開發

TechDays 2009忙完了,終於有一點點時間可以回頭寫SL3中的多點觸控,隨著Windows 7的Launch在即,我開始屢屢被問到Silverlight 3中的多點觸控程式開發的部分。

在TechDays 2009中也稍微提過,其實SL3中的多點觸控一點也不複雜,架構上相當簡單,底下這是SL3中多點觸控的訊息架構:

從這邊您也不難發現,觸控螢幕(或面板或NB)、Windows 7、IE8當然都是必要設備,缺一不可。

對於SL3應用程式來說,只是很簡單的從IE8接受多點觸控事件,或者是模擬成滑鼠事件。至於很多人關心的可以接收到幾點,端看設備而定,如果設備傳入的是兩點(我手上的觸控螢幕和NB都只支援兩點),傳入SL3的就是兩點;若設備支援多點,SL3就接收到多點,如此而已,沒啥特別的。

要在SL3當中接收到多點觸控的信息,再簡單也不過,最簡單的方式如下,動作只有兩動:
1.Hook Multi-Touch事件
2.在事件中取得點,進行處理或運算。
程式碼如下:

public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
//Hook事件
Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
}

void Touch_FrameReported(object sender, TouchFrameEventArgs e)
{
//取得點數
int n = e.GetTouchPoints(this.LayoutRoot).Count;
this.textBlock1.Text = "points : " + n;
//將每一點座標顯示出來
foreach (System.Windows.Input.TouchPoint p in e.GetTouchPoints(this.LayoutRoot))
{
this.textBlock1.Text += " \n(" + p.Position.X.ToString("0.00") + "," + p.Position.Y.ToString("0.00") + ") - " + p.Action.ToString();
}
}
}

執行結果:

[範例]

BTW, 這一次範例變成C#了,因為好多人問我要C#的code或是書,因應目前VB/C#還是差不多55波的趨勢,我也不知道到底要寫C#還是VB來的好,總之就隨興寫了,大家就勉為其難和我一起培養 '雙語' 的能力。畢竟這雙語也是一種趨勢嘛...

11 則留言:

匿名 提到...

忽然發現BLOG旁邊有一本沒看過的書封面才知道老大您又出新書了,怎麼都沒有發一篇文章來公告一下?

匿名 提到...

是五五波嗎?依我在天瓏書局的觀察,同時有出C#和VB的書籍,都是C#賣的比較好,能上排行榜,VB連排行榜都進不去的居多。

David 提到...

呵呵,因為那本不是新書啦,是SL2.0的書改版的,SL3的內容在這本書裡面是以PDF的形式蒐錄在DVD中的(所以沒有紙本部分)。

因此,SL3更多的紙本內容會蒐錄在另一本SL3的專書中。

David 提到...

to 匿名,

因為C#是比較多高階市場用戶的,天瓏的書比較屬於中高階市場,如果你把一般入門市場加起來算,我想還是維持差不多五五的比例。

不過確實,C#在持續成長中,因此很有可能未來中高階書籍或是範例我直接寫C#了,畢竟民之所欲,常在我心嘛...^_^

承佑 提到...

老師您好
下一本書,希望可以朝書中範例以c#為主,然後光碟附上vb的範例程式碼,畢竟目前國內外或對岸範例均以c#為主,我過去也是看您輸成長的,但目前也是改寫c#,而您對於vb.net的堅持我覺得還是很有必要,書本以c#為主,相信可以有效提升銷售量,而范麗光碟也照顧到目前仍使用vb的讀者。
有好銷量,才有好書。

David 提到...

to 承佑,

呵呵,聽起來讓人蠻心動的,我會認真考慮以後的中高階書籍直接出C#版本的。

承佑 提到...

董老師,想請關於多點觸控的問題。
我能否判斷畫面上哪個物件被點擊到。
假設我畫面上擺一個Rectangle,name是r1
以下面的程式來講,只要有點到螢幕,它就會傳回=1,不一定要點到Rectangle。
int n = e.GetTouchPoints(r1).Count;
那r1傳給GetTouchPoints到底是做什麼用?
除了計算座標,有辦法達成判斷畫面上哪個物件被點擊到的功能嗎?

David 提到...

可以透過TouchPoint.TouchDevice.DirectlyOver取得被該觸控點所點選的最上層物件。

相關的資訊我會整理在11月號的RunPC雜誌上發表。

承佑 提到...

老師您好
我透過TouchPoint.TouchDevice.DirectlyOver取得的是UIElement,我想要取得該物件的名稱.
假設說我已經知道他是Rectangle,我可以透過
UIElement ue;
ue = p.TouchDevice.DirectlyOver;
Rectangle rec = (Rectangle)ue;
這樣做轉換,但如果我根本不知道user按下的是甚麼,我又該如何判斷呢?

承佑 提到...

我剛剛發現了
ue.GetValue(FrameworkElement.NameProperty).ToString();
可以透過這樣取得user點擊的物件的名稱

匿名 提到...

請問在董大偉老師 Silverlight範例權威講座2.0的書中,
'建立登入物件
Dim WithEvents LoginFrame As New StudyHost.Login.LoginControl,
該段程式碼中的StudyHost.Login.LoginControl指的是什麼?
請問有附在光碟裡面嗎?