TeeChart基础使用手册

TeeChart使用手册

pdf版下载地址
TeeChart库下载

返回顶部

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;                  //设置坐标摆放角度,纵坐标默认为90
    chartMove.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 默认为true
    l_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 Y
    chartMove.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();   //创建line
        l_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();   //创建line
        l_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效果 默认为true
    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;                  //设置坐标摆放角度,纵坐标默认为90
    chartMove.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 默认为true
    l_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 Y
    chartMove.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();   //创建line
    l_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();   //创建line
    l_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()**函数,所以添加效率会远低于数组添加方式。

      在这里插入图片描述

  • 10
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
TeeChart使用手册是一种详细的文档,用于帮助用户学习和了解如何使用TeeChart图表控件进行数据可视化。TeeChart是一款功能强大的图表库,可以用于各种编程环境和平台,例如Delphi、C++ Builder、Java等。 在TeeChart使用手册中,首先会介绍TeeChart的主要功能和特点。TeeChart支持多种图表类型,如折线图、柱状图、饼图等,并且可以自定义图表的样式、颜色、字体等。手册中会详细介绍如何创建、编辑和导出图表,以及如何为图表添加数据和设置数据系列。 此外,TeeChart使用手册还会提供一些实用的技巧和建议,帮助用户更好地利用TeeChart。例如,手册中可能会介绍如何使用图表交互功能,比如鼠标悬停显示数据详细信息、缩放和平移图表等。手册还可能包含一些常见问题和解决方案,以及一些示例代码,供用户参考和学习。 对于新手用户来说,TeeChart使用手册是学习和掌握TeeChart的重要工具。手册提供了详细的步骤和示例来演示如何使用TeeChart创建各种图表,并通过解释图表属性和方法的含义,帮助用户理解和熟悉TeeChart的开发方式。同时,手册还可以作为参考手册,当用户遇到问题时可以快速查找相关内容。 总之,TeeChart使用手册对于学习和使用TeeChart图表控件非常有帮助。通过仔细阅读手册,用户可以更加高效地使用TeeChart,提升数据可视化的效果和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值