Take the following steps to start a project and to add some code that will demonstrate the custom annotation features of the LEADTOOLS WinRT Annotations.
[C#]
using Leadtools.Annotations.Designers;
[C#]
public MainPage() { this.InitializeComponent(); RasterSupport.Initialize(); AnnAutomationManager manager = new AnnAutomationManager(); manager.CreateDefaultObjects(); AutomationControl viewerControl = new AutomationControl(_viewer); _automation = new AnnAutomation(manager, viewerControl); _rbDesignMode.IsChecked = true; _automation.Active = true; AddItem(_annObjects, AnnObject.SelectObjectId); AddItem(_annObjects, AnnObject.PointerObjectId); AddItem(_annObjects, AnnObject.RectangleObjectId); AddItem(_annObjects, AnnObject.TextObjectId); AddItem(_annObjects, AnnObject.RulerObjectId); _annObjects.SelectedIndex = 0; AnnTriangleObject triangle = new AnnTriangleObject(); // Create user defined automation object AnnAutomationObject triangleAutomation = CreateTriangleAutomationObject(triangle); _automation.Manager.Objects.Add(triangleAutomation); AddItem(_annObjects, triangleAutomation.Id); }
[C#]
private AnnAutomationObject CreateTriangleAutomationObject(AnnObject annObject) { AnnAutomationObject automationObj = new AnnAutomationObject(); automationObj.Id = annObject.Id; automationObj.Name = "Triangle"; automationObj.DrawDesignerType = typeof(AnnTriangleDrawDesigner); // hook the custom draw designer automationObj.EditDesignerType = typeof(AnnPolylineEditDesigner); // hook the custom edit designer automationObj.RunDesignerType = typeof(AnnRunDesigner); AnnTriangleRenderer annTriangleRenderer = new AnnTriangleRenderer(); IAnnObjectRenderer annPolylineRenderer = AnnRenderingEngine.Renderers[AnnObject.PolylineObjectId]; annTriangleRenderer.LocationsThumbStyle = annPolylineRenderer.LocationsThumbStyle; annTriangleRenderer.RotateCenterThumbStyle = annPolylineRenderer.RotateCenterThumbStyle; annTriangleRenderer.RotateGripperThumbStyle = annPolylineRenderer.RotateGripperThumbStyle; AnnRenderingEngine.Renderers[annObject.Id] = annTriangleRenderer; // hook the custom renderer automationObj.ObjectTemplate = annObject; return automationObj; }
In the "Solution Explorer" window, right-click on the "Project Name" and select "Add" from the context menu then select "New Item...". In the "Add New Item" dialog box, select
Classand Name it TriangleObjectstrong> from Code tree view item in Visual C#
[C#]
using Leadtools; using Leadtools.Annotations.Rendering; using Windows.UI.Xaml; using Windows.UI.Xaml.Media; using Leadtools.Annotations.Core; using Windows.Foundation; using Windows.UI.Xaml.Shapes; using Windows.UI; using Leadtools.Annotations.Designers;
[C#]
public class AnnTriangleRenderer : AnnPolylineObjectRenderer { private LeadPointD[] _points; private GeometryGroup _group = new GeometryGroup(); private AnnObject _annObject; public override List<FrameworkElement> VisualComponents { get { List<FrameworkElement> _visualComponents = base.VisualComponents; if (_group.Children.Count < 2) { _group.Children.Add(new EllipseGeometry()); _group.Children.Add(new EllipseGeometry()); } if (_points.Length > 0) { EllipseGeometry ellipse = (EllipseGeometry)_group.Children[0]; ellipse.RadiusX = 10; ellipse.RadiusY = 10; ellipse.Center = new Point(_points[0].X, _points[0].Y); if (_points.Length == 2) { ellipse = (EllipseGeometry)_group.Children[1]; ellipse.RadiusX = 10; ellipse.RadiusY = 10; ellipse.Center = new Point(_points[1].X, _points[1].Y); } } if (_visualComponents.Count == 1) { _visualComponents.Add(new Path()); } Path path = (Path)_visualComponents[1]; // if we are finished 'drawing', allow the base class AnnPolylineObjectRenderer to handle the job if (_annObject.Tag == null || "drawing".CompareTo((string)_annObject.Tag) != 0) { path.Data = null; _group.Children.Clear(); } else { path.Data = _group; } path.Stroke = new SolidColorBrush(Colors.Green); path.StrokeThickness = 2; return _visualComponents; } } public override void Render(AnnContainerMapper mapper, AnnObject annObject) { _annObject = annObject; _points = mapper.PointsFromContainerCoordinates(annObject.Points.ToArray(), annObject.FixedStateOperations); base.Render(mapper, annObject); } } public class AnnTriangleDrawDesigner : AnnDrawDesigner { public AnnTriangleDrawDesigner(IAnnAutomationControl automationControl, AnnContainer container, AnnObject annObject) : base(automationControl, container, annObject) { } // override the onPointerDown method and add 3 points for our triangle public override bool OnPointerDown(AnnContainer container, AnnPointerEventArgs e) { bool handled = base.OnPointerDown(container, e); AnnObject targetObject = this.TargetObject; if (targetObject.Points.Count < 3) { targetObject.Tag = "drawing"; this.StartWorking(); targetObject.Points.Add(e.Location); handled = true; } return handled; } // override the onPointerUp method and end the drawing when we have our 3 points public override bool OnPointerUp(AnnContainer container, AnnPointerEventArgs e) { bool handled = base.OnPointerUp(container, e); handled = true; AnnObject targetObject = this.TargetObject; if (targetObject.Points.Count >= 3) { targetObject.Tag = null; this.EndWorking(); } return handled; } } public class AnnTriangleObject : AnnPolylineObject { public AnnTriangleObject() : base() { this.IsClosed = true; // triangle is a closed figure this.SetId(-99); // set the object id this.Tag = null; } protected override AnnObject Create() { return new AnnTriangleObject(); } public override string FriendlyName { get { return "Triangle"; } } }
Build, and Run the program to test it.
Use the combo box below the viewer to select annotations. The radio buttons will allow you to switch between design and run mode.