ArcGIS Engine+C#缓冲区分析文档及完整源码
牟乃夏ArcEngine教程:第1章 ArcGIS Engine编程基

1.1 ArcGIS Engine概述
ArcGIS Engine开发工具包的组成
1.1 ArcGIS Engine概述
• ArcGIS Engine运行时
➢ArcGIS Engine运行时是能够保证基于ArcGIS Engine开发的软件正常运行的 ArcObjects组件产品,是运行由ArcGIS Engine开发的应用程序的基础软件 环境。
• 2.CoClass类 • CoClass类,即可创建类。该类可以通过new关键字直接实例化对
象,它的实例对象不依赖其他对象的存在而存在,其生存周期也 不由其它的对象管理。如QueryFilter是一个组件类,可以用new关 键字来创建一个对象。
1.4 对象模型图(OMD图)
• 3. Class类 • Class类,即可实例化类。该类不能直接使用new关键字创建对
1.2 ArcGIS Engine开发资源
• 1.帮助文档
• 【开始】→【所有程序】→【ArcGIS】 →【Developer Help】→【ArcObjects Help for .NET】,即可启动ArcObjects 的帮助系统。
• 2.自带示例
• 在安装完ArcObjects SDK后,在 “..\Program Files\ArcGIS\DeveloperKit10.0\Samples” 文件夹下,包含有许多自带的代码示 例工程,这些都是开发人员学习 ArcGIS Engine开发很好的资源。
1.4 对象模型图(OMD图)
• 2)组合关系 • 组合关系指其中一个类对象是另外一个类对象的组成部分,由组
成对象控制被组成对象的整个生命周期,在OMD图中用实心菱形 表示。
Layer是Map的一部分,当Map消失的时候,Layer也 将不复存在。在ArcGIS Engine中,地图文档由多个地 图组成,工具条控制对象由多个工具项组成,这些
ArcGIS Engine指导书3

ArcEngine开发实例三一、实例目标及其实现的主要功能1、学习编程实现打开、保存,另存地图文档的方法;2、运用工具栏工具进行地图要素的添加;3、运用状态栏控件实现地图坐标信息的显示。
二、具体的实现过程及代码1、如指导书中的过程,新建一个C#工程项目,并为默认建立的窗体分别添加“ToolBarControl”“TOCControl”“MapControl”“LicenseControl”控件,执行与MapControl 控件的绑定操作,并通过“dock”属性排好。
为工具栏添加如下图所示的工具按钮。
2、添加菜单控件,依次添加菜单栏的主菜单text属性为“文件”,其name属性为“menuFile”,依次添加子菜单,其text属性分别为“打开文档”,“新建文档”,“保存文档”,“另存为….”,“退出”,其name属性分别为“menuOpenDoc”,“menuNewDoc”,“menuSaveDoc”,“menuSaveAsDoc”,“menuExitApp”。
3、打开工具箱,通过添加选项,添加statusBar控件,并双击添加到窗体上。
4、添加ArcGIS的引用ESRI.ArcGIS.Geodatabase和ESRI.ArcGIS.ADF类库,在第一个窗体的代码窗口导入命名空间:using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.ADF;using ESRI.ArcGIS.SystemUI;5、在public partial class Form1 : Form代码下添加如下的初始化语句:private IMapControl3 m_mapControl = null;private string m_mapDocumentName = string.Empty;private IContainer components;6、为窗体添加load事件,并添加以下代码:private void Form1_Load(object sender, EventArgs e){m_mapControl = (IMapControl3)axMapControl1.Object;menuSaveDoc.Enabled = false; }7、为菜单“menuOpenDoc”添加click事件,并添加如下代码:ICommand command = new ControlsOpenDocCommandClass();command.OnCreate(m_mapControl.Object);command.OnClick();8、为菜单“menuSaveDoc”添加click事件,并添加如下代码:if (m_mapControl.CheckMxFile(m_mapDocumentName)){IMapDocument mapDoc = new MapDocumentClass();mapDoc.Open(m_mapDocumentName, string.Empty);if (mapDoc.get_IsReadOnly(m_mapDocumentName)){MessageBox.Show("Map document is read only!");mapDoc.Close();return;}mapDoc.ReplaceContents((IMxdContents)m_mapControl.Map);mapDoc.Save(esRelativePaths, false);mapDoc.Close();}9、为菜单“menuSaveAsDoc”添加click事件,并添加如下代码::ICommand command = new ControlsSaveAsDocCommandClass();command.OnCreate(m_mapControl.Object);command.OnClick();10、为菜单“menuExitApp”添加click事件,并添加如下代码:Application.Exit();11、为菜单“menuNewDoc”添加click事件,并添加如下代码:ICommand command = new CreateNewDocument();command.OnCreate(m_mapControl.Object);command.OnClick();12、为控件“axMapControl1”添加OnMouseMove事件,并添加如下代码:statusBar1.Text = string.Format("{0}, {1} {2}", e.mapX.ToString("#######.##"),e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring(4));13、为控件“axMapControl1”添加OnMapReplaced事件,并添加如下代码:m_mapDocumentName = m_mapControl.DocumentFilename;if (m_mapDocumentName == string.Empty){menuSaveDoc.Enabled = false;statusBar1.Text = string.Empty;}else{menuSaveDoc.Enabled = true;statusBar1.Text = Path.GetFileName(m_mapDocumentName);}三、操作通过操作调试该程序源码,观察并掌握AE中对于地图文件保存的操作方法。
ArcGISEngineVC

+ ArcEngine一、初步开始 (1)二、鹰眼功能实现 (3)三、将地图导出为图片 (4)四、打印功能实现(如ArcMap中的打印对话框) (5)五、点击查询 (6)六、mapControl和 pageLayoutControl切换问题 (11)七、mapControl和 pageLayoutControl同步问题 (11)初步开始一、初步开始1.新建exe工程;2.在Application Type中选择SingleDocument单文档模式;在Generated Classes中选择CFormView,创建工程。
3.打开Dialog菜单下的IDD_EMEVALUATION_FORM,点击Toolbox,点击右键,选择Choose Items,弹出对话框,选择Com Components,选择Esri的控件,MapControl控件,TocControl控件(图层控制),LicenseControl控件,ToolbarControl控件等常用的控件。
4.在Toolbox中可以观察到添加了以上选择的控件,在对话框IDD_EMEV ALUATION_FORM中添加MapControl控件,TocControl控件(图层控制),LicenseControl控件,ToolbarControl控件;5.为以上控件添加变量;在*View.cpp中的OnSize函数中添加以下代码:if(0 == cx || 0 == cy || 0 == m_mapControl || 0 == m_tocControl || 0 == m_toolbarControl || 0 ==m_mapEyeControl) return;m_toolbarControl.MoveWindow(0,0,int(cx*0.5),25,TRUE);m_toolbarPLayControl.MoveWindow(int(cx*0.5),0,cx,25,TRUE);m_tocControl.MoveWindow(0,25,300,cy-250,TRUE);m_pagelayoutControl.MoveWindow(300,25,cx-300,cy-25,TRUE);m_mapControl.MoveWindow(300,25,cx-300,cy-25,TRUE);m_mapEyeControl.MoveWindow(0,cy-250,300,250,TRUE);将*.cpp中的m_pMainWnd->ShowWindow(SW_SHOWNORMAL)改为m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED)使窗口最大化。
ARCGIS Engine.C#开发GIS应用

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用Dixon整理此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤。
你可以在下面的目录下找到相应的样例程序:<安装目录>\DeveloperKit\Samples\Developer_Guide_Scenarios\ ArcGIS_Engine\Building_an_ArcGIS_Control_Application\Map_Viewer 注:ArcGIS样例程序不包含在ArcGIS Engine开发工具包“典型”安装方式中。
如果你没有安装它们,则可以重新运行开发工具包安装向导,选择“定制”或“修改”方式,并选择软件开发包下的样例项进行安装。
一、项目描述利用视窗控件建立应用程序的目标是演示并使你熟悉在微软Visual Studio .NET API中使用标准ArcGIS控件开发和部署GIS应用所需的步聚。
本节中使用了Visual Studio .NET开发环境中的MapControl、PageLayoutControl、TOCControl和ToolbarControl等视窗控件。
COM、Java和C++程序员应该参考如下章节:利用ActiveX建立应用程序、利用可视化JavaBeans建立应用程序、建立命令行方式的Java应用和建立命令行方式的C++应用。
本节演示了创建查看ArcMap和ArcGIS桌面应用图形文档的GIS 应用程序的步骤。
此节包含了以下技术:●在微软Visual Studio .NET中加载和嵌入ArcGIS控件。
●向PageLayoutControl和MapControl中加载图形文档。
●设置ToolbarControl和TOCControl的绑定控件。
●处理窗口缩放。
●向ToolbarControl添加ArcGIS Engine命令和工具。
ArcGIS Engine中IColor、IRGBColor和Win32 Color和.Net中Color相互转换

AE中IColor、IRGBColor和Win32 Color和.Net中Color相互转换1 ArcGIS Engine与.Net中Color互转1.1 将.NET中的Color结构转换至于ArcGIS Engine中的IRgbColor接口''' <summary>''' 将.NET中的Color结构转换至于ArcGIS Engine中的IRgbColor接口''' </summary>''' <param name="pColor">.NET中的System.Drawing.Color结构表示ARGB颜色</param> ''' <returns></returns>''' <remarks></remarks>Public Function ConvertColorToIRgbColor(ByVal pColor As Color) As IRgbColorDim pRgbColor As IRgbColor = New RgbColorpRgbColor.RGB = pColor.B * 65536 + pColor.G * 256 + pColor.RReturn pRgbColorEnd Function#End Region1.2 将.NET中的Color结构转换至于ArcGIS Engine中的IColor接口''' <summary>''' 将.NET中的Color结构转换至于ArcGIS Engine中的IColor接口''' </summary>''' <param name="pColor">.NET中的System.Drawing.Color结构表示ARGB颜色</param> ''' <returns></returns>''' <remarks></remarks>Public Function ConvertColorToIColor(ByVal pColor As Color) As IColorDim pESRIColor As IColor = New RgbColorpESRIColor.RGB = pColor.B * 65536 + pColor.G * 256 + pColor.RReturn pESRIColorEnd Function#End Region1.3 将ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构''' <summary>''' 将ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构''' </summary>''' <param name="pRgbColor">IRgbColor</param>''' <returns>.NET中的System.Drawing.Color结构表示ARGB颜色</returns>''' <remarks></remarks>Public Function ConvertIRgbColorToColor(ByVal pRgbColor As IRgbColor) As ColorReturn ColorTranslator.FromOle(pRgbColor.RGB)End Function#End Region1.4 将ArcGIS Engine中的IColor接口转换至.NET中的Color结构''' <summary>''' 将ArcGIS Engine中的IColor接口转换至.NET中的Color结构''' </summary>''' <param name="pColor">IColor</param>''' <returns>.NET中的System.Drawing.Color结构表示ARGB颜色</returns>''' <remarks></remarks>Public Shared Function ConvertIColorToColor(ByVal pColor As IColor) As Color Return ColorTranslator.FromOle(pColor.RGB) '特别注意此处不能用Color.FromArgb(pColor.RGB),用该函数得到的将是R与B位置相反的颜色值End Function#End Region注:以上代码用编写2 .Net与Win32中的Color互转COLORREF类型颜色的值COLORREF cr=RGB(123,200,12);其中的R、G、B三个分量的排列顺序是BGR。
ArcGIS Engine C#程序开发

基于ArcGIS Engine+C#程序开发入门1、创建基于ArcEngine的Windows Application项目(EngineTest)2、设置ArcEngine功能模块(1) Standard ArcGIS Engine functionality//The standard ArcGIS Engine Runtime provides the core functionality of all ArcGIS applications.(2) ArcGIS Engine extensions//Geodatabase Update extension//Spatial extension//3D extension//Network extension//Maplex extension(New at 9.2)//Tracking extension//Schematics//Data Interoperability extension (New at 9.2)3、设置ArcEngine引用库●//System库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些组件。
●//SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。
象Icommand和Itool这样的接口就在这里定义。
●//Geometry几何库包含了核心的几何对象,比如点,面,线等。
在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。
●//Display显示库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。
●//Controls控件库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。
●//Carto库包含了为数据显示服务的对象。
PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。
这个库中包括MxdServer和MapServer对象,它们通常被Server用来显示地图数据。
关于ArcgisEngine

关于ArcgisEngine
ArcGIS Engine 是“可嵌⼊的 GIS 组件”和“开发⼈员资源”的集合,允许您向现有应⽤程序添加动态地图和 GIS 功能,或允许您构建新的⾃定义地图应⽤程序。
在桌⾯或移动应⽤程序中,开发⼈员通过 ArcGIS Engine 的 .NET、Java 和 C++ 的 API,来部署 GIS 数据、地图和地理处理脚本。
以下是将 ArcGIS Engine ⽤于各种解决⽅案的⼀些⽅法:
快速构建⽀持 GIS 的应⽤程序(使⽤开箱即⽤的开发⼈员控件)。
创建和绘制图形要素,包括点、线、圆和多边形,以编辑地理数据(在应⽤程序中)。
对图形执⾏地理操作,以创建缓冲区、计算差异并查找图形的交集、联合或反向交集,以及更⾼级的操作。
求解并进⾏⽹络分析,以找到最佳路线和最近的设施点,并确定应分配的路线。
以 3D 形式有效地可视化和分析表⾯和地球数据。
ArcGIS Engine 产品受Windows和 Linux ⽀持,并可与Visual Studio和“其他受⽀持的 Java 和 C++ 开发环境”⼀起使⽤。
系统要求
有关 ArcGIS Engine 系统要求的列表,请参阅资源中⼼⽹站上的。
有关 ArcObjects SDK 系统要求,请参阅资源中⼼⽹站上的。
注意
从 ArcGIS 10 开始,进⾏基于 ArcGIS Engine 的开发,需要安装 ArcGIS Engine(即起码的 ArcObjects SDK for .NET、C++ 或 Java),以及 Engine 开发包的授权许可。
即使计算机上安装了 ArcGIS Desktop,这也是必需的。
ArcGISEngine拓扑规则转换为中文C#代码

ArcGISEngine拓扑规则转换为中文C#代码ArcGIS Engine拓扑规则转换为中文C#代码private void ConvertT opologyRuleType(ref string topoRuleType){switch (topoRuleType){case"esriTRTAreaNoGaps":topoRuleType = TopoErroType.面要素之间无空隙.T oString();break;case"esriTRTAreaNoOverlap":topoRuleType = TopoErroType.面要素间无重叠.ToString();break;case"esriTRTAreaCoveredByAreaClass":topoRuleType = TopoErroType.第二个图层面要素必须被第一个图层任一面要素覆盖.ToString();break;case"esriTRTAreaAreaCoverEachOther":topoRuleType = TopoErroType.两图层面要素必须互相覆盖.ToString();break;case"esriTRTAreaCoveredByArea":topoRuleType = TopoErroType.第一个图层面要素必须被第一个图层任一面要素包含.ToString();break;case"esriTRTAreaNoOverlapArea":topoRuleType = TopoErroType.图层间面要素不能相互覆盖.ToString();break;case"esriTRTLineCoveredByAreaBoundary":topoRuleType = TopoErroType.线要素必须跟面图层边界的一部分或全部重叠.ToString();break;case"esriTRTPointCoveredByAreaBoundary":topoRuleType = T opoErroType.点要素必须落在面要素边界上.ToString();break;case"esriTRTPointProperlyInsideArea":topoRuleType = TopoErroType.点要素必须落在面要素内.ToString();break;case"esriTRTLineNoOverlap":topoRuleType = T opoErroType.线要素间不能有相互重叠部分.ToString();break;case"esriTRTLineNoIntersection":topoRuleType = T opoErroType.线要素之间不能相交.ToString();break;case"esriTRTLineNoDangles":topoRuleType = TopoErroType.线要素不允许有悬挂点.ToString();break;case"esriTRTLineNoPseudos":topoRuleType = TopoErroType.线要素不允许有假节点.ToString();break;case"esriTRTLineCoveredByLineClass":topoRuleType = TopoErroType.第一个图层线要素应被第二个线图层线要素覆盖.ToString();break;case"esriTRTLineNoOverlapLine":topoRuleType = TopoErroType.第一个图层线要素不被第二个线图层线要素覆盖.ToString();break;case"esriTRTPointCoveredByLine":topoRuleType = TopoErroType.点要素应被线要素覆盖.ToString();break;case"esriTRTPointCoveredByLineEndpoint":topoRuleType = TopoErroType.点要素应在线要素的端点上.ToString();break;case"esriTRTAreaBoundaryCoveredByLine":topoRuleType = T opoErroType.面要素边界必须被线要素覆盖.ToString();break;case"esriTRTAreaBoundaryCoveredByAreaBoundary":topoRuleType = TopoErroType.面要素的边界必须被另一面要素边界覆盖.ToString();break;case"esriTRTLineNoSelfOverlap":topoRuleType = TopoErroType.线要素不能自重叠.T oString();break;case"esriTRTLineNoSelfIntersect":topoRuleType = TopoErroType.线要素不能自相交.T oString();break;case"esriTRTLineNoIntersectOrInteriorTouch":topoRuleType = TopoErroType.线要素间不能重叠和相交.ToString();break;case"esriTRTLineEndpointCoveredByPoint":topoRuleType = T opoErroType.线要素端点必须被点要素覆盖.ToString();break;case"esriTRTAreaContainPoint":topoRuleType = TopoErroType.面要素内必须包含至少一个点要素.ToString();break;case"esriTRTLineNoMultipart":topoRuleType = TopoErroType.线不能是多段.T oString();break;default:break;}}public enum T opoErroType{面要素之间无空隙=1,面要素间无重叠=3,第二个图层面要素必须被第一个图层任一面要素覆盖=4,两图层面要素必须互相覆盖=5,第一个图层面要素必须被第一个图层任一面要素包含=7,图层间面要素不能相互覆盖=8,线要素必须跟面图层边界的一部分或全部重叠=10,//线要素必须在面图层要素类=8,点要素必须落在面要素边界上=13,点要素必须落在面要素内=15,//面要素必须得包含一个点=11,线要素间不能有相互重叠部分=19,线要素之间不能相交=20,线要素不允许有悬挂点=21,线要素不允许有假节点=22,第一个图层线要素应被第二个线图层线要素覆盖=26, 第一个图层线要素不被第二个线图层线要素覆盖=28, 点要素应被线要素覆盖=29,点要素应在线要素的端点上=31,面要素边界必须被线要素覆盖=37,面要素的边界必须被另一面要素边界覆盖=38,线要素不能自重叠=39,线要素不能自相交=40,线要素间不能重叠和相交=41,线要素端点必须被点要素覆盖=42,面要素内必须包含至少一个点要素=43,线不能是多段=44};。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 概述
缓冲区分析(Buffer)是对选中的一组或一类地图要素(点、线或面)按设定的距离条件,围绕其要素而形成一定缓冲区多边形实体,从而实现数据在二维空间得以扩展的信息分析方法。
缓冲区应用的实例有如:污染源对其周围的污染量随距离而减小,确定污染的区域;为失火建筑找到距其500米范围内所有的消防水管等。
2 缓冲区的基础
缓冲区是地理空间,目标的一种影响范围或服务范围在尺度上的表现。
它是一种因变量,由所研究的要素的形态而发生改变。
从数学的角度来看,缓冲区是给定空间对象或集合后获得的它们的领域,而邻域的大小由邻域的半径或缓冲区建立条件来决定,因此对于一个给定的对象A,它的缓冲区可以定义为:P={x | d(x , A)<=r}
(d一般是指欧式距离,也可以是其它的距离,其中r为邻域半径或缓冲区建立的条件)
缓冲区建立的形态多种多样,这是根据缓冲区建立的条件来确定的,常用的对于点状要素有圆形,也有三角形、矩形和环形等;对于线状要素有双侧对称、双侧不对称或单侧缓冲区;对于面状要素有内侧和外侧缓冲区,虽然这些形体各异,但是可以适合不同的应用要求,建立的原理都是一样的。
点状要素,线状要素和面状要素的缓冲区示意图如下。
3 定制工具的使用
1 打开工程GPBufferLayer\CSharp\GpBufferLayer.sln
2 在VS2005内选择重新生成解决方案
3 开发需要添加工具的工程
4 在ToolBarControl上点右键,选择属性
5 选择条目,点击添加
6 在命令类中选择“自定义工具集”,选择“缓冲区分析”,可通过双击或者拖放到工具条上。
7 运行程序
8 使用“选择要素”命令,选择需要建立缓冲区的要素(点或线)
9 点击工具条上的“缓冲区分析按钮”,弹出缓冲区分析对话框
选择要素
选择缓冲区分析按钮
10 选择缓存分析的图层,选择距离及单位,设置输出的图层
11 点击分析按钮,当出现“分析完成”字样时,工作完成
12 这时通过附加新的图层,即可看到结果
4 核心源代码分析
4.1 BufferSelectedLayerCmd.cs
主要完成定制command的相关代码,具体原理可参见《ArcGIS Engine 中文开发指南》
4.2 BufferDlg.cs
为缓冲区分析的输入对话框。
其中最主要的是“分析”按钮的处理事件。
源代码及分析如下:
double bufferDistance;
//转换distance为double类型
double.TryParse(txtBufferDistance.Text, out bufferDistance);
if (0.0 == bufferDistance)
{
MessageBox.Show("Bad buffer distance!");
return;
}
//判断输出路径是否合法
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(txtOutputPath.Te xt)) ||
".shp" != System.IO.Path.GetExtension(txtOutputPath.Text))
{
MessageBox.Show("Bad output filename!");
return;
}
//判断图层个数
if (m_yerCount == 0)
return;
//get the layer from the map
IFeatureLayer layer = GetFeatureLayer((string)cboLayers.SelectedItem);
if (null == layer)
{
txtMessages.Text += "Layer " + (string)cboLayers.SelectedItem + "cannot be found!\r\n";
return;
}
//scroll the textbox to the bottom
ScrollToBottom();
txtMessages.Text += "\r\n分析开始,这可能需要几分钟时间,请稍候..\r\n";
txtMessages.Update();
//get an instance of the geoprocessor
Geoprocessor gp = new Geoprocessor();
gp.OverwriteOutput = true;
//create a new instance of a buffer tool
ESRI.ArcGIS.AnalysisTools.Buffer buffer
= new ESRI.ArcGIS.AnalysisTools.Buffer(layer,
txtOutputPath.Text, Convert.ToString(bufferDistance) + " " + (string)cboUnits.SelectedItem);
buffer.dissolve_option = "ALL";//这个要设成ALL,否则相交部分不会融合
//buffer.line_side = "FULL";//默认是"FULL",最好不要改否则出错
//buffer.line_end_type = "ROUND";//默认是"ROUND",最好不要改否则出错
//execute the buffer tool (very easy :-))
IGeoProcessorResult results=null;
try
{
results = (IGeoProcessorResult)gp.Execute(buffer, null);
}
catch (Exception ex)
{
txtMessages.Text += "Failed to buffer layer: " + + "\r\n";
}
if (results.Status != esriJobStatus.esriJobSucceeded)
{
txtMessages.Text += "Failed to buffer layer: " + + "\r\n";
}
//scroll the textbox to the bottom
ScrollToBottom();
txtMessages.Text += "\r\n分析完成.\r\n";
txtMessages.Text
+= "-----------------------------------------------------------------------------------------\r\n";
//scroll the textbox to the bottom
ScrollToBottom();。