本教程展示了如何创建用户定义的注释对象,拇指(控制点)风格,和行结束风格在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教程。
从项目中创建的副本绘制和编辑文档注释教程。如果项目不可用,按照这个教程中的步骤创建它。
的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。对于这个项目,还需要以下引用:
如果使用NuGet引用,本教程需要以下NuGet包和他们的依赖关系:
Leadtools.Annotations.Winforms
Leadtools.Document.Sdk
Leadtools.Document.Viewer.Winforms
如果使用本地DLL的引用,下面的DLL是必要的。dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \网:
Leadtools.dll
Leadtools.Annotations.Automation.dll
Leadtools.Annotations.Engine.dll
Leadtools.Annotations.WinForms.dll
Leadtools.Caching.dll
Leadtools.Codecs.dll
Leadtools.Controls.WinForms.dll
Leadtools.Document.dll
Leadtools.Document.Pdf.dll
Leadtools.Document.Viewer.WinForms.dll
对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序。
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可教程。
有两种类型的运行时许可证:
请注意
添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。
与项目创建、引用添加许可,和添加注释,代码就可以开始了。
要创建的对象是一个简单的三角形。这个对象有三个点三角形的结束点,它会使用一个中风的三角形边缘和内部填充。
添加以下语句的使用
块顶部:
使用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
项目:
将下面的代码添加到新的AnnTriangleObject.cs
文件:
添加AnnTriangleDrawDesigner
以下类AnnTriangleObject
类:
/ /画设计师
公共类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
方法的主要形式:
私人静态无效InitializeTriangleObject (AutomationManagerHelper注释)
{
/ /创建一个新的自动化对象
AnnAutomationObject automationObj =新AnnAutomationObject ();
/ /设置对象ID
automationObj。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
方法:
_documentViewer.Annotations.Initialize ();
/ /创建三角形自动化对象
InitializeTriangleObject (automationManagerHelper);
按运行项目F5,或通过选择调试- >开始调试。
如果步骤正确之后,应用程序将运行,将会有一个新的三角形图标工具栏注释。加载文档注释和测试新的三角形。结果应该类似于下面的图片:
与LEADTOOLS注释,可以创建自定义的拇指(控制点)。创建自定义样式的位置,旋转中心和旋转夹具的拇指。
实现一个用户定义的拇指风格,创建一个类,它实现了IAnnThumbStyle接口。然后,指定自定义一个拇指样式类IAnnObjectRenderer接口,它将使用自定义拇指风格呈现注释对象时。
首先,创建一个新类AnnTrangleObject.cs
文件,从基类派生而来AnnThumbStyle,覆盖目录方法:
公共类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
方法:
/ /获取当前折线渲染器(需要使用一些属性没有改变)
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。然后,覆盖一些成员和实现新功能定义结束风格将下面的代码添加到新类:
公共类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
{
得到
{
返回“结束”;
}
}
}
添加以下声明的使用
块的主要形式:
使用System.Xml;
将下面的代码添加到InitUI
方法,在loadButton
减速:
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);
添加以下类的主要形式:
/ /自定义多线渲染器将照顾呈现自定义结束风格
公共类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);
:
/ /自定义多线钩现有渲染器渲染器
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;
添加以下逻辑lineEndingButton
和saveButton
主要形式:
/ /添加自定义线末梢当前选择的注释对象
私人无效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
类来创建自定义用户定义注释对象,拇指控制样式,风格和行结束符。