Windows 7 Multitouch Application Development (Part - I)
Microsoft is going to launch the new Windows 7 operating system in October 2009. Currently the RC version is available online. As you know, ...
-
Published by Kunal Chowdhury
<Grid> <Image Source="images/Hydrangeas.jpg"/> </Grid>Add RenderTransform to the image so that, we can scale or rotate the image properly. This will produce XAML similar to this:
<Grid> <Image Source="images/Hydrangeas.jpg" RenderTransformOrigin="0.5,0.5" Width="400"> <Image.RenderTransform> <TransformGroup> <ScaleTransform x:Name="trScale" ScaleX="1" ScaleY="1"/> <RotateTransform x:Name="trRotate" Angle="0"/> <TranslateTransform x:Name="trTranslate" X="0" Y="0"/> <SkewTransform AngleX="0" AngleY="0"/> </TransformGroup> </Image.RenderTransform> </Image> </Grid>Use proper names when you are adding different types of transform to the transform group. It will be easier for you to handle it from the code behind file. Run your application. This will open up your Window with an image inside it. If you want to drag or rotate the image this will not work because we haven’t integrated the functionality yet. Add two project references i.e. “Windows7.Multitouch” & “Windows7.Multitouch.WPF” from the extracted zip folder to your solution. These are the managed API codes for multitouch application development. Go to your Window1.xaml.cs & be sure that following namespaces are already included. You may have to add some of them.
using System; using System.Windows; using Windows7.Multitouch; using Windows7.Multitouch.Manipulation; using Windows7.Multitouch.WPF;Create two private members inside your partial class:
// object of a .Net Wrapper class for processing multitouch manipulation private ManipulationProcessor manipulationProcessor = new ManipulationProcessor(ProcessorManipulations.ALL); // boolean value to check whether you have a multitouch enabled screen private static bool IsMultitouchEnabled = TouchHandler.DigitizerCapabilities.IsMultiTouchReady;Now inside the Window Loaded event write the following lines of code:
// check to see whether multitouch is enabled if (IsMultitouchEnabled) { // enables stylus events for processor manipulation Factory.EnableStylusEvents(this); // add the stylus events StylusDown += (s, e) => { manipulationProcessor.ProcessDown((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF()); }; StylusUp += (s, e) => { manipulationProcessor.ProcessUp((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF()); }; StylusMove += (s, e) => { manipulationProcessor.ProcessMove((uint)e.StylusDevice.Id, e.GetPosition(this).ToDrawingPointF()); }; // register the ManipulationDelta event with the manipulation processor manipulationProcessor.ManipulationDelta += ProcessManipulationDelta; // set the rotation angle for single finger manipulation manipulationProcessor.PivotRadius = 2; }Write your logic inside the manipulation event handler implementation block. Here I will do rotation, scaling & positioning of the image. Here is my code:
private void ProcessManipulationDelta(object sender, ManipulationDeltaEventArgs e) { trTranslate.X += e.TranslationDelta.Width; trTranslate.Y += e.TranslationDelta.Height; trRotate.Angle += e.RotationDelta * 180 / Math.PI; trScale.ScaleX *= e.ScaleDelta; trScale.ScaleY *= e.ScaleDelta; }From the ManipulationDeltaEventArgs you can get various values & depending upon them you can implement your functionality in this block. TranslateTransform will position the image, RotateTransform will do the rotation & the ScaleTransform will resize the image. Run your project to test your first multitouch application.
Solution Architect & Former Microsoft MVP
Kunal Chowdhury is an enterprise solution architect and former multi-year Microsoft MVP. He is the author of three technical books: Windows Presentation Foundation Development Cookbook, Mastering Visual Studio 2017, and the Mastering Visual Studio 2019.
He publishes technical articles on Kunal-Chowdhury.com.