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.
Switch to MainPage.xaml code view (right-click MainPage.xaml in the solution explorer then select View Code) and add the following lines at the beginning of the file:
using Leadtools.Annotations.Designers;
Update the MainPage() function as shown below:
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);
}
Add the following class functions:
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 TriangleObject from the Code tree view item in Visual C#
Click the Add button to add the above file to the application.
Open TriangleObject.cs code view (right-click TriangleObject.cs in the solution explorer then select View Code) and add the following lines at the beginning of the file:
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;
Open TriangleObject.cs code view (right-click TriangleObject.cs in the solution explorer then select View Code) and replace class TriangleObject with:
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.
Raster .NET | C API | C++ Class Library | JavaScript HTML5
Document .NET | C API | C++ Class Library | JavaScript HTML5
Medical .NET | C API | C++ Class Library | JavaScript HTML5
Medical Web Viewer .NET