MultiPoint Programlama'ya Giriş

0 dakikada yazıldı

7296 defa okundu

Düzenle

Makalemize ilk olarak MultiPoint programlamanın ne olduğunu tanımlayarak
başlayalım. Bugün bilgisayarlarımızda alıştığımız sistem sadece tek bir
Pointer / İmleç kontrol etmeye dayanır. Örneğin bilgisayarınıza iki fare
bile bağlasanız aslında her ikisi de aynı imleci kontrol eder. Oysa
geleceğe baktığımızda artık birden çok Pointer'ın bulunduğu sistemlere
doğru ilerliyoruz hatta birden çok imlecin tabi ki farklı kullanıcılar
tarafından kullanıldığını da görebiliyoruz. Özellikle i-Phone ile
popülerleşen Surface Programming mantığına kısmen yakın olsa da
MultiPoint programlamada her bir Point'in kesinlikle ayrı kimliklere ait
olduğu varsayılır. Bu varsayımla en azından hangi noktaların hangi
kimliğe ait olduğunu bulma gibi bir dertlerle uğraşmaya gerek kalmıyor.

Özetle bu yazımızda amaçladığımız şey bilgisayarımıza bağlı farelerin
farklı imleçler şeklinde ekrana yansımasını sağladıktan sonra
oluşturacağımız bir düğme kontrolüne de hangi kullanıcının tıkladığını
algılayabilecek kodu yazmak.

MultiPoint SDK

Windows ortamında .NET ile MultiPoint uygulamaları geliştirmek
istiyorsanız donanımla doğrudan uğraşmamak adına işinizi
kolaylaştırabilmek için Microsoft tarafından bir SDK paketi yayınlanmış
durumda. MultiPoint SDK olarak geçen paketi bilgisayarınıza
yüklediğimizde projelerimizde kullanacağımız kütüphaneleri de edinmiş
oluyoruz.

http://www.microsoft.com/downloads/details.aspx?FamilyID=a137998b-e8d6-4fff-b805-2798d2c6e41d&displaylang=en

Yeni bir MultiPoint projesi yaratalım.

Visual Studio içerisinde yeni bir WPF projesi yaratalım ve MultiPoint
kütüphanelerini referans olarak ekleyelim. MultiPoint DLL'lerini
doğrudan MultiPoint'in yüklendiği klasörün içinde Bin klasöründe
bulabilirsiniz. DLL'lerin yanı sıra yarattığımız projeye sağ tuş
tıklayarak "Add Existing Item" diyip yine Bin klasöründeki
Microsoft.MultiPoint.MultiPointSDK.dll.config dosyasını de
eklemeliyiz. Artık her şey hazır, sıra geldi kodlamaya.

İlk olarak uygulamamız için MultiPointSDK'dan bir Instance almamız
gerekiyor. Söz konusu değişkenin uygulama genelinde kullanılabilmesi
için **Application.xaml'**ın arkasında tanımlanmasında fayda var.

[VB]

Class Application

 

    Public Shared MultiPointObject As
Microsoft.MultiPoint.MultiPointSDK.MultiPointSDK =
Microsoft.MultiPoint.MultiPointSDK.MultiPointSDK.GetInstance

 

End Class

[C#]

using
Microsoft.MultiPoint.MultiPointSDK;

 

class Application

{

    public static MultiPointSDK MultiPointObject =
MultiPointSDK.GetInstance;

}

Application.xaml'ın arkasında yukarıdaki kodumuzu yazdıktan sonra WPF
uygulamamızın ana penceresine geçerek MultiPointObject değişkenimizi
kullanabiliriz.

[VB]

Application.MultiPointObject.RegisterMouseDevice()

Application.MultiPointObject.CurrentWindow = Me

Application.MultiPointObject.DrawMouseDevices()

MultiPointSDK.SystemCursorPosition = New Point(Me.Left + 10, Me.Top + 10)

MultiPointSDK.HideSystemCursor()

[C#]

Application.MultiPointObject.RegisterMouseDevice();

Application.MultiPointObject.CurrentWindow = this;

Application.MultiPointObject.DrawMouseDevices();

MultiPointSDK.SystemCursorPosition = new Point(this.Left + 10, this.Top + 10);

MultiPointSDK.HideSystemCursor();

Bir sonraki adımda WPF uygulamamızın ana ekranında Page.Load event'ı
içerisinde yukarıdaki kodları yazıyoruz. Böylece o an sisteme bağlı
fareleri algılayarak ekrana getirebiliyoruz. Bu işlemi yaparken normal
imleci de görünmez hale getiriyoruz. Aslında MultiPoint API'ları bizim
yerimize donanım olarak var olan her bir fare için ayrı ayrı imleçler
yaratıyor. Sistemde o an var olan tüm farelerin bir listesini
Application.MultiPointObject.MouseDeviceList dizisinde bulabilir ve
her bir MultiPointMouseDevice için ayrı ayrı DeviceVisual
tanımlayarak imleçleri değiştirebilirsiniz.

Kendi kontrollerimizi yaratmamız gerek....

Aslında sıfırdan kontrol yaratmaktan bahsetmiyoruz fakat maalesef ki
hali hazırdaki WPF kontrollerinin hiçbiri MultiPoint desteklemiyor.
Yani hiçbiri farklı imleçler ve onların kimliklerinden haberdar
olamıyor. Bu nedenle bizim kendi kontrollerimizi hazırlamamız gerekecek.
Bu kontrolleri yaratırken IMultiPointMouseEvents ve
IMultiPointGenericDeviceEvents interfacelerini implemente edersek
aslında çoğu işlemi yine MultiPoint kütüphanelerine paslamış oluyoruz.
Gelin bir Button yaratarak nasıl ilerleyebileceğimizi görelim.

[VB]

Public Class MultiPointColorButton

    Inherits
System.Windows.Controls.Button

    Implements IMultiPointMouseEvents

    Implements
IMultiPointGenericDeviceEvents

 

End Class

[C#]

public class MultiPointColorButton :
System.Windows.Controls.Button, IMultiPointMouseEvents,
IMultiPointGenericDeviceEvents

{

}

Yukarıdaki kodları yeni yarattığınız bir VB veya C# dosyasına
yapıştırabilirsiniz. Aslında işlemler çok basit; sistemde tanımlı
herhangi bir kontrol olarak Button kontrolünü alıp MultiPoint
kütüphanelerinden gerekli arayüzleri dahil ediyoruz. Böylece otomatik
olarak birçok yeni event tanımlanmış oluyor. İkinci adımda işin biraz
karışık kısmına doğru geçiş yapacağız. MultiPoint kütüphanesi ile gelen
eventları her bir fare cihazı için ayrı ayrı oluşturuluyor bizim bunları
doğru bir şekilde ayrı bir genel geçer eventlar tanımlayarak onlara
bağlamamız gerek.

[VB]

    Public Custom Event CustomClick As RoutedEventHandler

        AddHandler(ByVal value As RoutedEventHandler)

            MultiPointMouseEvents.AddMultiPointMouseDownHandler(Me, value)

        End AddHandler

        RemoveHandler(ByVal value As RoutedEventHandler)

            MultiPointMouseEvents.RemoveMultiPointMouseDownHandler(Me, value)

        End RemoveHandler

        RaiseEvent(ByVal sender As Object,
ByVal e As System.Windows.RoutedEventArgs)

        End RaiseEvent

    End Event

[C#]

    public event RoutedEventHandler CustomClick {

        add {
MultiPointMouseEvents.AddMultiPointMouseDownHandler(this, value); }

        remove {
MultiPointMouseEvents.RemoveMultiPointMouseDownHandler(this, value); }

    }

Yukarıdaki kodlarda kendi tanımladığımız eventların ataçlanması ve
detaçlanması noktasında yapılacak işlemleri de biz belirliyoruz ve
elimizde MultiPoint kütüphanesinden gelen metodları kullanıyoruz.
Kodumuzda da görebileceğiniz gibi MultiPoint ile kullanılabilecek her
durum için ayrı ayrı event bağlama metodları MultiPointMouseEvents
sınıfı altında bulunuyor. Biz şimdilik Button kontrolümüze sadece
MultiPoint için Click event'ını tanımlamış olduk. Kullanacağınız tüm
event'ları bu şekilde tanımlamak zorundasınız.

Peki nasıl kullanacağız?

İsterseniz kod tarafında otomatik olarak bu kontrollerden yaratıp
uygulamanıza ekleyebilirsiniz. Eğer XAML tarafında yarattığımız bu
Button kontrolünü kullanmak isterseniz XAML'da uygulamanızın XML
NameSpace'larını yaratmanız gerek. Bir anlamda XAML tarafına kodumuzu
"import" etmek olarak tanımlayabiliriz bu işlemi.

[XAML]

<Window
x
:Class="Window1"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

** ** xmlns:Daron="clr-namespace:MPP"

  Title="MultiPointPaint"
Height
="480" Width="640"
>

Yukarıda gördüğünüz kod yarattığımız uygulamanın ana penceresinin XAML
kodunun başlangıcı. Burada ben Daron adında bir XML namespace yaratarak
onu da arka planda adı MPP olan uygulamamın ana sınıfına bağladım. Zaten
tüm bu kodlar otomatik olarak Intellisense içerisinde geliyor.

[XAML]

    <Daron:MultiPointColorButton Background="#FF000000"
Content
="Exit" x:Name="btnExit"
VerticalAlignment
="Center" HorizontalAlignment="Center"
Width
="50"/>

Bir önceki adımda kodunu yazdığımız ve adını da
MultiPointColorButton verdiğimiz düğmemizi XAML tarafında yukarıdaki
şekilde kullanabiliyoruz. Eğer XML NameSpace tanımını doğru yaptıysanız
XAML kodları içerisinde de NameSpace'in adını yazdıktan sonra
içerisindeki bütün kontrollerin listesi Intellisense'de görebilirsiniz.

Düğmemizi de yarattığımıza göre son olarak code-behind tarafına geçip
daha önce tanımladığımız CustomClick adındaki özel event'ı
kullanarak düğmeye tıklayan imleçleri ve kullanıcıları algılayabiliriz.

[VB]

Private Sub Color_CustomClick(ByVal sender As Object,
ByVal e As System.Windows.RoutedEventArgs)

        Dim MyDeviceInfo As DeviceInfo = CType(e,
MultiPointMouseEventArgs).DeviceInfo

        Dim MyMultiPointMouseDevice
As MultiPointMouseDevice = CType(MyDeviceInfo.DeviceVisual,
MultiPointMouseDevice)

        MessageBox.Show(MyMultiPointMouseDevice.DeviceId)

End Sub

[C#]

private void Color_CustomClick(object sender,
System.Windows.RoutedEventArgs e)

{

    DeviceInfo MyDeviceInfo = ((MultiPointMouseEventArgs)e).DeviceInfo;

    MultiPointMouseDevice MyMultiPointMouseDevice =
(MultiPointMouseDevice)MyDeviceInfo.DeviceVisual;

    MessageBox.Show(MyMultiPointMouseDevice.DeviceId);

}

Kod içerisinde de görebildiğiniz üzere aslında event-listener'lara gelen
RoutedEventArgs'ın kendisi bir MultiPointMouseEventArgs. Biz bu
parametre üzerinden DeviceInfo'nın DeviceVisual'ını
MultiPointMouseDevice olarak alabiliyoruz. Sonuç olarak bu değişken
üzerinden de DeviceID geliyor. Tahmin edebileceğiniz gibi sisteme
bağlı her cihazın kendine özel bir DeviceID'si var ve biz de bu
ID'ler üzerinden imleçlerin kimliklerini ayırt edebiliyoruz. Artık
gerisi sizin hayal gücünüze kalmış ;)

Hepinize kolay gelsin.