TeeChart基础使用手册

TeeChart使用手册

pdf版下载地址
TeeChart库下载

文章目录

  • TeeChart使用手册
    • 1、TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll优缺点
      • 1.1 TeeChart.dll
      • 1.2 TeeChart8.ocx
      • 1.3 TeeChart.WPF.dll
    • 2、Windows窗体应用(.NET Framework) + TeeChart.dll
      • 2.1 创建工程
      • 2.2 添加TeeChart.dll
      • 2.3. 基本参数设置
        • 2.3.1 代码设置
        • 2.3.2 代码实现效果
        • 2.3.3 图像界面设置
        • 2.3.4 界面设置实现效果
    • 3、Windows窗体应用(.NET Framework) + TeeChart8.ocx
      • 3.1 创建工程
      • 3.2 添加TeeChart8.ocx
      • 3.3. 基本参数设置
        • 3.3.1 代码设置
        • 3.3.2 代码实现效果
        • 3.3.3 图像界面设置
        • 3.3.4 界面设置实现效果
    • 4、WPF应用(.NET Framework) + TeeChart.WPF.dll
      • 4.1 创建工程
      • 4.2 添加TeeChart.WPF.dll
      • 4.3. 基本参数设置
        • 4.3.1 代码设置
        • 4.3.2 代码实现效果
    • 5、动态绘制图表
      • 5.1 TeeChart.dll实现
        • 5.1.1 不同条件实现效果
        • 5.1.2 TeeChart.dll绘图效率测试结果
      • 5.2 TeeChart8.ocx实现
        • 5.2.1 不同条件实现效果
        • 5.2.2 TeeChart8.ocx绘图效率测试结果
      • 5.3 TeeChart.WPF.dll实现
        • 5.3.1 不同条件实现效果
        • 5.3.2 TeeChart.WPF.dll绘图效率测试结果
    • 6、Add-数据添加函数解析

返回顶部

1、TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll优缺点

  • TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll数据绘制效率表
绘制数据量TeeChart.dllTeeChart8.ocxTeeChart.WPF.dll
>16000(带端点)
<16000(带端点)
任意数量(不带端点)
  • TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll流畅绘制的数据量范围
绘制方式TeeChart.dllTeeChart8.ocxTeeChart.WPF.dll
带端点<2000<2500<1500
不带端点<6000<8000<2500

返回顶部

1.1 TeeChart.dll

  • 缺点:

    • TeeChart.dll在显示效果上较差,如图所示,添加控件后默认情况下在缩放是鼠标的选框会出现偏移、虚影、重叠、闪烁的情况,图中红圈为鼠标位置。
      在这里插入图片描述
      在这里插入图片描述

      • 解决方法(1):进入TeeChart Editor界面 –> Chart –>General –>Zoom –>Pen 然后修改任意一项参数,就不会出现选框偏移、闪烁等问题,而虚影、选框重叠的问题还是存在,第一次修改后会在Form.Designer.cs文件中生成相应的代码,第二次以后修改不会生成,这导致第二次以后修改的参数不会生效,只有删除第一次生成的代码再设置才能生成。

      • 解决方法(2):在程序中添加任意一条设置Zoom参数的代码就不会出现选框偏移等问题,如:

        tChart1.Zoom.Pen.Style = System.Drawing.Drawing2D.DashStyle.Dash;

    • TeeChart.dll的TeeChart Editor界面存在字体模糊,缺失,被遮挡的情况。

在这里插入图片描述

  • 优点:

    • 在TeeChart.dll的TeeChart Editor界面中设置的参数会在Form.Designer.cs文件中自动生成相应的代码,步骤清晰,利于通过代码绘制图标,可用于学习每个参数、功能的代码实现方式。

      在这里插入图片描述

    • TeeChart.dll在使用时支持.NET Framework 4及4以上的框架。

    • 具有较多重载函数,结构清晰,使用简单方便。

    • TeeChart.dll添加大量数据的效率高于TeeChart8.ocx,和TeeChart.WPF.dll差不多。

    • TeeChart.dll在绘制超过16000个带端点的数据时效率最高。

返回顶部

1.2 TeeChart8.ocx

  • 缺点:

    • 在TeeChart8.ocx的Editing界面上设置的参数、内容并不会在Form.Designer.cs文件中生成相应的代码,而是将控件的设置信息编码后写入Form.resx文件中,不利于使用代码实现TeeChart8.ocx的图表功能,如下图。

      在这里插入图片描述

    • TeeChart8.ocx大部分类、函数、参数、实现方式与TeeChart.dll、TeeChart.WPF.dll差异较大,所以在从TeeChart.dll、TeeChart.WPF.dll转到TeeChart8.ocx后使用代码实现时不是很方便。

    • TeeChart8.ocx在使用时支持**.NET Framework 4.5及4.5以上的框架,当使用框架低于4.5时,在运行程序时会出现异常。**
      在这里插入图片描述

  • 优点:

    • TeeChart8.ocx的Editing界面在显示效果上要优于TeeChart.dll,功能逻辑更清晰,较少出现字体模糊、被遮挡的情况,使用图像界面实现图表效率高于TeeChart.dll。

    在这里插入图片描述

    • 在图表种类上TeeChart8.ocx 有121种,TeeChart.dll有104种。

    • TeeChart8.ocx添加大量数据的速度较慢,略低于TeeChart.dll和TeeChart.WPF.dll。

    • TeeChart8.ocx 在绘制小于16000个带端点的数据时效率最高,绘制任意数量不带端点的数据效率最高。

返回顶部

1.3 TeeChart.WPF.dll

  • 缺点:

    • TeeChart.WPF.dll没有图形设置窗口,不能通过图形界面进行设置,开发效率较低。

    • 部分的功能、参数也被弃用,在使用上不易上手,代码实现效率较低。

    • 大概率出现某一组数据绘制失败的情况,且与数据量无关。

    • TeeChart.WPF.dll 绘制任意数量的数据效率都比较低,能流畅绘制的数据量小。

  • 优点:

    • TeeChart.WPF.dll的部分类、函数、参数与TeeChart.dll相同,在熟悉TeeChart.dll代码实现的情况下使用TeeChart.WPF.dll会更容易。
    • TeeChart.WPF.dll在使用时支持**.NET Framework 4及4以上**的框架。
    • TeeChart.WPF.dll添加大量数据的效率高于TeeChart8.ocx,和TeeChart.dll差不多。

返回顶部

2、Windows窗体应用(.NET Framework) + TeeChart.dll

2.1 创建工程

  • 打开Visual studio,将选项栏设置为C# — windows — 桌面,如下图:

在这里插入图片描述

  • 选择Windows窗体应用(.NET Framework),然后点击下一步,设置好项目名称和位置,点击创建,创建成功后如下图。

在这里插入图片描述

返回顶部

2.2 添加TeeChart.dll

  • 选择窗口左上角(根据每个人Visual studio设置不同而位置不同)的工具箱。

    在这里插入图片描述

  • 在工具栏中任意处点击鼠标右键,选择添加选项卡

在这里插入图片描述

  • 设置好选项卡名字后,在新建的选项卡上点击鼠标右键,点击选择项

在这里插入图片描述

  • 进入选择工具项后,选择**.NET Framework组件**,点击浏览,然后然后找到存放TeeChart.dll的路径,再点击确定。

在这里插入图片描述

在这里插入图片描述

  • 这样新建的选项卡中就添加进了Teechart。

在这里插入图片描述

返回顶部

2.3. 基本参数设置

2.3.1 代码设置

  • 从工具栏找到刚添加的TChart,使用鼠标左键拖入设计窗口。

在这里插入图片描述

在这里插入图片描述

  • 鼠标左键选中添加的TChart,按R键进入属性栏,找到布局 –> Dock,设置为fill

在这里插入图片描述

  • 进入Form.cs文件,创建一个函数DrawImage(),根据需要使用下表中的程序语句设置Chart的常用基本参数。
private void SetChart()
{/*******************图表窗体设置********************************/chartMove.Aspect.View3D = false;                      //关闭控件3D效果 默认为true//chartMove.Aspect.Chart3DPercent = 100;              //3D效果度大小chartMove.Legend.CheckBoxes = true;                   //是否需要勾选,如果只有一种数据,且设置为false时,显示每个点的纵坐标chartMove.Legend.Visible = true;                      //直线标题集合(图例)是否显示chartMove.Legend.Alignment = Steema.TeeChart.LegendAlignments.Bottom; //直线标题显示位置chartMove.Header.Text = "teeChart.dll动态绘图";  //Tchart窗体标题chartMove.Axes.Visible = true;                        //是否显示坐标chartMove.Axes.Left.Title.Text = "Y轴";               //左侧标题chartMove.Axes.Bottom.Title.Text = "X轴";             //底部标题chartMove.Axes.Left.Title.Visible = true;             //坐标标题是否可见chartMove.Axes.Left.Title.Angle = 0;                  //设置坐标摆放角度,纵坐标默认为90chartMove.Axes.Left.Labels.Style = Steema.TeeChart.AxisLabelStyle.Auto; //Y轴样式chartMove.Axes.Left.Labels.Angle = 0;                 //yx轴的Label显示样式(旋转角度)chartMove.Walls.Visible = true;                       //是否显示图表边框chartMove.Walls.Back.Transparent = false;             //背景是否透明chartMove.Walls.Back.Gradient.Visible = true;         //是否显示背景//chartMove.Walls.Back.Gradient.MiddleColor = Color.FromArgb(0, 100,200);   //背景渐变色chartMove.Axes.Left.Grid.Visible = true;              //是否显示横行网格/*******************红色直线创建并设置***************************/Steema.TeeChart.Styles.Line l_lineRed = new Steema.TeeChart.Styles.Line();  //创建直线对象l_lineRed.Title = "直线red";                              //标题l_lineRed.Color = Color.FromArgb(250, 50, 0);            //直线颜色//line1.ColorEach = true;                            //直线使用所有颜色l_lineRed.ShowInLegend = true;                           //是否显示直线标题 true/false 默认为truel_lineRed.Pointer.Visible = true;                        //显示端点l_lineRed.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Sphere;  //设置端点样式chartMove.Series.Add(l_lineRed);                         //添加直线/*******************绿色直线创建并设置******************************/Steema.TeeChart.Styles.Line l_lineGreen = new Steema.TeeChart.Styles.Line();l_lineGreen.Title = "直线green";l_lineGreen.Color = Color.FromArgb(0, 255, 0);l_lineGreen.ShowInLegend = true;l_lineGreen.Pointer.Visible = true;l_lineGreen.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Rectangle;chartMove.Series.Add(l_lineGreen);/*******************添加鼠标监听,标记提示*************************/Steema.TeeChart.Tools.MarksTip l_marks = new Steema.TeeChart.Tools.MarksTip();  //创建标记提示对象l_marks.Style = Steema.TeeChart.Styles.MarksStyles.XY; //显示信息设为X YchartMove.Tools.Add(l_marks);l_marks.MouseDelay = 200;                              //设置延时时间,注意必须再Add(marksTip)l_marks.HideDelay = 1500;/*******************添加数据显示数据*****************************///第一种添加方式,单个点添加/*Random l_ran = new Random();                             //随机数种子for (int i = 0; i < 10000; i++){chartMove.Series[0].Add(i, l_ran.Next(400, 900));     //添加数据点chartMove.Series[1].Add(i, l_ran.Next(100, 500));    //添加数据点}*///第二种添加方式,添加数组Random l_ran = new Random();                             //随机数种子int[] l_arrX = new int[10000];int[] l_arrRedY = new int[10000];int[] l_arrGreenY = new int[10000];for (int i = 0; i < 10000; i++){l_arrX[i] = i;l_arrRedY[i] = l_ran.Next(400, 900);l_arrGreenY[i] = l_ran.Next(100, 500);}Console.WriteLine("添加前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加前系统时间chartMove.Series[0].Add(l_arrX, l_arrRedY);           //添加数组chartMove.Series[1].Add(l_arrX, l_arrGreenY);Console.WriteLine("添加后:" + DateTime.Now.ToString("mm:ss:fff")); //打印数据添加后系统时间
}

  • 数据添加方式效率对比

    • 单位: 分:秒:毫秒

    • 数据量: 10000 * 2个数据点

    • public int Add(double x, double y); //添加点

      • 添加前:48:35:896
        添加后:48:35:901

        消耗:5 毫秒

      • 添加前:49:53:762
        添加后:49:53:768

        消耗:6 毫秒

      • 添加前:53:31:880
        添加后:53:31:885

        消耗:5 毫秒

    • public void Add(Array xValues, Array yValues); //添加数组

      • 添加前:35:39:089
        添加后:35:39:092

        消耗:3 毫秒

      • 添加前:33:58:818
        添加后:33:58:820

        差:2 毫秒

      • 添加前:11:30:878
        添加后:11:30:881

        消耗:3 毫秒

  • 综合得出

    • 点添加方式:消耗时间在5-6毫秒左右;
    • 数组添加方式:消耗时间在2-3毫秒左右。
    • **结论:数组添加方式效率比点添加方式快一倍。**详情请看:Add函数解析

返回顶部

2.3.2 代码实现效果

在这里插入图片描述

在这里插入图片描述

返回顶部

2.3.3 图像界面设置

  • 从工具栏找到刚添加的TChart,使用鼠标左键拖入设计窗口。

  • 鼠标左键选中添加的TChart,按R键进入属性栏,找到布局 –> Dock,设置为fill

  • 鼠标右键点击添加的TChart,选择属性。

在这里插入图片描述

  • 会进入TeeChart Editor界面,该界面主要能设置Chart、Series、Data、Print、Export、Tools、Animations、Themes八项。

在这里插入图片描述

  • 基本设置步骤

    • 选择表的种类、样式:Chart –> Series –> Add.

    在这里插入图片描述

    • 选择这里取消勾选左下角 view 3D,选择3D分类 –> point 3D(不是必须,可选择其它类),点击OK.

    在这里插入图片描述

    • Chart会变成所选的图表样式,左下角出现一个points3D1

    在这里插入图片描述

    • 设置图形窗口是否为3D、3D的效果程度:Chart –> 3D
      • 勾选3,开启3D效果,这里可勾选也可不勾选。
      • 3D% :在勾选3后设置3D效果度大小。

    在这里插入图片描述

    • 设置边框和背景:Chart –> Walls
    • Visible Walls :是否显示边框
    • Left\Right\Back\Bottom:设置单面边框

    在这里插入图片描述

    • 设置point3D端点的颜色:Series –> Format

    在这里插入图片描述

    • 设置线条的样式:Series –> Format

    在这里插入图片描述

    • 设置端点的样式:Series –> Points

    在这里插入图片描述

    • 设置横坐标、纵坐标刻度显示数据类型、Legend的显示类型。

    在这里插入图片描述

    • 设置标记提示:Tools –> “+”号。

    在这里插入图片描述

    • 选择Mark Tips –> Add.

    在这里插入图片描述

    • 设置标记提示
      • style :设置显示信息,这里改为X and Y values.
      • move:鼠标移动到目标点上就显示。
      • Click:鼠标点击目标点然后显示。
      • Delay:设置响应时间。
      • Hide Delay:设置显示时间。

    在这里插入图片描述

    • 窗口左下角出现marksTip1

    在这里插入图片描述

    • 可通过选中窗口左下角的图标,点击图标右上角的三角图标 –> Edit 来设置相应属性参数。
      在这里插入图片描述

    在这里插入图片描述

    • 添加数据:进入Form.cs文件,写入下列代码。
    Random l_ran = new Random();                       //随机数种子
    int[] l_arrX = new int[10000];
    int[] l_arrY = new int[10000];
    int[] l_arrZ = new int[10000];
    for (int i = 0; i < 10000; i++)
    {l_arrX[i] = i;l_arrY[i] = l_ran.Next(400, 900);l_arrZ[i] = l_ran.Next(100, 500);
    }
    points3D1.Add(l_arrX, l_arrY, l_arrZ);           //添加数组
    

    返回顶部

2.3.4 界面设置实现效果

在这里插入图片描述

返回顶部

3、Windows窗体应用(.NET Framework) + TeeChart8.ocx

3.1 创建工程

  • 打开Visual studio,将选项栏设置为C# — windows — 桌面。

  • 选择Windows窗体应用(.NET Framework),然后点击下一步,设置好项目名称和位置,点击创建

    • 需要注意的时这里的框架不能低于**.NET Framework 4.5**,否则使用TeeChart8.ocx时会报错。

      在这里插入图片描述

      在这里插入图片描述

返回顶部

3.2 添加TeeChart8.ocx

  • 选择窗口左上角(根据每个人Visual studio设置不同而位置不同)的工具箱。

  • 在工具栏中任意处点击鼠标右键,选择添加选项卡

  • 设置好选项卡名字后,在新建的选项卡上点击鼠标右键,点击选择项

  • 进入选择工具项后,选择COM组件,找到并勾选TeeeChart Pro Activex control v8,再点击确定。

    在这里插入图片描述

  • 这样新建的选项卡中就添加进了Teechart。

    在这里插入图片描述

返回顶部

3.3. 基本参数设置

3.3.1 代码设置

  • 从工具栏找到刚添加的TeeChart Pro Activex control v8,使用鼠标左键拖入设计窗口。

    在这里插入图片描述

    在这里插入图片描述

  • 鼠标左键选中添加的TChart,按R键进入属性栏,找到布局 –> Dock,设置为fill

  • 进入Form.cs文件,创建两个函数DrawImage()、ColorToUint(Color color),根据需要使用下表中的程序语句设置AxTChart的常用基本参数。

    /// <summary>
    /// 将Color的RGB值转换为uint值
    /// </summary>
    /// <param name="color"></param>
    /// <returns></returns>
    private uint ColorToUint(Color color)
    {return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R));
    }
    /// <summary>
    /// 静态图表绘制
    /// </summary>
    private void SetChart()
    {/*******************图表窗体设置********************************///axTChartMove.Header.Text.Clear();              //清空标题//axTChartMove.Header.Text.Add("TeeChar8.ocx");  //添加窗口标题,先清空原有标题axTChartMove.Header.Text.Text = "TeeChar8.ocx";  //设置tchart窗口标题axTChartMove.Axis.Left.Title.Caption = "Y轴";    //设置X轴Y轴标题axTChartMove.Axis.Bottom.Title.Caption = "X轴";axTChartMove.Axis.Left.Title.Angle = 0;          //设置标题的旋转角度axTChartMove.Aspect.View3D = false;              //是否显示3D效果/*axTChartMove.Axis.Bottom.SetMinMax(0, 200);    //设置刻度显示范围axTChartMove.Axis.Left.SetMinMax(0, 1000);*/axTChartMove.Axis.Left.Increment = 10;           //设置Y轴最小刻度axTChartMove.Legend.CheckBoxes = true;           //是否需要勾选/*******************红色直线创建并设置***************************/axTChartMove.AddSeries(TeeChart.ESeriesClass.scLine);     //创建并添加直线对象axTChartMove.Series(0).Title = "直线red";                   //设置线条名axTChartMove.Series(0).asLine.Pointer.Style = TeeChart.EPointerStyle.psCircle;   //设置端点的样式形状axTChartMove.Series(0).asLine.Pointer.HorizontalSize = 4;  //设置端点宽axTChartMove.Series(0).asLine.Pointer.VerticalSize = 4;    //设置端点高axTChartMove.Series(0).asLine.Pointer.Visible = true;      //是否显示端点axTChartMove.Series(0).Color = ColorToUint(Color.FromArgb(255, 0, 0));   //设置直线颜色/*******************蓝色直线创建并设置*****************************/axTChartMove.AddSeries(TeeChart.ESeriesClass.scLine);      //创建并添加直线对象axTChartMove.Series(1).Title = "直线blue";                   //设置线条名axTChartMove.Series(1).asLine.Pointer.Style = TeeChart.EPointerStyle.psCircle; //设置端点的样式形状axTChartMove.Series(1).asLine.Pointer.HorizontalSize = 4;  //设置端点宽axTChartMove.Series(1).asLine.Pointer.VerticalSize = 4;    //设置端点高axTChartMove.Series(1).asLine.Pointer.Visible = true;      //是否显示端点axTChartMove.Series(1).Color = ColorToUint(Color.FromArgb(0, 0, 255));/*******************添加鼠标监听,标记提示*************************/axTChartMove.Tools.Add(TeeChart.EToolClass.tcMarksTip);   //标记提示axTChartMove.Tools.Items[0].asMarksTip.Style = TeeChart.EMarkStyle.smsXY;  //设置提示信息显示样式/*******************设置鼠标缩放**********************************/Color l_cZoom = Color.FromArgb(0, 0, 0);axTChartMove.Zoom.Pen.Color = ColorToUint(l_cZoom);     //设置鼠标缩放选框颜色axTChartMove.Zoom.Pen.Style = TeeChart.EChartPenStyle.psDashDot;  //选框线条样式设置/*******************添加数据显示数据*****************************///第一种添加方式,单个点添加/*            Random l_ran = new Random();                        //随机数种子for (int i = 0; i < 10000; i++){axTChartMove.Series(0).AddXY(i, l_ran.Next(500, 900), "", axTChartMove.Series(0).Color); //添加数据点axTChartMove.Series(1).AddXY(i, l_ran.Next(100, 600), "", axTChartMove.Series(1).Color);}*///第二种添加方式,添加数组Random l_ran = new Random();                        //随机数种子int[] l_arrX = new int[10000];int[] l_arrRedY = new int[10000];int[] l_arrBlueY = new int[10000];for (int i = 0; i < 10000; i++){l_arrX[i] = i;l_arrRedY[i] = l_ran.Next(400, 900);l_arrBlueY[i] = l_ran.Next(100, 500);}Console.WriteLine("添加前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加前系统时间axTChartMove.Series(0).AddArray(10000, l_arrRedY, l_arrX);             //添加数组数据axTChartMove.SeriesList.Items[1].AddArray(10000, l_arrBlueY, l_arrX);  //效果和上面相同Console.WriteLine("添加后:" + DateTime.Now.ToString("mm:ss:fff ")); //打印数据添加后系统时间
    

  • 数据添加方式效率对比

    • 单位: 分:秒:毫秒

    • 数据量: 10000 * 2个数据点

    • int AddXY(double AX, double AY, string ALabel, uint Value); //添加点

      • 添加前:54:47:115
        添加后:54:47:826

        消耗:711 毫秒

      • 添加前:55:35:540
        添加后:55:35:884

        消耗:344 毫秒

      • 添加前:03:40:087
        添加后:03:40:516

        消耗:429 毫秒

    • void AddArray(int ArraySize, object YArray, object XArray); //添加数组

      • 添加前:14:55:456
        添加后:14:55:460

        消耗:4 毫秒

      • 添加前:15:51:258
        添加后:15:51:262

        消耗:4 毫秒

      • 添加前:16:20:728
        添加后:16:20:732

        消耗:4 毫秒

  • 综合得出

    • 点添加方式:消耗时间在344-711毫秒左右;
    • 数组添加方式:消耗时间在4毫秒左右。
    • 结论:数组添加方式效率比点添加方式快了百倍。

返回顶部

3.3.2 代码实现效果

在这里插入图片描述

在这里插入图片描述

返回顶部

3.3.3 图像界面设置

  • 从工具栏找到刚添加的axTChart1,使用鼠标左键拖入设计窗口。

  • 鼠标左键选中添加的axTChart1,按R键进入属性栏,找到布局 –> Dock,设置为fill

  • 鼠标右键点击添加的axTChart1,选择属性。

  • 会进入到如图所示窗口,点击**Edit Chart…**开始编辑图表。

    在这里插入图片描述

  • 进入编辑栏后如图所示,窗口左侧时选项卡主要有Series、Chart、Data、Tools、Export、Print、Themes几部分组成,窗口中部及右侧是点击选项卡后相应的设置区域。

在这里插入图片描述

  • 基本设置步骤。

    • 选择表的种类、样式: Series –> Add.

      在这里插入图片描述

    • 选择这里取消勾选左下角 view 3D,选择3D分类 –> point 3D,点击OK。

      在这里插入图片描述

      在这里插入图片描述

    • axTChart1会变成所选的图表样式。

      在这里插入图片描述

    • 设置图表标题: Chart –> General –> Fonts –> Font

      • 窗口中部选项栏选择 Title ,可再 Font设置图表标题的字体大小、字体类型、字体颜色等。

      在这里插入图片描述

    • 设置坐标轴刻度:Axis –> Scales

      • Minimum –> Change :设置坐标轴刻度最小取值范围。

      • Maximum –> Change:设置坐标轴刻度最大取值范围。

      • Increment –> Change:设置坐标轴刻度增量。

        在这里插入图片描述

      • Axis –> Labels–> Text–> Font 可设置坐标轴刻度的字体类型、字体大小、字体颜色等。

        在这里插入图片描述

    • 设置坐标轴标题:Axis –> Title –> style

      • Style –> Title 里输入标题内容。
      • 可选择标题的位置:Left Axis、Right Axis等。
      • Angle 设置标题的旋转角度。
      • Size设置标题区域大小。
      • Visible设置是否显示标题。

      在这里插入图片描述

      • Axis –> Title –> Format –> Text –> Font 可设置坐标轴标题的字体类型、字体大小、字体颜色等。

        在这里插入图片描述

    • 设置线条:Series0 –> Format

      • color:设置端点颜色。
      • Color Each :使用任意颜色。
      • Line … :设置线条颜色、样式、大小等。

      在这里插入图片描述

    • 设置端点:Series0 –> Point

      • 设置端点样式、大小等。

      在这里插入图片描述

    • 设置缩放功能:Chart –> Zoom

      • Allow : 是否使用缩放功能
      • Pen… :设置缩放选框的颜色、样式、线条粗细等。
      • Minimum Pixels:设置选框选择的最小像素大小。
      • Mouse Button:设置缩放功能是使用鼠标哪一个键。

      在这里插入图片描述

    • 设置标记提示

    • 添加工具:Tools –> Add

      在这里插入图片描述

    • 选择Mark Tips,点击Add .

      在这里插入图片描述

    • style :设置显示信息,这里改为X and Y values.

    • move:鼠标移动到目标点上就显示。

    • Click:鼠标点击目标点然后显示。

    • Delay:设置响应时间。

    • Hide Delay:设置显示时间。

      在这里插入图片描述

    • 添加数据:进入Form.cs文件,写入下列代码。

Random l_ran = new Random();                        //随机数种子
int[] l_arrX = new int[10000];
int[] l_arrRedY = new int[10000];
int[] l_arrBlueY = new int[10000];for (int i = 0; i < 10000; i++)
{l_arrX[i] = i;l_arrRedY[i] = l_ran.Next(400, 900);l_arrBlueY[i] = l_ran.Next(100, 500);
}
axTChartMove.Series(0).AddArray(10000, l_arrRedY, l_arrX);             //添加数组数据
axTChartMove.SeriesList.Items[1].AddArray(10000, l_arrBlueY, l_arrX);  //效果和上面相同
 <p align="right"><a href="#top">返回顶部</a></p>

3.3.4 界面设置实现效果

在这里插入图片描述

返回顶部

4、WPF应用(.NET Framework) + TeeChart.WPF.dll

4.1 创建工程

  • 打开Visual studio,将选项栏设置为C# — windows — 桌面。
  • 选择WPF应用(.NET Framework),然后点击下一步,设置好项目名称和位置,点击创建

返回顶部

4.2 添加TeeChart.WPF.dll

  • 选择窗口左上角(根据每个人Visual studio设置不同而位置不同)的工具箱。

  • 在工具栏中任意处点击鼠标右键,选择添加选项卡

  • 设置好选项卡名字后,在新建的选项卡上点击鼠标右键,点击选择项

  • 进入选择工具项后,选择WPF组件,点击浏览,然后然后找到存放TeeChart.dll的路径,再点击确定。

    在这里插入图片描述

  • 这样新建的选项卡中就添加进了Teechart。

    在这里插入图片描述

返回顶部

4.3. 基本参数设置

4.3.1 代码设置

  • 从工具栏找到刚添加的TChart,使用鼠标左键拖入设计窗口。

    在这里插入图片描述

  • 鼠标右键点击添加的TChart,选择布局 –> 全部填充。

    在这里插入图片描述

  • 选中刚添加的TChart控件,在窗口右边的属性栏设置控件名称。

    在这里插入图片描述

  • 进入MainWindow.xaml.cs文件,创建一个函数DrawImage(),根据需要使用下表中的程序语句设置Chart的常用基本参数。

    private void SetChart()
    {/*******************图表窗体设置********************************/chartMove.Aspect.View3D = false;               //控件3D效果chartMove.Header.Text = "WPF使用TeeChart.WPF"; //设置窗体标题chartMove.Legend.Visible = true;              //图例chartMove.Legend.Color = Color.FromRgb(100, 200, 200);   //设置图例背景颜色chartMove.Axes.Visible = true;                //是否显示坐标轴chartMove.Axes.Left.Title.Text = "Y轴";       //Y轴标题chartMove.Axes.Bottom.Title.Text = "X轴";     //X轴标题chartMove.Axes.Left.Title.Visible = true;    //坐标轴标题是否可见chartMove.Axes.Left.Title.Angle = 0;         //坐标轴标题旋转角度chartMove.Axes.Left.Labels.Style = Steema.TeeChart.WPF.AxisLabelStyle.Auto;//Y轴样式chartMove.Axes.Left.Labels.Angle = 20;    //坐标轴刻度标签旋转角度chartMove.Axes.Bottom.Grid.Visible = true;    //是否显示网格/*******************蓝色直线创建并设置*****************************/Steema.TeeChart.WPF.Styles.Line l_lineBlue = new Steema.TeeChart.WPF.Styles.Line();   //创建linel_lineBlue.Color = Color.FromRgb(0, 0, 200);    //设置线颜色l_lineBlue.Title = "直线blue";l_lineBlue.Pointer.Visible = true;              //设置开启端点chartMove.Series.Add(l_lineBlue);               //line添加进TChart/*******************绿色直线创建并设置***************************/Steema.TeeChart.WPF.Styles.Line l_lineGreen = new Steema.TeeChart.WPF.Styles.Line();   //创建linel_lineGreen.Color = Color.FromRgb(0, 200, 0);    //设置线颜色l_lineGreen.Title = "直线green";l_lineGreen.Pointer.Visible = true;chartMove.Series.Add(l_lineGreen);/*******************添加鼠标监听,标记提示*************************/Steema.TeeChart.WPF.Tools.MarksTip l_marks = new Steema.TeeChart.WPF.Tools.MarksTip();l_marks.Style = Steema.TeeChart.WPF.Styles.MarksStyles.XY;    //设置提示信息样式l_marks.MouseAction = Steema.TeeChart.WPF.Tools.MarksTipMouseAction.Click;       //设置触发响应方式chartMove.Tools.Add(l_marks);/*******************添加数据显示数据*****************************///第一种添加方式,单个点添加/*Random l_ran = new Random();                          //随机数种子for (int i = 0; i < 10000; i++){chartMove.Series[0].Add(i, l_ran.Next(600, 1000));       //添加数据点                    chartMove.Series[1].Add(i, l_ran.Next(200, 700));         //添加数据点 }*///第二种添加方式,添加数组Random l_ran = new Random();                          //随机数种子int[] l_arrX = new int[10000];int[] l_arrBlueY = new int[10000];int[] l_arrGreenY = new int[10000];for (int i = 0; i < 10000; i++){l_arrX[i] = i;l_arrBlueY[i] = l_ran.Next(100, 500);l_arrGreenY[i] = l_ran.Next(400, 900);}Console.WriteLine("添加前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加前系统时间chartMove.Series[0].Add(l_arrX, l_arrBlueY);       //添加数组数据chartMove.Series[1].Add(l_arrX, l_arrGreenY);Console.WriteLine("添加后:" + DateTime.Now.ToString("mm:ss:fff "));  //打印数据添加后系统时间
    }
    

  • 数据添加方式效率对比

    • 单位: 分:秒:毫秒

    • 数据量: 10000 * 2个数据点

    • public virtual int Add(double x, double y); //添加点

      • 添加前:42:25:431
        添加后:42:25:438

        消耗:7 毫秒

      • 添加前:43:29:754
        添加后:43:29:760

        消耗:6 毫秒

      • 添加前:44:03:966
        添加后:44:03:972

        消耗:6 毫秒

    • public void Add(Array xValues, Array yValues); //添加数组

      • 添加前:55:20:610
        添加后:55:20:613

        消耗:3 毫秒

      • 添加前:55:32:508
        添加后:55:32:511

        消耗:3 毫秒

      • 添加前:55:47:579
        添加后:55:47:581

        消耗:2 毫秒

  • 综合得出

    • 点添加方式:消耗时间在6-7毫秒左右;
    • 数组添加方式:消耗时间在2-3毫秒左右。
    • 结论:数组添加方式效率比点添加方式快一倍。

返回顶部

4.3.2 代码实现效果

在这里插入图片描述

返回顶部

5、动态绘制图表

5.1 TeeChart.dll实现

/// <summary>
/// 图表参数设置
/// </summary>
private void SetChart()
{/*******************图表窗体设置********************************/chartMove.Aspect.View3D = false;                      //关闭控件3D效果 默认为truechartMove.Legend.CheckBoxes = true;                   //是否需要勾选,如果只有一种数据,且设置为false时,显示每个点的纵坐标chartMove.Legend.Visible = true;                      //直线标题集合(图例)是否显示chartMove.Legend.Alignment = Steema.TeeChart.LegendAlignments.Bottom; //直线标题显示位置chartMove.Header.Text = "teeChart.dll动态绘图";  //Tchart窗体标题chartMove.Axes.Visible = true;                        //是否显示坐标chartMove.Axes.Left.Title.Text = "Y轴";               //左侧标题chartMove.Axes.Bottom.Title.Text = "X轴";             //底部标题chartMove.Axes.Left.Title.Visible = true;             //坐标标题是否可见chartMove.Axes.Left.Title.Angle = 0;                  //设置坐标摆放角度,纵坐标默认为90chartMove.Axes.Left.Labels.Style = Steema.TeeChart.AxisLabelStyle.Auto; //Y轴样式chartMove.Axes.Left.Labels.Angle = 0;                 //yx轴的Label显示样式(旋转角度)chartMove.Walls.Visible = true;                       //是否显示图表边框chartMove.Walls.Back.Transparent = false;             //背景是否透明chartMove.Walls.Back.Gradient.Visible = true;         //是否显示背景chartMove.Axes.Left.Grid.Visible = true;              //是否显示横行网格/*******************红色直线创建并设置***************************/Steema.TeeChart.Styles.Line l_lineRed = new Steema.TeeChart.Styles.Line();  //直线l_lineRed.Title = "直线red";                               //标题l_lineRed.Color = Color.FromArgb(250, 50, 0);            //直线颜色//line1.ColorEach = true;                            //直线使用所有颜色l_lineRed.ShowInLegend = true;                           //是否显示直线标题 true/false 默认为truel_lineRed.Pointer.Visible = true;                        //显示端点l_lineRed.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Sphere;  //设置端点样式chartMove.Series.Add(l_lineRed);                         //添加直线/*******************绿色直线创建并设置*****************************/Steema.TeeChart.Styles.Line l_lineGreen = new Steema.TeeChart.Styles.Line();l_lineGreen.Title = "直线green";l_lineGreen.Color = Color.FromArgb(0, 255, 0);l_lineGreen.ShowInLegend = true;l_lineGreen.Pointer.Visible = true;l_lineGreen.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Rectangle;chartMove.Series.Add(l_lineGreen);/*******************添加鼠标监听,标记提示*************************/Steema.TeeChart.Tools.MarksTip l_marks = new Steema.TeeChart.Tools.MarksTip();  //创建标记提示对象l_marks.Style = Steema.TeeChart.Styles.MarksStyles.XY; //显示信息设为X YchartMove.Tools.Add(l_marks);l_marks.MouseDelay = 200;                   //设置延时时间,注意必须在Add(l_marks)后,否则会报错l_marks.HideDelay = 1500;}/// <summary>
/// 子线程执行的方法
/// </summary>
protected void ThreadRun()
{while (true){if (!m_thSwitch){Thread l_thThis = Thread.CurrentThread;             //如果m_thSwitch为false,则销毁当前线程l_thThis.Abort();}else{int[] l_arrX = new int[10000];int[] l_arrY_red = new int[10000];int[] l_arrY_green = new int[10000];Random l_ran = new Random();                             //随机数种子for (int i = 0; i < 10000; i++){l_arrX[i] = i;l_arrY_red[i] = l_ran.Next(200, 300);l_arrY_green[i] = l_ran.Next(300, 400);}Console.WriteLine("显示前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加显示前系统时间chartMove.Invoke(new Action(delegate ()                              //通过委托在UI线程绘制图像{chartMove.Series[0].Add(l_arrX, l_arrY_red);chartMove.Series[1].Add(l_arrX, l_arrY_green);}));Console.WriteLine("显示后:" + DateTime.Now.ToString("mm:ss:fff")); //打印数据添加显示后系统时间}}
}private bool m_thSwitch = false;                        //用于判断线程是开启还是关闭/// <summary>
/// 开始Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStart_Click(object sender, EventArgs e)
{if (!m_thSwitch){ThreadStart l_start = new ThreadStart(ThreadRun);Thread l_thAddData = new Thread(l_start);           //创建子线程绘制图表数据m_thSwitch = true;l_thAddData.Start();                              //线程开始}
}
/// <summary>
/// 停止Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStop_Click(object sender, EventArgs e)
{m_thSwitch = false;                       //关闭线程
}

返回顶部

5.1.1 不同条件实现效果

  • 以下数据皆为测试数据中随机抽取。

  • 测试条件1: 同时显示两路数据、每路10000个数据点,共20000个数据点(带端点)。

    • 显示前:55:19:646
      显示后:55:20:055

      消耗:409 毫秒

    • 显示前:55:20:056
      显示后:55:20:457

      消耗:401毫秒

    • 显示前:55:20:458
      显示后:55:20:865

      消耗:407 毫秒

    在这里插入图片描述

  • 测试条件2: 同时显示两路数据、每路10000个数据点,共20000个数据点(不带端点)

    • 显示前:00:10:464
      显示后:00:10:586

    消耗:122 毫秒

    • 显示前:00:10:586
      显示后:00:10:711

      消耗:125 毫秒

    • 显示前:00:10:711
      显示后:00:10:832

      消耗:121 毫秒

    在这里插入图片描述

  • 测试条件3: 同时显示两路数据、每路5000个数据点,共10000个数据点(带端点)。

    • 显示前:04:39:917
      显示后:04:40:123

      消耗:206 毫秒

    • 显示前:04:40:123
      显示后:04:40:338

      消耗:215 毫秒

    • 显示前:04:40:338
      显示后:04:40:545

      消耗:207 毫秒

    在这里插入图片描述

  • 测试条件4: 同时显示两路数据、每路5000个数据点,共10000个数据点(不带端点)。

    • 显示前:09:20:054
      显示后:09:20:118

      消耗:64 毫秒

    • 显示前:09:20:118
      显示后:09:20:179

      消耗:61毫秒

    • 显示前:09:20:179
      显示后:09:20:240

      消耗:61毫秒

      在这里插入图片描述

  • 测试条件5: 同时显示两路数据、每路1000个数据点,共2000个数据点(带端点)。

    • 显示前:13:02:957
      显示后:13:03:005

      消耗:48 毫秒

    • 显示前:13:03:005
      显示后:13:03:055

      消耗:50 毫秒

    • 显示前:13:03:055
      显示后:13:03:100

      消耗:45 毫秒

      在这里插入图片描述

  • 测试条件6: 同时显示两路数据、每路1000个数据点,共2000个数据点(带端点)。

    • 显示前:16:16:539
      显示后:16:16:556

      消耗:17

    • 显示前:16:16:556
      显示后:16:16:574

      消耗:18

    • 显示前:16:16:574
      显示后:16:16:599

      消耗:25

      在这里插入图片描述

返回顶部

5.1.2 TeeChart.dll绘图效率测试结果

  • 根据上方几组测试数据得出以下几点结论:
    • 相同数据量下,不带端点比带端点绘制效率高3倍左右。
    • TeeChart.dll绘图效率与数据量呈线性关系。
    • 根据20帧左右为肉眼感觉的流畅度,带端点绘制一次大概最多绘制总量2000个数据,不带端点一次大概最多绘制总量6000个数据。

返回顶部

5.2 TeeChart8.ocx实现

/// <summary>
/// 将Color的RGB值转换为uint值
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private uint ColorToUint(Color color)
{return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R));
}/// <summary>
/// AxTChart基本参数设置
/// </summary>
private void SetChart()
{/*******************图表窗体设置********************************/axTChartMove.Header.Text.Text = "TeeChar8.ocx";  //设置tchart窗口标题axTChartMove.Axis.Left.Title.Caption = "Y轴";    //设置X轴Y轴标题axTChartMove.Axis.Bottom.Title.Caption = "X轴";axTChartMove.Axis.Left.Title.Angle = 0;          //设置标题的旋转角度axTChartMove.Aspect.View3D = false;              //是否显示3D效果axTChartMove.Axis.Left.Increment = 10;           //设置Y轴最小刻度axTChartMove.Legend.CheckBoxes = true;           //是否需要勾选/*******************红色直线创建并设置***************************/axTChartMove.AddSeries(TeeChart.ESeriesClass.scLine);     //创建并添加直线对象axTChartMove.Series(0).Title = "直线red";                   //设置线条名axTChartMove.Series(0).asLine.Pointer.Style = TeeChart.EPointerStyle.psCircle;   //设置端点的样式形状axTChartMove.Series(0).asLine.Pointer.HorizontalSize = 4;  //设置端点宽axTChartMove.Series(0).asLine.Pointer.VerticalSize = 4;    //设置端点高axTChartMove.Series(0).asLine.Pointer.Visible = true;      //是否显示端点axTChartMove.Series(0).Color = ColorToUint(Color.FromArgb(255, 0, 0));   //设置直线颜色/*******************蓝色直线创建并设置*****************************/axTChartMove.AddSeries(TeeChart.ESeriesClass.scLine);      //创建并添加直线对象axTChartMove.Series(1).Title = "直线blue";                   //设置线条名axTChartMove.Series(1).asLine.Pointer.Style = TeeChart.EPointerStyle.psCircle; //设置端点的样式形状axTChartMove.Series(1).asLine.Pointer.HorizontalSize = 4;  //设置端点宽axTChartMove.Series(1).asLine.Pointer.VerticalSize = 4;    //设置端点高axTChartMove.Series(1).asLine.Pointer.Visible = true;      //是否显示端点axTChartMove.Series(1).Color = ColorToUint(Color.FromArgb(0, 0, 255));/*******************添加鼠标监听,标记提示*************************/axTChartMove.Tools.Add(TeeChart.EToolClass.tcMarksTip);   //标记提示axTChartMove.Tools.Items[0].asMarksTip.Style = TeeChart.EMarkStyle.smsXY;  //设置提示信息显示样式/*******************设置鼠标缩放**********************************/Color l_cZoom = Color.FromArgb(0, 0, 0);axTChartMove.Zoom.Pen.Color = ColorToUint(l_cZoom);     //设置鼠标缩放选框颜色axTChartMove.Zoom.Pen.Style = TeeChart.EChartPenStyle.psDashDot;  //选框线条样式设置
}/// <summary>
/// 子线程执行的方法 
/// </summary>
private void ThreadRun()
{while (true){if (!m_thSwitch){Thread l_thThis = Thread.CurrentThread;    //如果m_thSwitch为false,则销毁当前线程l_thThis.Abort();}else{Random l_ran = new Random();                        //随机数种子int[] l_arrX = new int[10000];int[] l_arrRedY = new int[10000];int[] l_arrBlueY = new int[10000];for (int i = 0; i < 10000; i++)                    //组合数据到数组中{l_arrX[i] = i;l_arrRedY[i] = l_ran.Next(400, 900);l_arrBlueY[i] = l_ran.Next(100, 500);}Console.WriteLine("显示前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加显示前系统时间axTChartMove.Invoke(new Action(delegate ()                              //通过委托在UI线程绘制图像{axTChartMove.Series(0).AddArray(10000, l_arrRedY, l_arrX);             //添加数组数据axTChartMove.SeriesList.Items[1].AddArray(10000, l_arrBlueY, l_arrX);  //效果和上面相同}));Console.WriteLine("显示后:" + DateTime.Now.ToString("mm:ss:fff ")); //打印数据添加显示后系统时间}}
}private bool m_thSwitch = false;                        //用于判断线程是开启还是关闭
/// <summary>
/// 开始Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStart_Click(object sender, EventArgs e)
{if (!m_thSwitch){ThreadStart l_start = new ThreadStart(ThreadRun);Thread l_thAddData = new Thread(l_start);           //创建子线程绘制图表数据m_thSwitch = true;l_thAddData.Start();                              //线程开始}
}
/// <summary>
/// 停止Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStop_Click(object sender, EventArgs e)
{m_thSwitch = false;                       //关闭线程
}

返回顶部

5.2.1 不同条件实现效果

  • 测试条件1: 同时显示两路数据、每路10000个数据点,共20000个数据点(带端点)。

    • 显示前:54:24:196
      显示后:54:24:891

      消耗:695 毫秒

    • 显示前:54:24:891
      显示后:54:25:510

      消耗:619 毫秒

    • 显示前:54:25:941
      显示后:54:26:513

      消耗:572 毫秒

  • **测试条件2:**同时显示两路数据、每路10000个数据点,共20000个数据点(不带端点)。

    • 显示前:57:24:433
      显示后:57:24:535

      消耗:102 毫秒

    • 显示前:57:24:536
      显示后:57:24:633

      消耗:97 毫秒

    • 显示前:57:24:633
      显示后:57:24:732

      消耗:99 毫秒

  • **测试条件3:**同时显示两路数据、每路5000个数据点,共10000个数据点(带端点)。

    • 显示前:01:10:577
      显示后:01:10:781

      消耗:204 毫秒

    • 显示前:01:10:833
      显示后:01:11:080

      消耗:247 毫秒

    • 显示前:01:11:080
      显示后:01:11:334

      消耗:254 毫秒

  • **测试条件4:**同时显示两路数据、每路5000个数据点,共10000个数据点(不带端点)。

    • 显示前:04:53:350
      显示后:04:53:421

      消耗:71 毫秒

    • 显示前:04:53:489
      显示后:04:53:558

      消耗:69 毫秒

    • 显示前:04:53:558
      显示后:04:53:626

      消耗:68 毫秒

  • **测试条件5:**同时显示两路数据、每路1000个数据点,共2000个数据点( 带端点)。

    • 显示前:08:18:860
      显示后:08:18:900

      消耗:40 毫秒

    • 显示前:08:18:900
      显示后:08:18:941

      消耗:41 毫秒

    • 显示前:08:18:941
      显示后:08:18:981

      消耗:40 毫秒

  • **测试条件6:**同时显示两路数据、每路1000个数据点,共2000个数据点( 不带端点)。

    • 显示前:12:26:130
      显示后:12:26:142

      消耗:12 毫秒

    • 显示前:12:26:142
      显示后:12:26:155

      消耗:13 毫秒

    • 显示前:12:26:155
      显示后:12:26:167

      消耗:12 毫秒

返回顶部

5.2.2 TeeChart8.ocx绘图效率测试结果

  • 根据几组测试数据得出以下几点结论:
    • 相同数据量下,不带端点比带端点绘制效率高6倍左右。
    • TeeChart8.ocx绘图效率与数据量增长呈反比关系。
    • 根据20帧左右为肉眼感觉的流畅度,带端点绘制一次大概最多绘制总量2500个数据,不带端点一次大概最多绘制总量8000个数据。

返回顶部

5.3 TeeChart.WPF.dll实现

private void SetChart()
{/*******************图表窗体设置********************************/chartMove.Aspect.View3D = false;               //控件3D效果chartMove.Header.Text = "WPF使用TeeChart.WPF"; //设置窗体标题chartMove.Legend.Visible = true;              //图例chartMove.Legend.Color = Color.FromRgb(100, 200, 200);   //设置图例背景颜色chartMove.Axes.Visible = true;                //是否显示坐标轴chartMove.Axes.Left.Title.Text = "Y轴";       //Y轴标题chartMove.Axes.Bottom.Title.Text = "X轴";     //X轴标题chartMove.Axes.Left.Title.Visible = true;    //坐标轴标题是否可见chartMove.Axes.Left.Title.Angle = 0;         //坐标轴标题旋转角度chartMove.Axes.Left.Labels.Style = Steema.TeeChart.WPF.AxisLabelStyle.Auto;//Y轴样式chartMove.Axes.Left.Labels.Angle = 20;    //坐标轴刻度标签旋转角度chartMove.Axes.Bottom.Grid.Visible = true;    //是否显示网格/*******************蓝色直线创建并设置*****************************/Steema.TeeChart.WPF.Styles.Line l_lineBlue = new Steema.TeeChart.WPF.Styles.Line();   //创建linel_lineBlue.Color = Color.FromRgb(0, 0, 200);    //设置线颜色l_lineBlue.Title = "直线blue";l_lineBlue.Pointer.Visible = false;              //设置开启端点chartMove.Series.Add(l_lineBlue);               //line添加进TChart/*******************绿色直线创建并设置***************************/Steema.TeeChart.WPF.Styles.Line l_lineGreen = new Steema.TeeChart.WPF.Styles.Line();   //创建linel_lineGreen.Color = Color.FromRgb(0, 200, 0);    //设置线颜色l_lineGreen.Title = "直线green";l_lineGreen.Pointer.Visible = false;chartMove.Series.Add(l_lineGreen);/*******************添加鼠标监听,标记提示*************************/Steema.TeeChart.WPF.Tools.MarksTip l_marks = new Steema.TeeChart.WPF.Tools.MarksTip();l_marks.Style = Steema.TeeChart.WPF.Styles.MarksStyles.XY;    //设置提示信息样式l_marks.MouseAction = Steema.TeeChart.WPF.Tools.MarksTipMouseAction.Click;       //设置触发响应方式chartMove.Tools.Add(l_marks);
}/// <summary>
/// 子线程执行的方法 
/// </summary>
private void ThreadRun()
{while (true){if (!m_thSwitch){Thread l_thThis = Thread.CurrentThread;    //如果m_thSwitch为false,则销毁当前线程l_thThis.Abort();}else{//第二种添加方式,添加数组Random l_ran = new Random();                          //随机数种子int[] l_arrX = new int[1250];int[] l_arrBlueY = new int[1250];int[] l_arrGreenY = new int[1250];for (int i = 0; i < 1250; i++){l_arrX[i] = i;l_arrBlueY[i] = l_ran.Next(100, 500);l_arrGreenY[i] = l_ran.Next(400, 900);}Console.WriteLine("显示前:" + DateTime.Now.ToString("mm:ss:fff"));  //打印数据添加显示前系统时间chartMove.Dispatcher.Invoke(new Action(delegate ()                    //通过委托在UI线程绘制图像{chartMove.Series[0].Add(l_arrX, l_arrBlueY);       //添加数组数据chartMove.Series[1].Add(l_arrX, l_arrGreenY);}));Console.WriteLine("显示后:" + DateTime.Now.ToString("mm:ss:fff "));  //打印数据添加显示后系统时间    }}
}private bool m_thSwitch = false;                        //用于判断线程是开启还是关闭/// <summary>
/// 开始Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStart_Click(object sender, EventArgs e)
{if (!m_thSwitch){ThreadStart l_start = new ThreadStart(ThreadRun);Thread l_thAddData = new Thread(l_start);           //创建子线程绘制图表数据m_thSwitch = true;l_thAddData.Start();                              //线程开始}
}
/// <summary>
/// 停止Button
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStop_Click(object sender, EventArgs e)
{m_thSwitch = false;                       //关闭线程
}

返回顶部

5.3.1 不同条件实现效果

  • 测试条件1: 同时显示两路数据、每路10000个数据点,共20000个数据点(带端点)。

    • 显示前:47:34:611
      显示后:47:35:546

      935 毫秒

    • 显示前:49:30:041
      显示后:49:30:995

      954 毫秒

    • 显示前:49:30:996
      显示后:49:31:974

      978 毫秒

    • 显示前:57:28:732 (绘制失败)
      显示后:57:28:733

      消耗:1 毫秒

  • 测试条件2: 同时显示两路数据、每路10000个数据点,共20000个数据点(不带端点)。

    • 显示前:32:29:988
      显示后:32:30:249

      消耗:261 毫秒

    • 显示前:32:30:536
      显示后:32:30:788

      消耗:252 毫秒

    • 显示前:32:30:789
      显示后:32:31:043

      消耗:254 毫秒

    • 显示后:32:31:043 (绘制失败)
      显示前:32:31:043

      消耗:0 毫秒

  • 测试条件3: 同时显示两路数据、每路5000个数据点,共10000个数据点(带端点)。

    • 显示前:36:19:108
      显示后:36:19:501

      消耗:393 毫秒

    • 显示前:36:19:857
      显示后:36:20:250

      消耗:393 毫秒

    • 显示前:36:20:252
      显示后:36:20:650

      消耗:398 毫秒

    • 显示前:36:20:650 (绘制失败)
      显示后:36:20:651

      消耗:1 毫秒

  • 测试条件4: 同时显示两路数据、每路5000个数据点,共10000个数据点(不带端点)。

    • 显示前:39:57:782
      显示后:39:57:940

      消耗:158 毫秒

    • 显示前:39:57:941
      显示后:39:58:103

      消耗:162 毫秒

    • 显示前:39:58:464
      显示后:39:58:629

      消耗:165 毫秒

    • 显示后:39:59:123 (绘制失败)
      显示前:39:59:124

      消耗:1 毫秒

  • 测试条件5: 同时显示两路数据、每路1000个数据点,共2000个数据点(带端点)。

    • 显示前:44:01:284
      显示后:44:01:357

      消耗:73 毫秒

    • 显示前:44:01:475
      显示后:44:01:553

      消耗:78 毫秒

    • 显示前:44:01:650
      显示后:44:01:726

      消耗:76 毫秒

    • 显示前:44:01:812 (绘制失败)
      显示后:44:01:813

      消耗:1 毫秒

  • 测试条件6: 同时显示两路数据、每路1000个数据点,共2000个数据点(不带端点)。

    • 显示前:47:53:530
      显示后:47:53:570

      消耗:40 毫秒

    • 显示前:47:53:570
      显示后:47:53:610

      消耗:40 毫秒

    • 显示前:47:53:611
      显示后:47:53:652

      消耗:41 毫秒

    • 显示前:47:53:734 (绘制失败)
      显示后:47:53:734

      消耗:0 毫秒

返回顶部

5.3.2 TeeChart.WPF.dll绘图效率测试结果

  • 根据几组测试数据得出以下几点结论:
    • 相同数据量下,不带端点比带端点绘制效率高2-3倍左右。
    • TeeChart.WPF.dll带端点绘图效率与数据量增长反比关系,不带端点绘图效率与数据量增加呈正比关系。
    • 根据20帧左右为肉眼感觉的流畅度,带端点绘制一次大概最多绘制总量1500个数据,不带端点一次大概最多绘制总量2500个数据。
    • 大概率出现某一组数据绘制失败的情况,且与数据量无关。

返回顶部

6、Add-数据添加函数解析

  • 概述: add函数无论是 public int Add(double x, double y) 还是 public void Add(Array xValues, Array yValues) 都是异步执行函数,并不参与图表数据的绘制。

  • 步骤:

    • 使用ILSpy反编译工具打开编译后的可执行文件,找到使用到添加数据的函数。

      在这里插入图片描述

    • 点击Add,找到函数实现位置。

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      • 可以看出,前面if中都是在将数组数据添加给控件,最后调用Invalidate()函数,此函数的主要功能是使控件的特定区域无效并向控件发送绘制消息。也就是说Invalidate函数只发出重绘界面的消息,不参与绘制控件,在消息发送完后就返回,Add函数就结束了。
    • 从下列函数可看出,以点的方式添加数据每添加一个点就执行一次**Invalidate()**函数,所以添加效率会远低于数组添加方式。

      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68384.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解读机械图样——基本视图

1.投影基本知识 机械图样的绘制必须按照投影法则进行。零件在太阳光、灯光等光源的照射下会产生影子&#xff0c;在此现象的启示下&#xff0c;假设光源发出的光线能透过零件&#xff0c;则零件表面的顶点、棱线就会在选定的平面上投下影子&#xff0c;产生的平面图形即为投影&…

机械设计:如何能看懂复杂机械图纸中的尺寸标注,赶快学起来

小编的话:出入加工现场,各种繁杂的加工工序图纸,你是否都看得懂?这次小编为各位社友带来机械设计中尺寸标注类知识,再也不用担心看不懂图纸啦—— 常见结构的尺寸注法常见孔的尺寸注法(盲孔、螺纹孔、沉孔、锪平孔);倒角的尺寸注法。 ❖ 盲孔 ❖ 螺纹孔 ❖ 沉孔 …

机械图样识读

1.技术要求 技术要求一般包括下列内容&#xff1a; 1&#xff09;对材料、毛坯、热处理的要求。 2&#xff09;对有关结构要素的统一要求&#xff08;如圆角、倒角等&#xff09;。 3&#xff09;表面质量要求。 4&#xff09;对校准、调整及密封的要求。 5&#xff09;试验条…

解读机械图样——剖视图

视图主要用来表达零件的可见外部形状&#xff0c;而零件的内部形状则要用虚线表示&#xff0c;如图1-9所示。这样不仅影响图形的清晰程度&#xff0c;造成内部结构线看起来产生重叠、杂乱&#xff0c;难以识读&#xff0c;而且也不便于看图和标注尺寸。为了清楚地表达零件内部结…

2022,谷歌、抖音和百度涌向AIGC

就在本月&#xff0c;WSJ 引述知情人士称&#xff0c;作为 2022 年爆红的聊天机器人 ChatGPT 背后的公司&#xff0c;OpenAI 正在谈判以收购要约的形式出售现有股份&#xff0c; 这起交易对 OpenAI 的估值达到 290 亿美元左右。在 2021 年的一场交易中&#xff0c;OpenAI 的估值…

chatgpt赋能python:用Python编写的恶搞吓人代码如何惊吓你的朋友

用Python编写的恶搞吓人代码如何惊吓你的朋友 作为一名有10年Python编程经验的工程师&#xff0c;我热衷于利用Python来创造有趣&#xff0c;恶作剧和刺激的代码。本文将介绍如何使用Python编写恶搞吓人代码&#xff0c;并在结论部分提供一些有趣的建议&#xff0c;以帮助您惊…

MacBook上有哪些值得下载的软件?

推荐分享一些 MacBook 上比较优秀的一些软件。 只是简单列举了几款&#xff0c;还有很多好用的软件没来得及介绍&#xff0c;以后有机会再做补充。 不喜勿喷&#xff0c;你说得都对&#xff01; 以下软件都访问「Mac毒」官网内下载&#xff0c;搜索「macdo.cn&#x1f50d;」…

看完这一篇后我同事说我写代码像写诗

目录 1.定义配置文件信息 2. 用RequiredArgsConstructor代替Autowired 3.代码模块化 4. 抛异常而不是返回 4. 减少不必要的db 5. 不要返回null 6. if else 7. 减少controller业务代码 8. 利用好Idea 9. 阅读源码 10. 设计模式 11. 拥抱新知识 12. 基础问题 13…

微信淘宝客小程序APP公众号京东客外卖cps分销系统网站源码开发

外卖CPS红包小程序源码分享 外卖券外卖省省外卖探探美团饿了么外卖联盟优惠券小程序系统软件开发源码 美团/饿了么外卖CPS联盟返利公众号小程序裂变核心源码 今天和大家分享下外卖CPS项目,这个其实和做淘客有点类似,淘客是别人通过你的推广购物产生佣金,同理外卖CPS也就是…

jQuery实现电影排行榜

利用jQuery实现的一个简单的电影排行榜&#xff0c;先看一下效果图&#xff1a; 样式布局没什么可说的&#xff0c;重要的是jQuery通过添加或移除类来操作DOM元素&#xff0c;大家可以做做&#xff0c;有助于理解jQuery的DOM操作。如果有什么疑问&#xff0c;欢迎大家提问&…

MyBatis plus学习笔记

Mybatis plus 1、概述 文档&#xff1a;Redirect 特性&#xff1a; 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象…

商品亲和性分析与关联规则挖掘

商品亲和性分析 亲和性分析根据样本个体之间的关系&#xff0c;确定它们关系的亲疏。它主要根据两个指标统计商品之间的亲和性&#xff1a; 支持度&#xff1a;支持度指的是数据集中规则应验的次数。&#xff08;商品交易中同时买A商品和B商品的交易数量【支持度也可以为次数…

js 数组的 forEach,some,every,reduce,sort 方法

forEach() 方法的使用 forEach 遍历数组的每一项 const arr [小红,倪大红,苏大强,我滴宝]arr.forEach((item,index)>{if(item 苏大强){console.log(index); // 2}});some() 方法的使用 从开始便利找到符合条件的便停止便利&#xff0c;相比 forEach 在性能上有一定优势…

Python 利用百度文字识别 API 识别并提取图片中文字

Python 利用百度文字识别 API 识别并提取图片中文字 利用百度 AI 开发平台的 OCR 文字识别 API 识别并提取图片中的文字。首先需注册获取 API 调用的 ID 和 key&#xff0c;步骤如下&#xff1a; 打开百度AI开放平台&#xff0c;进入控制台中的文字识别应用(需要有百度账号&a…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;2239580540qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xf…

李飞飞高徒教你从0到1构建GPT,马斯克点赞

詹士 发自 凹非寺量子位 | 公众号 QbitAI “从0到1手搓GPT”教程来了&#xff01; 视频1个多小时&#xff0c;从原理到代码都一一呈现&#xff0c;训练微调也涵盖在内&#xff0c;手把手带着你搞定。 该内容刚发出来&#xff0c;在Twitter已吸引400万关注量&#xff0c;HackerN…

马斯克、米哈游轮番注资,AI医疗会是下一个风口吗?

图片来源&#xff1a;由无界AI生成 医疗健康一直都是老生常谈的话题&#xff0c;如今这个领域正面临着诸多挑战&#xff0c;如成本不断攀升或是全球性流行病等&#xff0c;而脑机接口等AI技术的出现有望为医疗领域提供新的解决方案。 如果你是科幻迷&#xff0c;你可能对脑机接…

《战略品牌管理》思维导图,教你如何对品牌进行管理

品牌一直在我们的生活中扮演了很重要的作用&#xff0c;它影响了我们的决策&#xff0c;甚至让我们痴迷。可是很少有人真正理解它的本质以及它是怎么建立并成长的&#xff0c;而战略品牌管理知识便是这样管理品牌的一本书&#xff0c;它能帮我们解释我们生活中的很多现象&#…

薅羊毛我愿称Python为最强,Python 自动化带你轻松赚钱

ps&#xff1a;本文仅限用于技术交流&#xff0c;请勿用于其他用途。 准 备 工 作 在编写代码之前&#xff0c;需要做如下准备工作&#xff1a; 1、配置好 Android ADB 开发环境 2、Python 虚拟环境内安装 pocoui 依赖库 3、操作剪切板的应用 APK 编 写 代 码 我们分 7 …

薅羊毛算副业吗?薅羊毛到底是怎么赚钱的?

薅羊毛算副业吗?薅羊毛到底是怎么赚钱的? 薅羊毛当然也算是一种副业! 薅羊毛拿佣金的起初,我的原因应该跟大部分人事一样的,“挣钱”。 我是先在知乎上,小红书大概了解的“薅羊毛”的运作方式,然后加入一个羊毛裙看了一下别人是怎么操作的,当时觉得也是很简单的,每…