//------------------------------------------------------------------------- // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: CustomDynamicRendererPlugin.cs // Real time stylus plugin that demonstrates custom // dynamic rendering. // // This class implements the real time stylus plugin // interface to receive pen input notifications. It then // handles the Packets notification to draw a small circle // around each new packet point. // // The features used are: IRealTimeStylusPlugin // //-------------------------------------------------------------------------- using System; using System.Drawing; using System.Diagnostics; // The Microsoft Tablet PC namespaces using Microsoft.Ink; using Microsoft.StylusInput; using Microsoft.StylusInput.PluginData; namespace RealTimeStylusPlugins { /// /// A real time stylus plugin that demonstrates /// custom dynamic rendering. /// public class CustomDynamicRendererPlugin:IStylusSyncPlugin { // Declare the graphics object used for dynamic rendering private Graphics myGraphics; /// /// Constructor for this plugin /// /// The graphics object used for dynamic rendering. public CustomDynamicRendererPlugin(Graphics g) { myGraphics = g; } /// /// Occurs when the stylus moves on the digitizer surface. /// Use this notification to draw a small circle around each /// new packet received. /// /// The real time stylus associated with the notification /// The notification data public void Packets(RealTimeStylus sender, PacketsData data) { // For each new packet received, extract the x,y data // and draw a small circle around the result. for (int i = 0; i < data.Count; i += data.PacketPropertyCount) { // Packet data always has x followed by y followed by the rest Point point = new Point(data[i], data[i+1]); // Since the packet data is in Ink Space coordinates, we need to convert to Pixels... point.X = (int)Math.Round((float)point.X * (float)myGraphics.DpiX/2540.0F); point.Y = (int)Math.Round((float)point.Y * (float)myGraphics.DpiY/2540.0F); // Draw a circle corresponding to the packet myGraphics.DrawEllipse(Pens.Green, point.X - 2, point.Y - 2, 4, 4); } } /// /// Called when the current plugin or the ones previous in the list /// threw an exception. /// /// The real time stylus associated with the notification /// The notification data public void Error(RealTimeStylus sender, ErrorData data) { Debug.Assert(false, null, "An error occurred. DataId=" + data.DataId + ", " + "Exception=" + data.InnerException); } /// /// Defines the types of notifications the plugin is interested in. /// public DataInterestMask DataInterest { get { return DataInterestMask.Packets | DataInterestMask.Error; } } // The remaining interface methods are not used in this sample application. public void RealTimeStylusDisabled(RealTimeStylus sender, RealTimeStylusDisabledData data) {} public void RealTimeStylusEnabled(RealTimeStylus sender, RealTimeStylusEnabledData data){} public void StylusOutOfRange(RealTimeStylus sender, StylusOutOfRangeData data) {} public void StylusInRange(RealTimeStylus sender, StylusInRangeData data) {} public void StylusDown(RealTimeStylus sender, StylusDownData data) {} public void StylusUp(RealTimeStylus sender, StylusUpData data) {} public void StylusButtonDown(RealTimeStylus sender, StylusButtonDownData data) {} public void StylusButtonUp(RealTimeStylus sender, StylusButtonUpData data) {} public void CustomStylusDataAdded(RealTimeStylus sender, CustomStylusData data){} public void SystemGesture(RealTimeStylus sender, SystemGestureData data){} public void InAirPackets(RealTimeStylus sender, InAirPacketsData data){} public void TabletAdded(RealTimeStylus sender, TabletAddedData data){} public void TabletRemoved(RealTimeStylus sender, TabletRemovedData data) {} } }