Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - MultiTouch
bir yazılımcının tasarıları...
 Thursday, May 20, 2010

Ürdün :) Son üç gündür Ürdün'deydim! Microsoft Ürdün ofisi için iş ortaklarına ve sektördeki yazılım geliştiren kurumlara özel bir seminer serisi düzenledik. Oturumlar boyunca Silverlight, WPF, Multitouch, Windows 7 Features, Sensor and Location API Development, .NET 4 Yenilikleri gibi konulara değindim. Gerçekten güzel geçen üç gün içerisinde maalesef pek Ürdün'ü gezme şansım olmadı. Fakat önümüzdeki hafta yine Ürdün'de yapacağımız laboratuar çalışmaları ve bir sonraki hafta da müşteri ziyaretleri düşünülürse :) Kesin arada bir fırsat bulacağımdan eminim.

Microsoft Ürdün Seminerlerim
Microsoft Ürdün Seminerlerim

Etkinlik boyunca Ürdün'den bir de Türk kardeşimize rastladım. Bu gibi etkinlikler halka açık olmadığı için genelde blogumda duyurmuyorum. Türkiye'de de bolca yapıldığını itiraf etmem gerek. Özellikle BizSpark, WebSiteSpark gibi programların üyeleri yazılım şirketleri için sıkı seminerler ve eğitim programları Türkiye'de de düzenleniyor. Fakat bahsettiğim gibi bu etkinlikler dışarıya kapalı olduğu için duyurmayı anlamlı bulmuyorum. Bazılarının kayıtlarını SeminerTV'de paylaştım o kadar :) İtiraf etmek gerekirse artık etkinliklerden sonra bloga da post atmayı unutur oldum, hatta bu konuda sitem bile alıyorum "Neden bizi yazmadınız" diye :) Atladığım her etkinliğin katılımcılarından özür dilerim bu vesile ile.

Neyse konuyu toparlayalım :) Eğer Ürdün'deyseniz ve bu yazıyı okuyorsanız :) ve tabi ki yazılımla ilgileniyorsanız bana bir mail atın beraber birer çay içelim ;)

Görüşmek üzere!

Thursday, May 20, 2010 7:40:45 AM (GTB Standard Time, UTC+02:00)  #    Comments [9]   .NET Framework 4.0 | Expression Studio | MultiTouch | Seminer | Silverlight 4 | Visual Studio 2010 | Windows 7 | Windows Phone 7 | WPF  | 
 Wednesday, March 31, 2010

Son üç gündür Bulgaristan, Sofya'dayım. Çoook önceleri sizlere duyurduğum MSDays etkinliği için gittiğim Sofya'ya bir saatlik bir uçuş ile gidebiliyor olmak garip gelmedi desem yalan olur. Son dönemde 9-10 saatlik uçuşlara alışmışken 1 saatlik uluslararası bir uçuşu bünyem garipsedi :) Şaka bir yana aslında Sofya bize epey yakınmış :) her anlamda.

MSDays Bulgaristan oturumlarımdan bir kare.
MSDays Bulgaristan oturumlarımdan bir kare.

İki gün süren MSDays etkinliği özellikle uluslararsı konuşmacıları ile dikkat çekici bir değere sahipti. İngiltere ve Amerika Microsoft ofislerinden birçok çalışan farklı oturumlar için Sofya'ya geldi. Ben de etkinlik boyuncu iki oturum sundum. Oturumlarımdan ilki hemen ilk günün ilk KeyNote'undan sonra olduğu için epey popüler bir oturum oldu. "Silverlight 4 Unpackaged" başlıklı bu oturumda Silverlight'ın tarayıcı dışındaki hayatına değindik :) Tahmin ettiğimden çok daha zevkli ve zengin bir oturum oldu. Umarım ilk fırsatta aynı içeriği Türkiye'de de sunma şansım olur. İkinci oturumum ise "Multitouch Development on Web, on Surface and on Desktop" başlığı ile ilerledi. Farklı platformlar arasındaki farklarla beraber tüm API'leri inceledik diyebilirim. Laf aramızda bu oturum zaten TechEd Middle-East'te de en çok beğenilen oturumlar arasında yerini almıştı :) o nedenle Bulgaristan'da da bir değişiklik olmadı ve herkes salondan memnun ayrıldı.

Sofya Üniversitesi, Informatik ve Matematik Bölümü
Sofya Üniversitesi, Informatik ve Matematik Bölümü

Etkinliğin ikinci gününde benim bir oturumum yoktu :) Eh ben de boş durmiyim diyerek :) Sofya Üniversitesi'nde bir seminer verdim. Şaka bir yana :) Sofya Üniversitesi'nde geçen dönem WPF dersleri verilmiş. Bu dönem de Bulgaristan'daki Silverlight MVP'si Emil Stoychev ve iki hoca daha beraber üçlü bir ekip olarak Silverlight dersi açmışlar. Benim Bulgaristanda bulunduğum bu kısa döneme denk gelen bir derslerini bana verdiler :) Benim için her zamanki gibi çok eğlenceli bir iki saat oldu. Emil ne de olsa burayı okuyamayacak, İngilizce bloğumda ona teşekkür ederim ;)

Sofya'da Cumhurbaşkanlığı Binası.
Sofya'da Cumhurbaşkanlığı Binası.

Sofya'yı gezerken tabi ki en etkileyici nokta Mimari'deki değişiklik. Ülkemize ve gördüğüm kadarı ile Osmanlı tarzına kıyasla epey farklı bir tarz var. Fotoğrafını alamadım gece gördüğüm için ama zaten şehirdeki en eski yapıt Mimar Sinan'ın bir Camisi. Diğer yandan bahsettiğim gibi şehrin farklı bir havası var. Yukarıdaki fotoğraftaki bina Cumhurbaşkanlığı binası olsa da neredeyse şehir merkezindeki çoğu binanın bu tarzda olduğunu söyleyebilirim. Benim ortalama üç saat kadar şehri gezme şansım oldu. O nedenle çok detaylara giremedim. Şehri gezmektense laptop ile oturup otelde çalışmak durumunda kaldım diyebilirim :)

Son dönemde blogdan da takip edebildiğiniz üzere yurt dışı gezilerim epey fazla oldu. Güzel bir haberim var :) bitti :D Yoğun yurt dışı turumu bitirmiş bulunmaktayım o nedenle önümüzdeki dönemde Türkiye içinde ekstra hareketlere girişeceğiz. Bunlardan ilkini zaten twitter üzerinden duyurdum. NedirTV etkinliğini kaçırmayın derim ;) Görüşmek üzere.

Wednesday, March 31, 2010 2:56:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   MultiTouch | Silverlight 4  | 
 Thursday, March 04, 2010

Blogumu takip edenlerin bileceği üzere son üç gündür Dubai'deydim. Hatta hala dönmüş değilim :) TechEd ME (Middle East) için geldiğim Dubai en son geldiğimden bu yana pek değişmemiş açıkçası. TechEd olarak ise hem North America hem de Europe aktivitlerine katılmış biri olarak Middle-East'i değerlendirecek olursam aslında hem kültürel hem de bilgi ve birikim açısından TechEd ME'nin bizim ülkemizdekine çok benzer bir kitleye sahip olduğunu ve hitap ettiğini gördüm. Fakat maalesef ki community tarafları bize kıyasla çok zayıf olduğu için Türkiye'ye kıyasla diğer ülkelerin TechEd'e çok çok daha fazla ihtiyaçları var. Bölgede hem MVP sayısı ile hem de INETA tarafındaki sosyal toplulukların aktivitesi ile epey güzel bir konumda olduğumuzu itiraf edebilirim.

MEA MVP'leri ile beraber yemekteyiz.
MEA MVP'leri ile beraber yemekteyiz.

Benim her gün birer oturumum olduğu için neredeyse hiç tembellik yapma şansım olmadı :) Her gün sabahtan akşama konuşmacı odasında oturumlarıma hazırlanmakla geçti. Akşamları biraz ufak kaçamlar yapabildik diyebilirim. Bunlardan ilki ve tabi ki en önemlisi MVP yemeği oldu. Orta Doğu bölgesinden bir sürü MVP ile tanışma şansım oldu fakat ilginçtir ki ülkemizde de olduğu üzere sanki orada da developer MVP'lerinde azalma var gibi gözüktü gözüme :) Development işi çok karışıyor artık sanırım kimse bulaşmak istemiyor :D

Benim için oturumlarım arasındaki en heyecan verici olan tabi ki Multitouch oturumuydu. İlk önce WPF tarafından başladık sonrasında Silverlight'a geçtik. Bu arada Türkiye'de yaptığım Multitouch oturumlarından bu yana epey zaman geçtiğini ve bu süreçte özellikle WPF tarafında aslında çok şeyin de değiştinin farkına tekrar vardım. Tekrar Türkiye'de de bir Multitouch oturumu yapıp içeriği tazelemek gerek sanırım. Her neyse, oturum sonuna doğru Surface üzerinde de Multitouch development konusuna değinerek oturum sonunda yanıma gelip laptop ile oynamak isteyenlerden yola çıkarsak :) başarılı bir sunumu sonlandırmış oldum.

TechEd ME'de Multitouch Oturumum'dan bir kare.
TechEd ME'de Multitouch Oturumum'dan bir kare.

Benim için çok değerli bir üç gün oldu. Tanıştığım uzmanlarda tutun kurduğum iletişimleri kadar hepsinin de yansımlarını önümüzdeki 6 ayda sizlerin de göreceğini tahmin ediyorum :) Sevgili MVP Lead'imiz Baransel Doğan'da ayrıca tüm ME MVP'leri ile röportajlar yaptı, arasında ben de vardım. Yayınlandığında sizlerle twitter üzerinden paylaşacağım. En kısa zamanda tüm TechEd oturumlarımın birer Türkçe'lerini de ya screencast olarak çekip ya da fiziksel olarak bir akvitide sizlerle de paylaşmayı düşünüyorum. Aslında tüm oturumlarım video kayıtları alındı fakat TechEd'in kuralı gereği bu kayıtlar sadece etkinliğe katılan kişilerle paylaşılıyor.

Çok gevezelik etmiyim :) Hepinizle en kısa zamanda görüşmek üzere ;)

Thursday, March 04, 2010 8:22:20 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]   IE 8.0 | MultiTouch | Silverlight 4 | TechEd | WPF  | 
 Tuesday, February 09, 2010

Hatırlarsanız sizlerle daha önce bu sene Berlin'de yapılan TechEd Europe'dan izlenimlerini aktarmıştım. (Gün 1, 2, 3) Bu sene ilk defa Middle-East yani bizim bölgemizde de TechEd gerçekleşiyor. Dubai'da 1-3 Mart arasında gerçekleşecek olan TechEd ME 2010'da benim de iki oturumum var!

TechEd ME'ye indirimli kayıt ol!
TechEd ME'ye indirimli kayıt ol!

TechEd'in birinci günündeki oturumumun başlığı "New in C# and Visual Basic for 2010" şeklinde. Tahmin edebileceğiniz üzere Visual Studio 2010 ve .NET 4 RC üzerinden VB ve C# yeniliklerine göz atacağız bu oturumda. İkinci oturumum ise TechEd'in ikinci gününde "Windows Internet Explorer 8 in the Enterprise: Build, Deploy, and Manage Better Experiences" başlığını taşıyor. Bu oturumda IE8 ile beraber gelen yeni özelliklerin kurumsal alandaki kullanımına yönelik senaryoları inceleyeğiz ve bu araçların dağıtımı, yönetimi ile ilgili detayları ele alacağız. TechEd'de daha önce de TLC (Technical Learning Center)'da ve Silverlight Booth (ATE-Ask The Expert)'de görevli olmuş biri olarak bu sefer de oturumlarla katkıda bulunmak benim için çok heyecan verici.

Dikkat Dikkat! İndirim var!

İşte geldik sizin için elimde neler var kısmına :) Birincisi eğer TechEd ME'ye katılıyorsanız lütfen beni haberdar edin! Orada görüşelim! Eğer katılamıyorsanız ve katılmak istiyorsanız bu sefer de size özel %15 indirim kodunu kıvançla paylaşıyorum :) 52F42DC3 Bu kodu kullanarak TechEd ME'ye kayıt olursanız kayıtta %15 indirim alacaksınız! Hadi bakalım Dubai'de görüşmek üzere!

Update: Son dakika değişiliği ile bir üçüncü oturumum daha var TechEd ME'de! "Create Multitouch Applications on Windows, on Surface and on the Web" ;) Kaçırmayın!

Tuesday, February 09, 2010 12:30:11 PM (GTB Standard Time, UTC+02:00)  #    Comments [4]   C# | IE 8.0 | MultiTouch | Visual Basic 2010  | 
 Friday, November 06, 2009

Bugün Kıbrıs, Doğu Akdeniz Üniversitesi'nde yine her zamanki gibi güzel bir gün geçirdim. Aslında maceramız dün başladı :) Dün Microsoft'u Gençsen Geleceksin turu çerçevesinde bir sunumum oldu. Sonrasında bugün ise teknik sunumlarla devam ettik. Multitouch development, Sensor and Location API ve Windows 7 ile beraber gelen Taskbar özelliklerine dair programlama altyapısına göz attığım üç ayrı oturumda da beni yalnız bırakmayan herkese çok teşekkürler :)

Doğu Akdeniz Üniversitesi, KKTC
Doğu Akdeniz Üniversitesi, KKTC

Organizasyonda katkısından dolayı özellikle DAÜ MSP'lerinden Olcay Kük'e çok teşekkür ediyorum. Umarım herkes için faydalı bir iki gün olmuştur ;)

Friday, November 06, 2009 8:35:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   MultiTouch | Windows 7 | WPF  | 
 Friday, August 14, 2009

Silverlight 3.0 ile beraber tarayıcı içerisinde Multitouch desteği de geldi. Şu an için sadece Windows 7 ve Internet Explorer üzerinde sunulabilen bu deneyimi yaratmak için WPF tarafından biraz daha farklı tekniklerle ilerlemek gerekiyor. Bu yazımıda Silverlight 3.0 tarafında Multitouch API'larına göz attıktan sonra bir Manipulation örneği yapacağız.

Silverlight ve Multitouch

Silverlight içerisinde herhangi bir şekilde gerçekleşen Touch durumunu algılamak için kullanabileceğimiz tek bir event bulunuyor. Söz konusu event'ın adı Touch.FrameReported şeklinde. Bu eventa bağlanan bir event listener'ın argümanı ile beraber gelen bilgiler bizim için fazlası ile yeterli olacaktır.

[VB]

    Public Sub New()

        InitializeComponent()

        AddHandler Touch.FrameReported, AddressOf Touched

    End Sub

 

    Sub Touched(ByVal sender As Object, ByVal e As System.Windows.Input.TouchFrameEventArgs)

      

    End Sub

[C#]

        public MainPage()

        {

            InitializeComponent();

            Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

        }

 

        void Touch_FrameReported(object sender, TouchFrameEventArgs e)

        {

 

        }

Event'ımızın TouchFrameEventArgs'ında birçok değerli veri bulunuyor. Örneğin her bir touch için birer Timestamp alabiliyoruz. Timestamp'i özünde eski OLEAutomationDate'lere benzetebilirsiniz. Size farklı touch işlemleri arasında süreyi rahatlıkla hesaplayabilmeniz için integer Timestamp'ler döndürüyor. Bunun haricince argüman tarafında önemli üç adet metod bulunuyor. Bunlardan ilki GetPrimaryTouchPoint metodu. Touch işlemi esnasından bir yada daha çok noktadan ekrana dokunulabileceği için ilk dokunma noktası Primary denerek GetPrimaryTouchPoint aracılığı ile bize iletiliyor. Ayrıca GetTouchPoints metodu da tüm dokunulan noktaların bir listesini getirir. TouchPoint tipinde gelen bu noktalara ait ek bilgileri de TouchPoint sınıfı üzerinden alabilirsiniz. Örneğin dokunulan noktanın pozisyonu, alanı, hatta TouchDevice üzerinden de unique ID'sini elde etmek mümkün. Son olarak argüman üzerindeki SuspendMousePromotionUntilTouchUp metodu de Touch işlemleri bitene yani kullanıcı tüm parmaklarını ekrandan çekene kadar fare kullanımını engelleyecektir.

Tüm bu hikaye içerisinde en önemli şeylerden biri Touch işleminin hangi aşamada olduğu. Toplam üç farklı aşama mevcut. Bunlardan ilgi kullanıcının ekrana değdiği ilk an (Down), bir sonraki kullanıcının parmağını ekranda gezdirdiği süre (Move), son olarak (Up) kullanıcının parmağını ekranda çektiği an şeklinde üç farklı aksyon bulunuyor. Bu her aksyon TouchPoint nesnelerinin Action değişkeninde bir enumaration olarak bizi bekliyor. Herhangi bir şekilde bize raporlanan TouchPoint'in pozisyonunu alabildiğimiz gibi o anda ilk dokunma mı, bırakma mı yoksa sürekli dokunma mı oluştuğunu takip edebiliyoruz. Unutmadan hatırlatmak fayda var, kullanıcı parmağını ekranda oynatmadan tutarsa da bu bir Move aksyonu olarak algılanıyor.

Şimdi gelin manipülasyon örneğimize geçelim ve tüm bunların birlikte nasıl kullanıldığına göz atalım. Manipülasyon örneğinde bildiğiniz üzere amacımız ekrana basit bir resim koyarak onun kullanıcı tarafından iki parmak kullanılarak boyutlandırılabilmesini, taşınabilmesini ve çevrilebilmesini sağlamaktır. WPF tarafından farklı olarak daha Silverlight için etrafta hazırlanmış bir ManipulationProcessor bulunmadığı için tüm işlemleri bizim yapmamız gerekecek. İlk aşamada gelin uygulamamızın ekranını hazırlayarak konuya girelim.

[XAML]

  <Grid x:Name="LayoutRoot">

        <Image Source="Koala.jpg" RenderTransformOrigin="0.5,0.5">

            <Image.RenderTransform>

                <TransformGroup>

                    <ScaleTransform x:Name="ImageScale" />

                    <TranslateTransform x:Name="ImageTranslate" />

                    <RotateTransform x:Name="ImageRotate" />

                </TransformGroup>

            </Image.RenderTransform>

        </Image>

    </Grid>

Uygulama ekranımızda basit bir Image nesnesi bulunuyor. Bu Image nesnesinin durumda göre pozisyonunu, dönüş açısını ve boyutunu değiştireceğimiz için uygun Transform nesnelerini de içerisinde yerleştirerek gerekli isimlendirmeleri de yaptık. Böylece rahatlıkla kod tarafından bu işlemleri halledebiliriz. Şimdi sıra geldi Touch ile ilgili gerekli işlemleri arka tarafta yapmaya.

Hemen makalemizin başında da gördüğümüz üzere FrameReported eventına bir event-listener bağlıyoruz.

[VB]

    Public Sub New()

        InitializeComponent()

        AddHandler Touch.FrameReported, AddressOf Touched

    End Sub

[C#]

        public MainPage()

        {

            InitializeComponent();

            Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

        }

Amacımız FrameReported içerisinde ilk olarak en az iki tane TouchPoint olurkenki durumları yakalamak. Kullanıcının resmi tutup manipulasyon yapabilmesi için en az iki parmağının ekrana dokunuyor olması gerek. Ayrıca Action olarak da parmaklarını ilk dokundurduğu anda değil parmaklarını sürüklerken işlem yapmamız şart. Tüm bu süreçleri kontrol ederken sürekli olarak parmakların bir önceki durumu ile şu anki durumu arasındaki farklara göre gerekli hesaplmaları yaparak resmimize yansıtacağız. Aslında tüm bu sürece gelişmiş bir drag&drop gözü ile bakabilirsiniz.

[VB]

    Dim _FirstTouch As Point = New Point(0, 0)

    Dim _SecondTouch As Point = New Point(0, 0)

Uygulamamızda ilk olarak yukarıdaki şekli ile iki tane Point değişkenini global olarak tanımlıyoruz. Bu değişkenler sürekli olarak kullanıcının parmaklarının bir önceki koordinatlarını saklayacak. Böylece biz de o anki koordinatlar ile bir önceki arasında farkları yakalayabileceğiz.

[VB]

    Sub Touched(ByVal sender As Object, ByVal e As System.Windows.Input.TouchFrameEventArgs)

        If Not e.GetPrimaryTouchPoint(Me) Is Nothing Then

            Dim IlkDokunus As TouchPoint

            Dim IkinciDokunus As TouchPoint

 

            IlkDokunus = e.GetPrimaryTouchPoint(Me)

            If IlkDokunus.Action = TouchAction.Down Then

                _FirstTouch = New Point(0, 0)

                _SecondTouch = New Point(0, 0)

            ElseIf IlkDokunus.Action = TouchAction.Move Then

                If e.GetTouchPoints(Me).Count > 1 Then

                    IkinciDokunus = e.GetTouchPoints(Me)(1)

                    ''BURADA MANIPULATION YAPILACAK

                End If

            ElseIf IlkDokunus.Action = TouchAction.Up Then

               _FirstTouch = New Point(0, 0)

               _SecondTouch = New Point(0, 0)

            End If

 

        End If

    End Sub

[C#]

void Touch_FrameReported(object sender, TouchFrameEventArgs e)

        {

            if ((e.GetPrimaryTouchPoint(this) != null))

            {

                TouchPoint IlkDokunus = default(TouchPoint);

                TouchPoint IkinciDokunus = default(TouchPoint);

 

                IlkDokunus = e.GetPrimaryTouchPoint(this);

                if (IlkDokunus.Action == TouchAction.Down)

                {

                    _FirstTouch = new Point(0, 0);

                    _SecondTouch = new Point(0, 0);

                }

                else if (IlkDokunus.Action == TouchAction.Move)

                {

                    if (e.GetTouchPoints(this).Count > 1)

                    {

                        IkinciDokunus = e.GetTouchPoints(this)[1];

                        //BURADA MANIPULATION YAPILACAK

                    }

                }

                else if (IlkDokunus.Action == TouchAction.Up)

                {

                    _FirstTouch = new Point(0, 0);

                    _SecondTouch = new Point(0, 0);

                }

            }

        }

Yukarıdaki ilk kodumuz karışık gibi gözükse de aslında basit birkaç koşul kontrolünden farklı değil. İlk olarak GetPrimaryTouchPoint ile hali hazırda ilk TouchPoint var mı yok mu kontrolünü gerçekleştiriyoruz. Eğer varsa ikinci amacımız söz konusu Touch işleminin Action'una göre işlem yapmak. Eğer ilk TouchPoint'imize ait Action Up veya Down ise yani kullanıcı parmağını ilk defa dokunduruyor veya çekiyorsa hemen global değişkenlerimizi sıfırlıyoruz. Böylece bir sonraki Touch ile sürükleme işleminde gerekli kontrolleri yaparak işlemleri sıfırdan başlatabiliriz. Fakat unutmayın ki daha bu sadece ilk TouchPoint yani kullanıcının ilk parmağı! Belki de hiç ikinci bir parmak değimedi ekrana. Böyle bir durumda manipülasyon yapamayacağımız için ikinci parmak var mı diye kontrol etmemiz şart.

Eğer ilk TouchPoint'in aksyonu Move ise bu sefer hemen GetTouchPoints ile toplam parmak sayısını alıyoruz. Eğer bu sayı birden yüksekse belli ki ekranda iki parmak var. Her iki parmağa ait TouchPoint'lerini ayrı birer değişkene aldıktan sonra sıra gelecek bu parmakların koordinatlarına göre hesaplamaları yapmaya.

[VB]

                    Dim FirstTouch As Point = IlkDokunus.Position

                    Dim SecondTouch As Point = IkinciDokunus.Position

 

                    If _FirstTouch.X <> 0 Then

                        ''ESAS OLAY BURADA :)

                    End If

 

                    _FirstTouch = FirstTouch

                    _SecondTouch = SecondTouch

[C#]

                        Point FirstTouch = IlkDokunus.Position;

                        Point SecondTouch = IkinciDokunus.Position;

 

                        if (_FirstTouch.X != 0)

                        {

                           //ESAS OLAY BURADA :)

                        }

 

                        _FirstTouch = FirstTouch;

                        _SecondTouch = SecondTouch;

Ele aldığımız TuchPoint'lerden Position alarak birer değişkene aktarıyoruz. Sonrasında tabi ki bu pozisyonları bir önceki pozisyonlar ile karşılaştıracağımız için aslında "bir önceki pozisyon" diye birşey var mı onu kontrol etmemiz gerekiyor. Eğer varsa gerekli işlemleri yapacağız yoksa eldeki pozisyonu kenara atacağız ki bir sonraki işlemde bu pozisyona göre değişiklikleri hesaplayabilelim.

[VB]

Dim ScaleDelta = (((((FirstTouch.X - SecondTouch.X) ^ 2) + ((FirstTouch.Y - SecondTouch.Y) ^ 2)) ^ (1 / 2)) / _

                             ((((_FirstTouch.X - _SecondTouch.X) ^ 2) + ((_FirstTouch.Y - _SecondTouch.Y) ^ 2)) ^ (1 / 2))) - 1

[C#]

 double ScaleDelta = (Math.Sqrt(Math.Pow(FirstTouch.X - SecondTouch.X, 2) + Math.Pow(FirstTouch.Y - SecondTouch.Y, 2)) /

                                Math.Sqrt(Math.Pow(_FirstTouch.X - _SecondTouch.X, 2) + Math.Pow(_FirstTouch.Y - _SecondTouch.Y, 2))) - 1;

İlk olarak boyutlandırma işlemi ile başlayalım. Resmimizin boyutunun ne kadar değişeceğini 1 üzerinden orantılayarak vermemiz gerekiyor ki ScaleTransform'un ScaleX ve ScaleY'sine aktarabilelim. Gelen ScaleDelta'yı sonrasında bu ScaleX ve ScaleY'ye ekleyeceğiz o nedenle bulduğumuz sonucu 1'den çıkartıyoruz ki normal boyuta göre farkı bulalım.

Resmin boyut değişikliği ile ilgili hesaplamayı yaparken izlediğimiz yol her iki parmağın bir önceki pozisyonlarına göre aralarındaki mesafeyi bulup sonra da şu an pozisyonlara göre mesafeleri arasında oranı bir üzerinden hesaplamak. Basit bir hipotenüs hesaplaması gözü ile bakarsak elimizdeki iki noktadan bir üçgen oluşturup hipotenüsü bulmamız mesafe için yeterli olacaktır. Üçgenin yatay kenarı ve dikey kenarının uzunlukları için noktaların X ve Y koordinatları arasındaki farkları kullanabiliyoruz.

[VB]

Dim PositionPoint = New Point(((FirstTouch.X + SecondTouch.X) / 2) - ((_FirstTouch.X + _SecondTouch.X) / 2), _

                                                 ((FirstTouch.Y + SecondTouch.Y) / 2) - ((_FirstTouch.Y + _SecondTouch.Y) / 2))

[C#]

 var PositionPoint = new Point(((FirstTouch.X + SecondTouch.X) / 2) - ((_FirstTouch.X + _SecondTouch.X) / 2),

                                ((FirstTouch.Y + SecondTouch.Y) / 2) - ((_FirstTouch.Y + _SecondTouch.Y) / 2));

Resmin pozisyonu ile ilgili değişikliği hesaplamak biraz daha kolay. İki parmak arasındaki doğrunun orta noktasını bularak bir önceki orta nokta ile şimdiki orta nokta arasındaki farkı almak pozisyon değişikliğini yakalamak için yeterli olacaktır.

[VB]

Dim AngleDelta = (Math.Atan2(FirstTouch.Y - SecondTouch.Y, FirstTouch.X - SecondTouch.X) * 180 / Math.PI) - _

                             (Math.Atan2(_FirstTouch.Y - _SecondTouch.Y, _FirstTouch.X - _SecondTouch.X) * 180 / Math.PI)

[C#]

 var AngleDelta = (Math.Atan2(FirstTouch.Y - SecondTouch.Y, FirstTouch.X - SecondTouch.X) * 180 / Math.PI) -

                                (Math.Atan2(_FirstTouch.Y - _SecondTouch.Y, _FirstTouch.X - _SecondTouch.X) * 180 / Math.PI);

İki keranın bildiğiniz bir üçgenin iç açılarından birini nasıl bulursunuz? :) Bazılarınızı yıllar önceki lise yıllarına döndürdüğümün farkındayım. Dikey mesafe (Y) ve yatay mesafeyi (X) verip bir noktanın x eksenine göre (0,0)'dan açısını radyan olarak veren Math.Atan2 metodunu kullanarak parmaklarımızla oluşturduğumuz çizginin orta noktasının (0,0)'a göre x ekseninden açısını alabiliyoruz. Tabi radyanı da bildiğimiz açıya çevirmek için 180'le çarpıp PI'ye bölüyoruz. Eski pozsiyonlara göre hesapladığımız açı ile şimdiki açı arasındaki fark da tam olarak bulmak istediğimiz şeydi.

[VB]

                        ImageScale.ScaleX += ScaleDelta

                        ImageScale.ScaleY += ScaleDelta

                        If ImageScale.ScaleX < 0 Then ImageScale.ScaleX = 0

                        If ImageScale.ScaleY < 0 Then ImageScale.ScaleY = 0

 

                        ImageTranslate.X += PositionPoint.X

                        ImageTranslate.Y += PositionPoint.Y

 

                        ImageRotate.Angle += AngleDelta

[C#]

                            ImageScale.ScaleX += ScaleDelta;

                            ImageScale.ScaleY += ScaleDelta;

                            if (ImageScale.ScaleX < 0) ImageScale.ScaleX = 0;

                            if (ImageScale.ScaleY < 0) ImageScale.ScaleY = 0;

 

                            ImageTranslate.X += PositionPoint.X;

                            ImageTranslate.Y += PositionPoint.Y;

 

                            ImageRotate.Angle += AngleDelta;

Sıra geldi tüm bu hesaplamalarla bulduğumuz değerleri Image nesnesminde Transform'lara aktarmaya. Sadece Scale için dikkat etmemiz gereken şey eksi değer vermemek. Aksi halde resim ters dönecektir.

Kodumuz bu kadar. Manipülasyon işlemimizi de tamamladık ve artık projemiz çalışmaya hazır.

Hepinize kolay gelsin.

Örneklere ait kaynak kodlar. - 14082009_1.rar (73,14 KB)

Friday, August 14, 2009 1:29:53 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   MultiTouch | Silverlight 3.0  | 
 Thursday, August 13, 2009

Windows 7 ile beraber gelen Multitouch desteği bugünlerde çok yeni donanımlar ile daha da hayatımızın içine giriyor. Artık birden çok dokunma noktasını destekleyen ekranlar dizüstü bilgisayarlara kadar girdi ve Windows 7'nin yardımı ile donanımdan bağımsız olarak Windows7 API'lerini kullanarak Multitouch desteğine sahip uygulamalar yazabilir durumdayız. Bu yazımızda Multitouch dünyasına bir giriş yaparak Multitouch uygulama geliştirirken Windows7 API'lerini nasıl kullanabileceğimize göz atacağız.

Windows7 ile beraber gelen Multitouch API'lerine ait managed wrapper'ları aşağıdaki adresten bilgisayarınıza indirebilirsiniz. İndirme işlemi sonrası paket içerisinden Windows7.Multitouch.dll ve Windows7.Multitouch.WPF.dll dosyalarını yeni yaratacağımız bir WPF uygulamasına referans alarak hemen Multitouch programlamaya geçebiliriz.

http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=WindowsTouch&DownloadId=5038

Donanım desteği var mı?

DLL'lerimizi referans aldığımıza göre uygulamamızı yazmaya başlamadan önce ilk yapmamız gereken uygulamanın çalışacağı hedef bilgisayarda Multitouch donanım var mı, yok mu sorusuna bir cevap bulmak. Belki de Multitouch donanım yoksa programımızı çalıştırmanın hiçbir anlamı kalmayacaktır o nedenle kullanıcılara uygun bir uyarı vererek programımızın Multitouch donanım gerektirdiğini söyleyebiliriz.

[VB]

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        If Not Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady Then

            MsgBox("Multitouch yok!")

            Environment.Exit(1)

        End If

    End Sub

[C#]

        public Window1()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(Window1_Loaded);

        }

 

        void Window1_Loaded(object sender, RoutedEventArgs e)

        {

            if (!Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady) {

                MessageBox.Show("Multitouch yok!");

                Environment.Exit(1);

            }

        }

Hemen referans aldığımız Assembly'lerden birindeki IsMultiTouchReady propertysine göz atarak eğer geriye False dönüyorsa kullanıcıya uygun mesajı gösterip programımızı kapatıyoruz. Bu kadarını yaptıktan sonra uygulamamızın Multitouch dokunuşlarını algılayabilmesi için gerekli Stylus Event'larını da geçerli hale getirmek için aşağıdaki kodu hemen uygulamanın Multitouch kullanacak olan penceresinin Loaded event listener'ına ekliyoruz.

[VB]

        Windows7.Multitouch.WPF.Factory.EnableStylusEvents(Me)

EnableStylusEvents derken parametre olarak eventların yaratılacağı Window nesnesi isteniyor biz de kendi elimizdeki ana pencereyi kendisine aktarıyoruz. Bu noktadan sonra artık her dokunuş (Stylus) ile ilgili eventları yakalayabiliriz. Şimdilik bu örneğimizde kullanacağımız event'ın adı StylusMove olacak. Amacımız kullanıcıların uygulamamız üzerinde herhangi bir parmaklarını gezdirdikçe arkada bir iz bırakıyormuş gibi çizgi çizdirmek. Böylece kullanıcıların birden çok parmak kullanarak aynı anda birden fazla çizgi çizebilecekler.

[VB]

    Private Sub Window1_StylusMove(ByVal sender As Object, ByVal e As System.Windows.Input.StylusEventArgs) Handles Me.StylusMove

        Dim Daire As New Ellipse

        Daire.Fill = New SolidColorBrush(Colors.Red)

        Daire.Height = 10

        Daire.Width = 10

        Daire.HorizontalAlignment = Windows.HorizontalAlignment.Left

        Daire.VerticalAlignment = Windows.VerticalAlignment.Top

        Daire.Margin = New Thickness(e.GetPosition(Me).X, e.GetPosition(Me).Y, 0, 0)

        Me.Root.Children.Add(Daire)

    End Sub

[C#]

        void Window1_StylusMove(object sender, StylusEventArgs e)

        {

            Ellipse Daire = new Ellipse();

            Daire.Fill = new SolidColorBrush(Colors.Red);

            Daire.Height = 10;

            Daire.Width = 10;

            Daire.HorizontalAlignment = HorizontalAlignment.Left;

            Daire.VerticalAlignment = VerticalAlignment.Top;

            Daire.Margin = new Thickness(e.GetPosition(this).X, e.GetPosition(this).Y, 0, 0);

            this.Root.Children.Add(Daire);

        }

Yukarıdaki kod içerisinde konumuzla ilgisiz olan kodları gri renkte yazdım. Geri kalan kısma bakarsak aslında yaptığımız şey StylusMove eventını yakalayarak bir Ellipse nesnesi yaratıp onun da pozisyonunu ayarlamak. Bu event her Stylus için çalışacağı için basit bir şekilde o anda gelen Stylus'ın pozisyonunu alarak elimizde yeni yarattığımız Ellipse'e set ediyoruz. İşte bu kadar! Aynı normal bir fare imlecinin pozisyonunu yakalamak gibi.

Eğer burada konuyu biraz daha ilerleterek StylusMove'da o anki parmakları birbirinden ayırt edip farklı renklerde daireler koymak isterseniz tabi ki bu da mümkün. Fakat o noktada ufak bir uyarıda bulunmam gerek. Birincisi ekrana tıklayan parmakları aslında tanıma şansımız yok. Yani şu anda dokunan parmak ile biraz sonra dokunan parmak aynı mı yoksa değil mi hiçbir zaman bilemeyiz. Aynı şekilde ekrana o anda dokunmakta olan bir parmak varsa ikinci gelen parmağın sadece ikinci olduğunu algılayabiliriz. Sonrasında o ikinci parmak gibip başka bir ikinci parmak gelirse bu ikisinin de aynı olup olmadığını hiçbir zaman bilemeyiz. O nedenle konunun özüne dönersek bizim kodumuzun algılayabileceği şey ancak ekrana tıklayan parmakların kaçıncı dokunan parmak oldukları. Bu çerçevede StylusMove gibi Stylus eventların da birer StylusID gönderiliyor.

[VB]

    Private Sub Window1_StylusMove(ByVal sender As Object, ByVal e As System.Windows.Input.StylusEventArgs) Handles Me.StylusMove

        Dim Daire As New Ellipse

        If e.StylusDevice.Id = 10 Then

            Daire.Fill = New SolidColorBrush(Colors.Red)

        Else

            Daire.Fill = New SolidColorBrush(Colors.Green)

        End If

        Daire.Height = 10

        Daire.Width = 10

        Daire.HorizontalAlignment = Windows.HorizontalAlignment.Left

        Daire.VerticalAlignment = Windows.VerticalAlignment.Top

        Daire.Margin = New Thickness(e.GetPosition(Me).X, e.GetPosition(Me).Y, 0, 0)

        Me.Root.Children.Add(Daire)

    End Sub

[C#]

        void Window1_StylusMove(object sender, StylusEventArgs e)

        {

            Ellipse Daire = new Ellipse();

            if (e.StylusDevice.Id == 10)

            {

                Daire.Fill = new SolidColorBrush(Colors.Red);

            }

            else

            {

                Daire.Fill = new SolidColorBrush(Colors.Green);

            }

            Daire.Height = 10;

            Daire.Width = 10;

            Daire.HorizontalAlignment = HorizontalAlignment.Left;

            Daire.VerticalAlignment = VerticalAlignment.Top;

            Daire.Margin = new Thickness(e.GetPosition(this).X, e.GetPosition(this).Y, 0, 0);

            this.Root.Children.Add(Daire);

        }

Yukarıda görebileceğiniz şekilde Stylus eventlarımıza gelen argümanlar üzerinden StylusDevice'a ve onun ID'sine ulaşabiliyoruz. Bu noktada ID'ler 10'dan başlıyor ve aynı anda dokunan her parmak için birer artarak devam ediyor. Bizim basit örneğimizde her zaman ilk dokunan parmak için kırmızı daireler koyarken ikinci dokunan parmak için de yeşil daireler koyarak bu her iki parmağı ayrı ayrı algılayabildiğimizi görebiliyoruz.

Manipulation İşlemleri

Bir sonraki aşamada birden çok dokunma noktası ile yapılabilen manipülasyon işlemleri göz atacağız. Bu çerçevede en tanıdık örnek bir ekranda var olan resmin kullanıcının iki parmağı ile tekrar boyutlandırılabiliyor, yer değiştiriyor ve döndürülebiliyor olması. Tüm bunlar için artık elimizde her dokunuş koordinatlarının olduğunu düşünürsek geriye sadece gerekli hesaplamaları yaparak ekrandaki bir resme veya farklı bir nesneye sonucu yansıtmak kalıyor. Fakat merak etmeyin, o hesaplamaları da bizim yapmamıza gerek yok. Bunun yerine Managed Wrapper'lar ile beraber gelen ManipulationProcessor sınıfıdan faydalanabiliriz.

Yeni bir WPF projesi yarattıktan sonra gerekli DLL'lerimizi de referans alarak sonrasında hemen projemize bir resim dosyası ekleyelim. Bu arada bir sonraki adımda ihtiyacımız olacağı için System.Drawing assemblysini de projeye referans olarak eklemeyi unutmayın. Projeye eklediğimiz resmi göstermesi için XAML tarafına da bir Image nesnesi koymayı unutmayalım. Tabi bu Image nesnesini yerine göre tekrar boyutlandıracağımız, ekrandaki yerini değiştireceğimiz veya belirli bir açıya göre döndüreceğimiz için Image nesnesinin içine de gerekli Transform objelerini şimdiden koymakta fayda var.

[XAML]

<Window x:Class="Window1"

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

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

   Title="Window1" Height="300" Width="300">

    <Grid>

        <Image Source="Koala.jpg" RenderTransformOrigin="0.5, 0.5">

            <Image.RenderTransform>

                <TransformGroup>

                    <TranslateTransform x:Name="Konum" />

                    <RotateTransform x:Name="Aci" />

                    <ScaleTransform x:Name="Boyut" />

                </TransformGroup>

            </Image.RenderTransform>

        </Image>

    </Grid>

</Window>

Transform nesnelerine kod tarafından rahat ulaşabilelim diye şimdiden yukarıdaki gibi birer isim verebiliriz. Sıra geldi arka tarafta yazacağımız kodlara. Her zamanki gibi ilk olarak Stylus event'larını Enable edelim ve bu sefer StylusMove, StylusDown ve StylusUp eventlarının hepsini de yakalayalım. Bizim tüm manipülasyon işlemlerini yapacak olan nesneyi de yaratarak gerekli tüm eventlarda bilgileri hesaplama için kendisine aktarmamız gerekecek.

[VB]

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Windows7.Multitouch.WPF.Factory.EnableStylusEvents(Me)

    End Sub

 

    WithEvents ManiProc As New Windows7.Multitouch.Manipulation.ManipulationProcessor(Windows7.Multitouch.Manipulation.ProcessorManipulations.ALL)

[C#]

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

        {

            Windows7.Multitouch.WPF.Factory.EnableStylusEvents(this);

        }

 

        Windows7.Multitouch.Manipulation.ManipulationProcessor ManiProc = new Windows7.Multitouch.Manipulation.ManipulationProcessor(Windows7.Multitouch.Manipulation.ProcessorManipulations.ALL);

ManipulationProcessor nesnemizi yaratırken parametre olan bir Enum alıyor ve söz konusu Enumaration içerisindeki seçeneklerimiz bizim ne tür manipülasyon hesaplaması istediğimizi belirtiyor. Sadece tekrar boyutlandırma veya sadece döndürme ile ilgili manipülasyonlar da isteyebiliriz. Bizim örneğimizde tüm manipülasyonları kullanacağımız için ALL diyerek devam ediyoruz. Sıra geldi daha önce yakaladığımız Stylus eventlarında gerekli datayı alıp ManipulationProcessor 'a aktarmaya.

[VB]

    Private Sub Window1_StylusDown(ByVal sender As Object, ByVal e As System.Windows.Input.StylusDownEventArgs) Handles Me.StylusDown

        ManiProc.ProcessDown(e.StylusDevice.Id, e.GetPosition(Me).ToDrawingPointF())

    End Sub

 

    Private Sub Window1_StylusMove(ByVal sender As Object, ByVal e As System.Windows.Input.StylusEventArgs) Handles Me.StylusMove

        ManiProc.ProcessMove(e.StylusDevice.Id, e.GetPosition(Me).ToDrawingPointF())

    End Sub

 

    Private Sub Window1_StylusUp(ByVal sender As Object, ByVal e As System.Windows.Input.StylusEventArgs) Handles Me.StylusUp

        ManiProc.ProcessUp(e.StylusDevice.Id, e.GetPosition(Me).ToDrawingPointF())

    End Sub

[C#]

        private void Window1_StylusDown(object sender, System.Windows.Input.StylusDownEventArgs e)

        {

            ManiProc.ProcessDown((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF());

        }

 

        private void Window1_StylusMove(object sender, System.Windows.Input.StylusEventArgs e)

        {

            ManiProc.ProcessMove((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF());

        }

 

        private void Window1_StylusUp(object sender, System.Windows.Input.StylusEventArgs e)

        {

            ManiProc.ProcessUp((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF());

        }

Yukarıdaki kodda da görebileceğiniz üzere aslında bizim yaptığımız birşey yok. Gelen StylusID ile pozisyonu doğrudan Processor'ımıza aktarıyoruz. Processor hesaplamaları tamamladıktan sonra kendine özel ayrı bir event çalıştırarak bize sonucu aktaracak.

[VB]

    Private Sub ManiProc_ManipulationDelta(ByVal sender As Object, ByVal e As Windows7.Multitouch.Manipulation.ManipulationDeltaEventArgs) Handles ManiProc.ManipulationDelta

        Konum.X += e.TranslationDelta.Width

        Konum.Y += e.TranslationDelta.Height

 

        Aci.Angle += e.RotationDelta * 180 / Math.PI

 

        Boyut.ScaleX *= e.ScaleDelta

        Boyut.ScaleY *= e.ScaleDelta

    End Sub

[C#]

        private void ManiProc_ManipulationDelta(object sender, Windows7.Multitouch.Manipulation.ManipulationDeltaEventArgs e)

        {

            Konum.X += e.TranslationDelta.Width;

            Konum.Y += e.TranslationDelta.Height;

 

            Aci.Angle += e.RotationDelta * 180 / Math.PI;

 

            Boyut.ScaleX *= e.ScaleDelta;

            Boyut.ScaleY *= e.ScaleDelta;

        }

İşte geldik en can alıcı noktaya. Processor'ımızın ManipulationDelta event'ı çalıştığında artık gerekli hesaplamalar yapılmış demektir. Geriye kalıyor hesaplamaları uygun şekilde ekrandaki resmimize yansıtmak. Bunun için zaten daha önce resmimize ait Transform nesnelerine özel isimler vermiştik. Bu durumda eldeki Delta değerlerini doğrudan uygun Transform nesnelerinin özelliklerine ekleyebiliriz.

Uygulamamız bitti. Artık programı çalıştırarak iki parmağınız ile rahatlıkla resmi tutup sürükleyebilir veya boyutlandırabilir, döndürebilirsiniz. Herşey bu kadar basit.

Hepinize kolay gelsin.

Örneklere ait kaynak kodları - 13082009_1.rar (1,59 MB)

Thursday, August 13, 2009 5:47:05 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   MultiTouch | Windows 7 | WPF  | 
 Wednesday, April 29, 2009

Bu hafta sonu için sizlere iki ayrı etkinlik duyurum var. Her ikisi de Ankara'da! Cumartesi günü SQL Kampı etkinliğimizin Ankara ayağını yapıyoruz, Pazar günü ise benim de konuşmacı olacağım NedirTV'nin 3. yıldönümü kutlama etkinliği olacak. Her ikisinin de planını aşağıda bulabilirsiniz.

02.05.2009 / SQL Kampı
09.30-10.30 Silverlight 3.0 ve İş Uygulamaları - Daron Yöndem
10.30-12.00 SQL 2008 Platform ve Development Yenilikleri - Tarık Kranda
13.00-15.00 Index Strategies and Performance Tunning - Pamir Erdem
15.30-17.00 IIS 7 üzerinde PHP ve MSSQL - Muammer Benzeş

03.05.2009 / NedirTV Günü
09:45-11.15 ASP.NET MVC - Uğur Umutluoğlu
11:30-13.00 What is SharePoint? - Burak Batur
14:00-15.30 WCF 4.0 & WF 4.0 - Burak Selim Şenyurt
15:30-16.30 WPF ve MultiTouch Programlama – Daron Yöndem

Her iki etkinlik de Bilkent Üniversitesi'nde gerçekleştirilecek. Merkez Kampüs Rektörlük Binası Mithat Çoruh Amfi Salonu'nda olacağız. Hepinizi bekliyoruz!

Not: Etkinlik sonrası "Haberimiz olsa gelirdik" diyen her birey saçımdan bir tel daha kopartıp üzerinde tepinmeme neden oluyor :) O nedenle sizden ricam etrafınızda bu etkinlik ile ilgilenebilecek herkesi haberdar etmeniz. Görüşmek üzere...

Wednesday, April 29, 2009 1:17:35 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]   ASP.NET 3.5 | MultiTouch | Silverlight 3.0 | SQL Server 2008 | WPF  | 
 Tuesday, April 28, 2009

Bugün Konya, Selçuk Üniversitesi'ndeydim. WPF MultiTouch, Silverlight 3.0 ve AJAX oturumları ile yoğun ve bir o kadar da eğlenceli bir gün geçirdik. Yine efsane potlar kırdım ama bu sefer yazdığım kodlarla :) Her neyse, konuya dönersek... Benim için biraz da duygusal bir buluşma oldu bu sene Selçuk Üniversitesi'ni ziyaretim. Geçen seneki ziyaretimde dördüncü sınıf öğrencilerinden bir grup cengaveri çok net hatırlıyordum. İşte o grup bir gördüm ki kendi şirketini kurmuş ve yurt dışında Outsource yazılım satıyor! İşte budur! Özellikle Anadolu üniversitelerini ziyaretimde gençlerin "Bu meslekte İstanbul'a gitmek lazım" şartlanmasının anlamsız olduğunu kanıtlayan bu örneği özellikle sizlerle buradan paylaşmak istedim.

Konya, Selçuk Üniversitesi Seminerlerim
Konya, Selçuk Üniversitesi Seminerlerim

Etkinlikteki katkılarından dolayı sevgili Serkan Cura'ya ve Nevzat Örnek hocamıza buradan çok teşekkür ediyorum. Umarım katılan herkese olabildiğince faydalı olmuştur. Seneye tekrar görüşmek üzere ;)

Monday, April 27, 2009 11:18:43 PM (GTB Standard Time, UTC+02:00)  #    Comments [4]   AJAX | MultiTouch | Silverlight 3.0 | WPF  | 
 Friday, April 17, 2009

Bugün Imagine Cup 2009 Türkiye Final'inin günüydü. Microsoft Istanbul ofisindeki etkinlik dün twitter üzerinden de duyurduğum üzere tamamen canlı olarak internetten de yayınlandı hatta oylama sürecinde bir de online oylama sistemi kullanıldı. Buradan katılan tüm ekipleri kutluyorum!

Etkinlik içerisinde bir de teknik oturum yer aldı ve ben de o oturumda WPF ve MultiTouch ile ilgili bilgiler verip demo yapma şansına sahip oldum. En son INETA NEXT etkinliğinde yaşadığımız donanımsal sorunları aşmış olsak da bu sefer de zamanımız yetmedi :) Eminim ki en kısa zamanda Multitouch oturumlarım ile ilgili de sağlıklı bir işleyişi oturtacağım :)

Imagine Cup Türkiye Finali'nde WPF ve MultiTouch Oturumum
Imagine Cup Türkiye Finali'nde WPF ve MultiTouch Oturumum

Seminerde söz verdiğim üzere hem yaptığım örnekleri, hem sunumumu, hem de Managed Wrapper'ları sizlerle paylaşıyorum. Aşağıdaki adresten indirebilirsiniz. Kısa sürede bu konuda sağlıklı bir seminer kaydını blogumdan paylaşacağım.

MultiTouch Örnek Projeler - 17042009_1.rar (3,6 MB)
MultiTouch Sunum - 17042009_2.pptx (2,01 MB)

Friday, April 17, 2009 11:32:27 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   WPF | MultiTouch  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.