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.dll

TeeChart8.ocx

TeeChart.WPF.dll

>16000(带端点)




<16000(带端点)




任意数量(不带端点)




  • TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll流畅绘制的数据量范围

绘制方式

TeeChart.dll

TeeChart8.ocx

TeeChart.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界面存在字体模糊,缺失,被遮挡的情况。

temp chart temp chart说明书_temp chart

  • 优点:
  • 在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时,在运行程序时会出现异常。**
  • temp chart temp chart说明书_图表_02

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

temp chart temp chart说明书_图表_03

  • 在图表种类上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 — 桌面,如下图:

temp chart temp chart说明书_图表_04

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

temp chart temp chart说明书_c#_05

返回顶部

2.2 添加TeeChart.dll

  • 选择窗口左上角(根据每个人Visual studio设置不同而位置不同)的工具箱。
  • 在工具栏中任意处点击鼠标右键,选择添加选项卡

temp chart temp chart说明书_window_06

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

temp chart temp chart说明书_图表_07

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

temp chart temp chart说明书_c#_08

temp chart temp chart说明书_temp chart_09

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

temp chart temp chart说明书_temp chart_10

返回顶部

2.3. 基本参数设置

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

temp chart temp chart说明书_window_11

temp chart temp chart说明书_TeeChart_12

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

temp chart temp chart说明书_temp chart_13

  • 进入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 代码实现效果

temp chart temp chart说明书_图表_14

temp chart temp chart说明书_c#_15

返回顶部

2.3.3 图像界面设置
  • 从工具栏找到刚添加的TChart,使用鼠标左键拖入设计窗口。
  • 鼠标左键选中添加的TChart,按R键进入属性栏,找到布局 –> Dock,设置为fill
  • 鼠标右键点击添加的TChart,选择属性。

temp chart temp chart说明书_temp chart_16

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

temp chart temp chart说明书_window_17

  • 基本设置步骤
  • 选择表的种类、样式:Chart –> Series –> Add.

temp chart temp chart说明书_图表_18

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

temp chart temp chart说明书_temp chart_19

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

temp chart temp chart说明书_图表_20

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

temp chart temp chart说明书_window_21

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

temp chart temp chart说明书_TeeChart_22

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

temp chart temp chart说明书_图表_23

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

temp chart temp chart说明书_window_24

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

temp chart temp chart说明书_图表_25

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

temp chart temp chart说明书_temp chart_26

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

temp chart temp chart说明书_temp chart_27

  • 选择Mark Tips –> Add.

temp chart temp chart说明书_temp chart_28

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

temp chart temp chart说明书_TeeChart_29

  • 窗口左下角出现marksTip1

temp chart temp chart说明书_temp chart_30

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

temp chart temp chart说明书_window_31

  • 添加数据:进入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 界面设置实现效果

temp chart temp chart说明书_temp chart_32

返回顶部

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

3.1 创建工程

  • 打开Visual studio,将选项栏设置为C# — windows — 桌面。
  • 选择Windows窗体应用(.NET Framework),然后点击下一步,设置好项目名称和位置,点击创建
  • 需要注意的时这里的框架不能低于**.NET Framework 4.5**,否则使用TeeChart8.ocx时会报错。

temp chart temp chart说明书_图表_33

返回顶部

3.2 添加TeeChart8.ocx

  • 选择窗口左上角(根据每个人Visual studio设置不同而位置不同)的工具箱。
  • 在工具栏中任意处点击鼠标右键,选择添加选项卡
  • 设置好选项卡名字后,在新建的选项卡上点击鼠标右键,点击选择项
  • 进入选择工具项后,选择COM组件,找到并勾选TeeeChart Pro Activex control v8,再点击确定。
  • 这样新建的选项卡中就添加进了Teechart。

返回顶部

3.3. 基本参数设置

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

temp chart temp chart说明书_c#_34

  • 鼠标左键选中添加的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 代码实现效果

temp chart temp chart说明书_图表_35

temp chart temp chart说明书_temp chart_36

返回顶部

3.3.3 图像界面设置
  • 从工具栏找到刚添加的axTChart1,使用鼠标左键拖入设计窗口。
  • 鼠标左键选中添加的axTChart1,按R键进入属性栏,找到布局 –> Dock,设置为fill
  • 鼠标右键点击添加的axTChart1,选择属性。
  • 会进入到如图所示窗口,点击**Edit Chart…**开始编辑图表。
  • 进入编辑栏后如图所示,窗口左侧时选项卡主要有Series、Chart、Data、Tools、Export、Print、Themes几部分组成,窗口中部及右侧是点击选项卡后相应的设置区域。

temp chart temp chart说明书_TeeChart_37

  • 基本设置步骤。
  • 选择表的种类、样式: Series –> Add.
  • 选择这里取消勾选左下角 view 3D,选择3D分类 –> point 3D,点击OK。

temp chart temp chart说明书_temp chart_38

  • axTChart1会变成所选的图表样式。
  • 设置图表标题: Chart –> General –> Fonts –> Font
  • 窗口中部选项栏选择 Title ,可再 Font设置图表标题的字体大小、字体类型、字体颜色等。

temp chart temp chart说明书_图表_39

  • 设置坐标轴刻度:Axis –> Scales
  • Minimum –> Change :设置坐标轴刻度最小取值范围。
  • Maximum –> Change:设置坐标轴刻度最大取值范围。
  • Increment –> Change:设置坐标轴刻度增量。
  • Axis –> Labels–> Text–> Font 可设置坐标轴刻度的字体类型、字体大小、字体颜色等。
  • 设置坐标轴标题:Axis –> Title –> style
  • Style –> Title 里输入标题内容。
  • 可选择标题的位置:Left Axis、Right Axis等。
  • Angle 设置标题的旋转角度。
  • Size设置标题区域大小。
  • Visible设置是否显示标题。

temp chart temp chart说明书_TeeChart_40

  • Axis –> Title –> Format –> Text –> Font 可设置坐标轴标题的字体类型、字体大小、字体颜色等。
  • 设置线条:Series0 –> Format
  • color:设置端点颜色。
  • Color Each :使用任意颜色。
  • Line … :设置线条颜色、样式、大小等。

temp chart temp chart说明书_window_41

  • 设置端点:Series0 –> Point
  • 设置端点样式、大小等。

temp chart temp chart说明书_temp chart_42

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

temp chart temp chart说明书_temp chart_43

  • 设置标记提示
  • 添加工具: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 界面设置实现效果

temp chart temp chart说明书_temp chart_44

返回顶部

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 代码实现效果

temp chart temp chart说明书_window_45

返回顶部

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 毫秒

temp chart temp chart说明书_temp chart_46

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

消耗:122 毫秒

  • 显示前:00:10:586
    显示后:00:10:711
    消耗:125 毫秒
  • 显示前:00:10:711
    显示后:00:10:832
    消耗:121 毫秒

temp chart temp chart说明书_TeeChart_47

  • 测试条件3: 同时显示两路数据、每路5000个数据点,共10000个数据点(带端点)。
  • 显示前:04:39:917
    显示后:04:40:123
    消耗:206 毫秒
  • 显示前:04:40:123
    显示后:04:40:338
    消耗:215 毫秒
  • 显示前:04:40:338
    显示后:04:40:545
    消耗:207 毫秒

temp chart temp chart说明书_temp chart_48

  • 测试条件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,找到函数实现位置。

temp chart temp chart说明书_window_49

temp chart temp chart说明书_图表_50

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