实现用户定义的注释——WinForms c# . net 6

本教程展示了如何创建用户定义的注释对象,拇指(控制点)风格,和行结束风格在WinForms c# 6 . net应用程序中使用LEADTOOLS SDK。

概述
总结 本教程介绍了如何创建用户定义的注释对象在WinForms c#应用程序。
完成时间 45分钟
Visual Studio项目 下载教程项目(9 KB)
平台 Windows WinForms c#应用程序
IDE Visual Studio 2022
开发许可 下载LEADTOOLS

所需的知识

熟悉基本的步骤创建一个项目的审查添加引用和设置一个许可证绘制和编辑文档注释教程在工作之前与LEADTOOLS注释实现用户定义的对象——WinForms c# . net 6教程。

创建项目并添加LEADTOOLS引用

从项目中创建的副本绘制和编辑文档注释教程。如果项目不可用,按照这个教程中的步骤创建它。

的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。对于这个项目,还需要以下引用:

如果使用NuGet引用,本教程需要以下NuGet包和他们的依赖关系:

如果使用本地DLL的引用,下面的DLL是必要的。dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \网:

对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序

设置许可文件

许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可教程。

有两种类型的运行时许可证:

请注意

添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。

用户定义的三角形对象

与项目创建、引用添加许可,和添加注释,代码就可以开始了。

要创建的对象是一个简单的三角形。这个对象有三个点三角形的结束点,它会使用一个中风的三角形边缘和内部填充。

添加以下语句的使用块顶部:

c#
使用Leadtools;使用Leadtools.Document;使用Leadtools.Caching;使用Leadtools.Document.Viewer;使用Leadtools.Controls;使用Leadtools.Annotations.Automation;使用Leadtools.Annotations.WinForms;使用Leadtools.Annotations.Designers;使用Leadtools.Annotations.Engine;使用Leadtools.Annotations.Rendering;

添加一个新的c#类调用AnnTriangleObject.cs项目:

在Visual Studio中添加一个新类

将下面的代码添加到新的AnnTriangleObject.cs文件:

c#/ /三角形注释对象公共AnnTriangleObject: AnnPolylineObject{/ /对象ID,让我们选择一个用户定义的值公共常量intMyId = AnnObject.UserObjectId;公共AnnTriangleObject ():基地(){/ /设置一个IDSetId (MyId);/ /三角形对象是一个封闭的图空当=真正的;}/ /友好的名称公共覆盖字符串FriendlyName{得到{返回“三角形”;}}}

添加AnnTriangleDrawDesigner以下类AnnTriangleObject类:

c#
/ /画设计师公共AnnTriangleDrawDesigner: AnnDrawDesigner{公共AnnTriangleDrawDesigner (IAnnAutomationControl automationControl AnnContainer容器,AnnObject AnnObject):基地(annObject automationControl、容器){}/ /覆盖指针事件为三角形添加三分公共覆盖boolOnPointerDown (AnnContainer发送方,AnnPointerEventArgs e){/ /基类是否想要处理的事件bool处理=基地.OnPointerDown(发送方,e);如果(处理)返回真正的;/ /只做左按钮如果(e。按钮! = AnnMouseButton.Left)返回;/ /获取当前的点对象AnnObject AnnObject =.TargetObject;intpointCount = annObject.Points.Count;如果(pointCount < 3){/ /添加当前点annObject.Points.Add (e.Location);/ /如果有0点,然后添加另一个。/ /当指针移动,最后一点也将移动(在本例中)如果(pointCount = = 0)annObject.Points.Add (e.Location);如果(pointCount = = 0){如果(!.StartWorking ())返回真正的;}}其他的{/ /现在有三个点,该过程完成.EndWorking ();}返回真正的;}/ /覆盖指针移动事件公共覆盖boolOnPointerMove (AnnContainer发送方,AnnPointerEventArgs e){bool处理=基地.OnPointerMove(发送方,e);/ /看看我们有分/ /如果是这样,最后一点在对象移动到新位置AnnObject AnnObject =.TargetObject;如果(annObject.Points。数> 0){annObject.Points [annObject.Points。数- 1)= e.Location;工作();返回真正的;}返回;}公共覆盖boolOnPointerUp (AnnContainer发送方,AnnPointerEventArgs e){基地.OnPointerUp(发送方,e);返回真正的;}}

添加InitializeTriangleObject方法的主要形式:

c#
私人静态无效InitializeTriangleObject (AutomationManagerHelper注释){/ /创建一个新的自动化对象AnnAutomationObject automationObj =AnnAutomationObject ();/ /设置对象IDautomationObj。Id= AnnTriangleObject.MyId;automationObj。Name =“三角形”;/ /设置它的设计师automationObj。DrawDesignerType =typeof(AnnTriangleDrawDesigner);automationObj。EditDesignerType =typeof(AnnPolylineEditDesigner);automationObj。RunDesignerType =typeof(AnnRunDesigner);/ /设置模板AnnTriangleObject annObj =AnnTriangleObject ();/ /设置默认中风annObj。中风= AnnStroke.Create (AnnSolidColorBrush.Create (“红色”),LeadLengthD.Create (2));annObj。填补= AnnSolidColorBrush.Create (“黄色”);automationObj。ObjectTemplate = annObj;/ /设置渲染器,AnnPolylineObject一样IAnnObjectRenderer polylineRenderer = annotations.AutomationManager.RenderingEngine.Renderers [AnnObject.PolylineObjectId];IAnnObjectRenderer渲染器=AnnPolylineObjectRenderer ();渲染器。LabelRenderer = polylineRenderer.LabelRenderer;渲染器。LocationsThumbStyle = polylineRenderer.LocationsThumbStyle;渲染器。RotateGripperThumbStyle = polylineRenderer.RotateGripperThumbStyle;渲染器。RotateCenterThumbStyle = polylineRenderer.RotateCenterThumbStyle;annotations.AutomationManager.RenderingEngine.Renderers [AnnTriangleObject。MyId] =渲染器;/ /设置它的上下文菜单和工具栏的形象AnnAutomationObject extData =AnnAutomationObject ();extData。快捷菜单=Leadtools.Annotations.WinForms.ObjectContextMenu ();extData。DrawCursor = Cursors.Cross;位图的位图=位图(System.Drawing.Imaging.PixelFormat.Format32bppArgb 24日24日);使用(图形g = Graphics.FromImage(位图)){g.Clear (Color.Transparent);g.DrawLine(笔。2黑色,12日,22日,22);g.DrawLine(笔。2黑色,22日,22日,22);g.DrawLine(笔。黑色,2,22日,12日,2);}extData。ToolBarToolTipText =“三角形”;extData。快捷菜单=ObjectContextMenu ();automationObj。ToolBarImage =位图;automationObj。用户数据= extData;annotations.AutomationManager.Objects.Add (automationObj);}

接下来,调用InitializeTriangleObject以下_documentViewer.Annotations.Initialize ()调用的InitAnnotations方法:

c#
_documentViewer.Annotations.Initialize ();/ /创建三角形自动化对象InitializeTriangleObject (automationManagerHelper);

按运行项目F5,或通过选择调试- >开始调试

如果步骤正确之后,应用程序将运行,将会有一个新的三角形图标工具栏注释。加载文档注释和测试新的三角形。结果应该类似于下面的图片:

是显示三角形画在一个文档注释

用户定义的拇指风格

与LEADTOOLS注释,可以创建自定义的拇指(控制点)。创建自定义样式的位置,旋转中心和旋转夹具的拇指。

实现一个用户定义的拇指风格,创建一个类,它实现了IAnnThumbStyle接口。然后,指定自定义一个拇指样式类IAnnObjectRenderer接口,它将使用自定义拇指风格呈现注释对象时。

首先,创建一个新类AnnTrangleObject.cs文件,从基类派生而来AnnThumbStyle,覆盖目录方法:

c#
公共AnnTriangleThumbStyle: AnnThumbStyle{受保护的覆盖AnnThumbStyle Create (){返回AnnTriangleThumbStyle ();}受保护的覆盖无效目录(System.Drawing.Drawing2D。GraphicsPath路径,LeadRectD矩形){如果(路径! =){/ /添加一个三角形浮动左= (浮动)rect.Left;浮动正确的= (浮动)rect.Right;浮动宽度=(左,右)/ 2;浮动顶级= (浮动)rect.Top;浮动底= (浮动)rect.Bottom;路径。AddLine(左、下、左+宽,顶部);路径。AddLine(左+宽,顶部,底部);路径。AddLine(右、下、左、底部);path.CloseFigure ();}}}

主要形式,更换后的代码“AnnPolylineObject设置渲染器,一样”的评论InitializeTriangleObject方法:

c#
/ /获取当前折线渲染器(需要使用一些属性没有改变)IAnnObjectRenderer polylineRenderer = annotations.AutomationManager.RenderingEngine.Renderers [AnnObject.PolylineObjectId];/ /创建新的渲染器IAnnObjectRenderer渲染器=AnnPolylineObjectRenderer ();/ /渲染器使用现有的标签。它没有被改变渲染器。LabelRenderer = polylineRenderer.LabelRenderer;/ /现在,使用新的三角形大拇指:/ /改变位置的拇指的风格AnnTriangleThumbStyle locationThumb =AnnTriangleThumbStyle ();locationThumb。= LeadSizeD大小。创建(72 * 72 * 2);locationThumb。中风= AnnStroke.Create (AnnSolidColorBrush.Create (“黑色”),LeadLengthD.Create (1));locationThumb。填补= AnnSolidColorBrush.Create (“# 7 f0000ff”);渲染器。LocationsThumbStyle = locationThumb;/ /改变旋转中心拇指风格AnnTriangleThumbStyle rotateCenterThumb =AnnTriangleThumbStyle ();rotateCenterThumb。= LeadSizeD大小。创建(72、72);rotateCenterThumb。中风= AnnStroke.Create (AnnSolidColorBrush.Create (“黑色”),LeadLengthD.Create (1));rotateCenterThumb。填补= AnnSolidColorBrush.Create (“# EFFF0000”);渲染器。RotateCenterThumbStyle = rotateCenterThumb;/ /改变旋转夹拇指风格AnnTriangleThumbStyle rotateGripperThumb =AnnTriangleThumbStyle ();rotateGripperThumb。= LeadSizeD大小。创建(72 * 72 * 2);rotateGripperThumb。中风= AnnStroke.Create (AnnSolidColorBrush.Create (“黑色”),LeadLengthD.Create (1));rotateGripperThumb。填补= AnnSolidColorBrush.Create (“# 3 f00ff00”);渲染器。RotateGripperThumbStyle = rotateGripperThumb;annotations.AutomationManager.RenderingEngine.Renderers [AnnTriangleObject。MyId] =渲染器;

按运行项目F5,或通过选择调试- >开始调试

如果步骤正确,三角形注释对象有一个更新的拇指点风格。加载文档注释和测试更新后的三角形。结果应该类似于下面的图片:

画三角形与自定义注释拇指点风格

用户定义的结束方式

添加一个新的c#类项目和名称AnnCrossLineEnding.cs。设置这个新类继承AnnLineEnding。然后,覆盖一些成员和实现新功能定义结束风格将下面的代码添加到新类:

c#
公共AnnCrossLineEnding: AnnLineEnding{受保护的覆盖AnnLineEnding Create (){返回AnnCrossLineEnding ();}公共覆盖AnnLineEnding克隆(){AnnCrossLineEnding arrowLineEnding =基地.Clone ()作为AnnCrossLineEnding;arrowLineEnding。关闭了=_closed;返回arrowLineEnding;}公共覆盖intId{/ /注意在创建自定义风格结束之前不习惯你添加惟一的Id/ /现有风格id都是负结束所以设置id = 1自定义风格结束得到{返回1;}}/ /这是属性控制如果结局风格十字形状是关闭私人bool_closed =;公共bool关闭{得到{返回_closed;}{_closed =价值;}}/ /返回点组成的数组风格的形状,这将是渲染风格,也当冲击测试时使用它公共覆盖LeadPointD [] GetStylePoints (LeadPointD lineStart, LeadPointD lineEnd){长度=. length。价值/ 2;/ /第一个交叉线开始lineStartX = lineStart.X;lineStartY = lineStart.Y;LeadPointD pt0 = LeadPointD。创建(lineStartX -长度、lineStartY -长度);LeadPointD pt1 = LeadPointD。创建(lineStartX +长度,lineStartY +长度);LeadPointD pt2 = LeadPointD。创建(lineStartX -长度、lineStartY +长度);LeadPointD pt3 = LeadPointD。创建(lineStartX +长度,lineStartY -长度);返回LeadPointD [] {pt0, pt1、pt2 pt3};}/ /在这里你可以指定要达到测试的如果你想要的风格,你可以移动对象通过拖动它公共覆盖boolHitTest (LeadPointD点,hitTestBuffer, LeadPointD lineStart, LeadPointD lineEnd){返回;}/ /保存自定义样式的XML文档公共覆盖XmlNode序列化(AnnSerializeOptions选项,XmlNode parentNode, XmlDocument文档,字符串elementName){XmlNode styleNode =基地.Serialize(选项、parentNode文档,elementName);= document.CreateElement XmlNode元素(“StyleClosed”);元素。InnerText = _closed.ToString实现();styleNode.AppendChild(元素);返回styleNode;}/ /加载自定义样式从XML文档公共覆盖无效反序列化(AnnDeserializeOptions选项,XmlNode元素,XmlDocument文档){基地.Deserialize(选项、元素、文档);XmlNode childNode = element.SelectSingleNode (“StyleClosed”);如果(childNode ! =){_closed =bool.Parse (childNode.FirstChild.Value);}}公共覆盖字符串FriendlyName{得到{返回“结束”;}}}

添加以下声明的使用块的主要形式:

c#
使用System.Xml;

将下面的代码添加到InitUI方法,在loadButton减速:

c#
varlineEndingButton =按钮();lineEndingButton。Name =“lineEndingButton”;lineEndingButton。文本=“添加自定义线结束”;lineEndingButton。宽度= 175;lineEndingButton。码头= DockStyle.Left;lineEndingButton。单击+ =(发送方,e) = > AddCustomLineEnding ();topPanel.Controls.Add (lineEndingButton);varsaveAnnotations =按钮();saveAnnotations。Name =“saveAnnotations”;saveAnnotations。文本=“注释并保存”;saveAnnotations。宽度= 175;saveAnnotations。码头= DockStyle.Left;saveAnnotations。单击+ =(发送方,e) = > SaveAnnotations ();topPanel.Controls.Add (saveAnnotations);

添加以下类的主要形式:

c#
/ /自定义多线渲染器将照顾呈现自定义结束风格公共AnnCustomPolylineObjectRenderer: AnnPolylineObjectRenderer{公共覆盖无效呈现(AnnContainerMapper mapper AnnObject AnnObject){基地.Render (mapper annObject);}公共覆盖无效RenderEndingStyles (AnnContainerMapper mapper AnnPolylineObject AnnPolylineObject){/ /调用基础画原来的结束方式基地.RenderEndingStyles (mapper annPolyLineObject);/ /现在画结束风格AnnCrossLineEnding startStyle = annPolyLineObject.StartStyle作为AnnCrossLineEnding;AnnCrossLineEnding endStyle = annPolyLineObject.EndStyle作为AnnCrossLineEnding;AnnWinFormsRenderingEngine引擎=.RenderingEngine作为AnnWinFormsRenderingEngine;LeadPointCollection objectPoints = annPolyLineObject.Points;int数= objectPoints.Count;如果(数< 2)返回;如果(annPolyLineObject.SupportsLineEndings){LeadPointD firstPoint = objectPoints [0];如果(startStyle ! =)annPolyLineObject RenderCrossLineEnding (startStyle引擎,映射器。FixedStateOperations、firstPoint objectPoints [1]);如果(endStyle ! =)annPolyLineObject RenderCrossLineEnding (endStyle引擎,映射器。FixedStateOperations, objectPoints(数- 1),objectPoints(计数- 2));}}私人无效AnnWinFormsRenderingEngine引擎RenderCrossLineEnding (AnnCrossLineEnding crossLineEnding AnnContainerMapper mapper, AnnFixedStateOperations操作,LeadPointD lineStart, LeadPointD lineEnd){= mapper.StrokeFromContainerCoordinates (crossLineEnding AnnStroke中风。中风、操作);如果(中风! =){LeadPointD [] endingStylePoints = mapper.PointsFromContainerCoordinates (crossLineEnding。GetStylePoints (lineStart lineEnd),操作);如果(endingStylePoints ! =& & endingStylePoints。长度= = 4){使用(钢笔笔= AnnWinFormsRenderingEngine.ToPen(中风){engine.Context。画直线(笔,AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [0]), AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [1]));engine.Context。画直线(笔,AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [2]), AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [3]));如果(crossLineEnding.Closed){engine.Context。画直线(笔,AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [0]), AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [3]));engine.Context。画直线(笔,AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [2]), AnnWinFormsRenderingEngine.ToPoint (endingStylePoints [1]));}}}}}}

整合新自定义多段线对象渲染器的注释框架。添加的代码InitAnnotations ()方法后,行var automationManagerHelper = new automationManagerHelper (automationManager);:

c#
/ /自定义多线钩现有渲染器渲染器AnnPolylineObjectRenderer polyLineRenderer = automationManager.RenderingEngine.Renderers [AnnObject.LineObjectId]作为AnnPolylineObjectRenderer;AnnCustomPolylineObjectRenderer cutomerRenderer =AnnCustomPolylineObjectRenderer ();cutomerRenderer。LocationsThumbStyle = polyLineRenderer.LocationsThumbStyle;cutomerRenderer。RotateCenterThumbStyle = polyLineRenderer.RotateCenterThumbStyle;cutomerRenderer。RotateGripperThumbStyle = polyLineRenderer.RotateGripperThumbStyle;automationManager.RenderingEngine.Renderers [AnnObject。LineObjectId] = cutomerRenderer;

添加以下逻辑lineEndingButtonsaveButton主要形式:

c#
/ /添加自定义线末梢当前选择的注释对象私人无效AddCustomLineEnding (){AnnAutomation自动化= _documentViewer.Annotations.AutomationManager.Automations [0];AnnCrossLineEnding startStyle =AnnCrossLineEnding ();startStyle。长度= automation.Container.Mapper.LengthToContainerCoordinates (20);AnnCrossLineEnding endStyle =AnnCrossLineEnding ();endStyle。长度= automation.Container.Mapper.LengthToContainerCoordinates (20);endStyle。关闭了=真正的;intannChildrenCount = automation.Container.Children.Count;如果(annChildrenCount = = 0){MessageBox.Show (“没有发现“);返回;}AnnPolylineObject吗?annPolylineObject = automation.Container.Children [annChildrenCount-1]作为AnnPolylineObject;如果(annPolylineObject ! =){annPolylineObject。StartStyle =startStyle;annPolylineObject。EndStyle =endStyle;automation.Invalidate (LeadRectD.Empty);}}/ /保存注释添加到一个XML文件私人无效SaveAnnotations (){如果(_documentViewer。文档= =){MessageBox.Show (“没有在文档中找到的文件查看器”);返回;}AnnAutomation自动化= _documentViewer.Annotations.AutomationManager.Automations [0];AnnContainer容器= automation.Container;AnnCodecs AnnCodecs =AnnCodecs ();AnnDeserializeOptions选项=AnnDeserializeOptions ();annCodecs。DeserializeOptions =选项;/ /钩DeserializeObject事件创建自定义风格从xml实例装船时结束选项。DeserializeObject + =委托(对象sender2 AnnSerializeObjectEventArgs args){AnnPolylineObject吗?多段线= args.AnnObject作为AnnPolylineObject;如果(折线! =& &折线。Id== AnnObject.LineObjectId){如果(折线。StartStyle = =){如果(arg游戏。TypeName = =“1”)/ /自定义样式id 1结束{多段线。StartStyle =AnnCrossLineEnding ();}}其他的如果(折线。EndStyle ==){如果(arg游戏。TypeName = =“1”)/ /自定义样式id 1结束{多段线。EndStyle =AnnCrossLineEnding ();}}}}!;SaveFileDialog SaveFileDialog =SaveFileDialog ();saveFileDialog。过滤器=“XML文件| * . XML”;如果(saveFileDialog.ShowDialog () = = DialogResult.OK){annCodecs.Save (saveFileDialog。文件名,容器,AnnFormat。注释1);}}

按运行项目F5,或通过选择调试- >开始调试

如果步骤正确之后,应用程序将运行,添加自定义行结束保存自定义风格工具栏上的按钮现在。

加载一个文件,用直线工具画一条线的文档。点击“添加自定义线结束”按钮添加新行结束。

保存添加注释XML文件使用保存注释按钮。

是显示三角形画在一个文档注释

总结

本教程演示了如何使用AnnPolylineObject,AnnThumbStyle,AnnLineEnding类来创建自定义用户定义注释对象,拇指控制样式,风格和行结束符。

另请参阅

iOS
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2023领先的技术公司。保留所有权利。