TeeChart绘图控件 开发技术


C++ GUI 绘图控件目录

MFC

Qt



TeeChart是个很强大的控件,其绘图能力之强,其他控件难以比拟,但是有个问题就是他的绘图速度,其实TeeChart绘图速度还是很快的,只是大家一直都没正确运用其功能所以导致绘图速度慢的假象。

下面说说影响绘图速度的两个主要因素

1、通过显示效果提升速度

也就是当点数特别多时不需要绘出全部点(性能提升不大)

TeeChart绘图控件 - 之一文章里已经讲过,可以设置只绘出部分点。设置方法如图:

这个选项能一定程度的提升画图速度。提升多少,可看看如下实例:

163840个随机点,取消Draw All时效果,使用AddXY函数,耗时1092毫秒

163840个随机点,取消Draw All时效果,使用AddXY函数,耗时1217毫秒

可见这个效果并不明显,但是显示效果却很明显

2.通过画图函数来改变画图速度

TeeChart的AddXY函数时画图最慢的函数,但是却好多人使用,可能是简单的原因吧,我专门做了一个程序来测试AddXY和AddArray函数的效率,发现效率几乎差30倍

2.1AddXY函数:

AddXY 函数每次调用都要刷新,所以画图速率相当低

如上图所示的界面画图(AddXY)按钮实现如下

randf是一个产生随机数的函数实现见源文件,

m_nPointNum是何文本编辑框关联的int型数据

IDC_STATIC_T是文本标签的ID

[cpp] view plain copy 

  1. void CTeeChartDlg::OnBnClickedButtondraw()
  2. {
  3. CSeries ChartSpeed = (CSeries)m_Chart.Series(0);
  4. UpdateData(TRUE);
  5. if (m_nPointNum<=0)
  6. {
  7. MessageBox(_T("数据点数不能小于0"));
  8. return;
  9. }
  10. DWORD dwTimeS,dwTimeE;
  11. CString str(_T(""));
  12. unsigned i(0);
  13. double* pDataX= NULL;
  14. double* pDataY= NULL;
  15. //分配内存
  16. pDataX = newdouble[m_nPointNum];
  17. pDataY = newdouble[m_nPointNum];
  18. for (i=0;i<(unsigned)m_nPointNum;i++)
  19. {
  20. pDataY[i] = randf(-20,20);
  21. pDataX[i] = i;
  22. }
  23. //由于需要计算时间,画图就不在第一个for循环里实现了
  24. dwTimeS = GetTickCount();
  25. ChartSpeed.Clear();
  26. for(i=0;i<(unsigned)m_nPointNum;i++)
  27. {
  28. ChartSpeed.AddXY(pDataX[i],pDataY[i],NULL,0);
  29. }
  30. dwTimeE = GetTickCount();
  31. dwTimeE -= dwTimeS;
  32. if (pDataX)
  33. {
  34. delete[] pDataX;
  35. }
  36. if (pDataY)
  37. {
  38. delete[] pDataY;
  39. }
  40. str.Format(_T("耗时:%d ms"),dwTimeE);
  41. SetDlgItemText(IDC_STATIC_T,str);
  42. }

[cpp] view plain copy 

  1. for(i=0;i<(unsigned)m_nPointNum;i++)
  2. {
  3. ChartSpeed.AddXY(pDataX[i],pDataY[i],NULL,0);
  4. }

上下加了两个计时,专门计算画图时间

程序运行时间如图:1638400个点居然花了差不多6秒

2.2 AddArray函数-真正实现快速画图函数

为了验证AddArray的快速性,

添加了一个按钮:

按钮依然实现画图,不过是用AddArray函数

利用COleSafeArray 实现数据存储

实现代码如下:

[cpp] view plain copy 

  1. void CTeeChartDlg::OnBnClickedButtondraw2()
  2. {
  3. CSeries ChartSpeed = (CSeries)m_Chart.Series(0);
  4. UpdateData(TRUE);
  5. if (m_nPointNum<=0)
  6. {
  7. MessageBox(_T("数据点数不能小于0"));
  8. return;
  9. }
  10. DWORD dwTimeS,dwTimeE;
  11. CString str(_T(""));
  12. long i(0);
  13. double val;
  14. COleSafeArray XValues;
  15. COleSafeArray YValues;
  16. DWORD pNumElements[] = {m_nPointNum};
  17. XValues.Create(VT_R8, 1, pNumElements);
  18. YValues.Create(VT_R8, 1, pNumElements);
  19. for(i=0; i<m_nPointNum; i++)
  20. {
  21. val = i;
  22. XValues.PutElement(&i, &val);
  23. val = randf(-20,20);
  24. YValues.PutElement(&i, &val);
  25. };
  26. //由于需要计算时间,画图就不在第一个for循环里实现了
  27. dwTimeS = GetTickCount();
  28. ChartSpeed.Clear();
  29. ChartSpeed.AddArray(m_nPointNum,YValues,XValues);
  30. dwTimeE = GetTickCount();
  31. dwTimeE -= dwTimeS;
  32. str.Format(_T("耗时:%d ms"),dwTimeE);
  33. SetDlgItemText(IDC_STATIC_T,str);
  34. }

效果如何?

看图

快30倍,1638400个点瞬间完成

一般我们的数据经常是用double数组保存的,很少用COleSafeArray所以,为了方便,可以写一个函数方便画图

如下:

[cpp] view plain copy 

  1. void DrawLine(double* pX,double* pY,long nNum)
  2. {
  3. COleSafeArray XValues;
  4. COleSafeArray YValues;
  5. long i(0);
  6. DWORD wLength = nNum;
  7. XValues.Create(VT_R8, 1, &wLength);
  8. YValues.Create(VT_R8, 1, &wLength);
  9. for(i=0; i<nNum; i++)
  10. {
  11. XValues.PutElement(&i, pX+i);
  12. YValues.PutElement(&i, pY+i);
  13. }
  14. CSeries Chart = (CSeries)m_Chart.Series(0);
  15. Chart.Clear();
  16. Chart.AddArray(nNum,YValues,XValues);
  17. }

调用时只要把数组的首地址和长度传进去就行了。

TeeChart绘图控件破解版:http://download.csdn.net/detail/czyt1988/4201107

工程示例代码:http://download.csdn.net/detail/czyt1988/4201505


C++ GUI 绘图控件目录

MFC

Qt

时间: 2024-08-09 23:53:38

TeeChart绘图控件 开发技术的相关文章

怎样在VS2013/MFC中使用TeeChart绘图控件

TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在VS2013中如何创建MFC项目. 工具/原料 Visual studio 2013 TeeChart.pro.v5.ActiveX 方法/步骤 1 在网上下载TeeChart控件并安装,安装自然不用多说,安装完后找到安装路径(带有TeeChart5.ocx文件),复制当前路径 2 安装完后需要对控件

paper 139:qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发.但许多时候,qwt的安装配置难到了许多人,我曾经也在这里原地踏步很久,为了给大家开发方便,把我的安装经验分享给大家,避免

QT绘图技术(二)QCustomPlot - 超强超小巧的qt绘图控件

QCustomPlot - 超强超小巧的qt绘图控件 2016-10-22 16:03:25|  分类: QT| 官方网站:http://www.qcustomplot.com/ 1.0下载地址:http://download.csdn.net/detail/czyt1988/5986701 下载LOFTER我的照片书  | QCustomPlot 超强超小巧的qt绘图控件,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp即可使用,远比qwt方便,若只

qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发.但许多时候,qwt的安装配置难到了许多人,我曾经也在这里原地踏步很久,为了给大家开发方便,把我的安装经验分享给大家,避免

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

原文:利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <安装目录>\DeveloperKit\Samples\Developer_Guide_Scenarios\ ArcGIS_Engine\Building_an_ArcGIS_Control_Application\Map_Viewer 注:ArcGIS样

Essential Diagram for Windows Forms绘图控件图解及下载地址

Essential Diagram for Windows Forms是一款可扩展的.高性能的.NET平台下的绘图控件,可用于开发像Microsoft Visio一样的交互式地绘图和图解应用程序,在节点存储图形对象,支持矢量和光栅图形. 具体功能: 支持多种导出格式:如位图.增强的元文件.SVG文件格式 控件采用清晰的MVC设计,把数据层.表现层和用户层分离 子节点属性可以从父节点继承,开发人员可以应用属性值到一个节点或所有子节点 支持在运行时添加自定义属性 多种线条节点和连接器,支持多种连接线

C#自定义工业控件开发

转自阿凡卢原文C#自定义工业控件开发 由于工作需要,调研过一段时间的工业控制方面的"组态软件"(SCADA)的开发,组态软件常用于自动化工业控制领域,其中包括实时数据采集.数据储存.设备控制和数据展现等功能.其中工控组件的界面展现的实现类似于Windows系统下的各种开发控件,通过各种控件的组装,和硬件协议的集成,就可以实现对相应设备的控制和实时状态的显示. 每个对应的硬件UI展示都可以用一个自定义控件来实现,如下图的一个温度计,就可以使用UserControl来实现. using S

【转载】基于MFC的ActiveX控件开发(1)

原文:http://iysm.net/?p=114 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一种是直接用COM的API来开发,这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的:一种是基于传统的MFC,采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能.MFC为广大VC程序员所熟悉,易于上手学习,但缺点是MFC封装的东西比较

VS2010 使用TeeChart画图控件 - 之二 - 绘制图形(折线图,柱状图)

1.前期准备 详细可见VS2010 使用TeeChart画图控件 - 之中的一个 控件和类的导入 1. 1 加入TeeChart控件,给控件加入变量m_TeeChart 加入TeeChart控件,右击控件,选择加入变量,vs会自己主动给我们引入CTchart1这个类,可是仅仅有这个类,我们是远远不够的,须要加入teechart其它相关的类,加入方法在之前已经讲过,不再反复. 1.2. 引入必要的头文件 事实上之前的方法比較麻烦,更简单就是通过类向导,导入类型库的类 如图进入类向导,选择加入类bu