VS2010使用TeeChart绘图控件_第1页
VS2010使用TeeChart绘图控件_第2页
VS2010使用TeeChart绘图控件_第3页
VS2010使用TeeChart绘图控件_第4页
VS2010使用TeeChart绘图控件_第5页
已阅读5页,还剩36页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VS2010使用TeeChart绘图控件-之一-控件和类的导入vs2010的用法和vc6有很大的不同,特别是在一些函数调用那里,当然。控件导入也是很不一样的安装好控件后就可以在工程里加入teechart控件了加入方法有如下几种:1.添加Teechart控件1.1插入Teechart控件1.1.1插入控件新建一个对话框工程,在对话框上点击鼠标右键,弹出的菜单里选择“插入ActiveX控件”然后弹出的对话框里选择TeeChart控件这时对话框就有TeeChart控件了1.1.2vs2010另外一种插入控件的方法在打开的对话框中选择选择com标签,选择teechart控件这样teechart控件就会在你的工具栏新加的选项里了,以后都会存在(我添加TeeChat的同时还把其他的一些控件添加进去了)1.1.3控件属性设置双击控件进行相关设置这里添加一个快速线图-FastLine若数据量特别大,可以在Series标签里的Format的Drawall选项去掉在Chart标签里还可以设置坐标轴的名称属性等,这里先不详细讲述属性的设置2.为控件添加类

vs2010与vc6不一样,vs2010的控件对应的类添加相对比vc6麻烦这里就对刚刚加入的TeeChart控件加入相关的类

2.1添加TypeLib的mfc类(1)选择vs菜单“项目”-“添加类”(注意这时类视图树形控件选中最顶端的父节点)(2)添加TypeLib的mfc类(3)在可用的类型库里选择teechart5(4)在接口里就有TeeChart对应的所有类了,这里TChart是必须的接口,其他的可以根据需要添加(5)点击完成就把CTChart这个类添加进工程里了其实第(2)步可以选择ActiveX控件的Mfc类,操作方法雷同,不过这时是只列出对应的接口3.把TeeChart控件和对象关联3.1为控件关联对象在控件上点击右键,选择添加变量,即可为控件关联对象

3.2去掉vs默认的初始化

不知为何vs会默认给添加的变量初始化0,这个初始化一定要去掉否则无法使用public:

CTchart1m_Chart;

CTeeChartDlg::CTeeChartDlg(CWnd*

pParent/*=NULL*/)

:

CDialogEx(CTeeChartDlg::IDD,pParent)

{

m_hIcon

=

AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void

CTeeChartDlg::DoDataExchange(CDataExchange*

pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX,IDC_TCHART1,m_Chart);

}

这时TeeChart就可正常使用了

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

1.前期准备

具体可见VS2010使用TeeChart绘图控件-之一

控件和类的导入1.1添加TeeChart控件,给控件添加变量m_TeeChart

添加TeeChart控件,右击控件,选择添加变量,vs会自动给我们引入CTchart1这个类,但是只有这个类,我们是远远不够的,需要添加teechart其他相关的类,添加方法在之前已经讲过,不再重复。1.2.引入必要的头文件其实之前的方法比较麻烦,更简单就是通过类向导,导入类型库的类如图进入类向导,选择添加类按钮的下拉菜单,选择类型库中的MFC类选择teechart5即可暂时引入

#include"CSeries.h"

#include"CAxis.h"

#include"CAxes.h"

#include"CLegend.h"需要还可以继续在之后引入--------------------------------------------------------------------------------------------------------------------------------2.teechart画图-折线图TeeChart画图步骤一般是先获得图线序列CSeries,再给Series添加点;添加点可以用函数AddXY,或者AddArray。AddArray要比AddXY的效率高出很多,其比较可见TeeChart绘图控件-之三-提高绘图的效率2.1清除图形在画线之前把图形清除一下,否则会覆盖,清除可用CSeries的函数Clear();

但是当添加多个Series后要对所有Series都clear,这是很蛋疼的,因为你有时都不知道有多少个Series,这样可以先获得Series的总数在clear

代码如下

for(long

i

=

0;i<m_TeeChart.get_SeriesCount();i++)

{

((CSeries)m_TeeChart.Series(i)).Clear();

}

通过CTchart的get_SeriesCount函数获得所有图像序列,再全部清除,这个函数经常用到,可用定义为类成员函数,这里是个对话框CTChartDlg

void

CTChartDlg::ClearAllSeries(void)

{

for(long

i

=

0;i<m_TeeChart.get_SeriesCount();i++)

{

((CSeries)m_TeeChart.Series(i)).Clear();

}

}

好了现在开始说说怎么画折线图2.2普通连线图一般我们画的图都属于这种,就是把点连接起来,选择fastline的Normal,就是普通连线图

在需要画图的地方先要获得曲线序列Series,然后通过画图函数AddXY,或者AddArray作图。2.2.1普通线图-AddXY下面演示AddXY的方法AddXY就是一个一个加入点,在点数不多,且需要动态显示的时候是不错的选择。点数多的情况下嘛,那就还是用AddArray了先看看AddXY

const

UINT

nDATALENGTH=

100;

double

dData[nDATALENGTH];

for

(int

i=0;i<nDATALENGTH;i++)

{

dData[i]

=

100*sin((float)i)*cos((float)4*i);

}

//ClearAllSeries();

CSerieslineSeries

=

(CSeries)m_TeeChart.Series(0);

lineSeries.Clear();//在最前面加上ClearAllSeries(ClearAllSeries是自己写的函数)就不用了

for(int

i=0;i<nDATALENGTH;i++)

{

lineSeries.AddXY((double)i,dData[i],NULL,0);

}由于在TeeChart里,只加了一个FastLine,所以Series(0)就算FastLine,代码首先获得图像序列m_TeeChart.Series(0);然后再调用这个序列来作图,作图前先清空图像,用ClearAllSeries()也可以然后就是一个点一个点的往里加了做出来的效果:AddXY的第一个参数是x点坐标,第二个是y点坐标,第三个参数是为了使x坐标特殊显示,这是会替换掉x坐标的显示内容,如我想显示“点xx“可以这样

CString

str;

for(int

i=0;i<nDATALENGTH;i++)

{

str.Format(_T("点%d"),i);

lineSeries.AddXY((double)i,dData[i],str,0);

}

第四个参数在线图里不起作用,在柱状图里可以设置颜色2.2.2普通线图-AddArray

在数据量特别大时,强烈建议使用AddArray函数AddArray的函数声明如下voidAddArray(longArraySize,VARIANT&YArray,VARIANT&XArray);x,y是两个VARIANT的数据类型,VARIANT有个类型是VT_ARRAY可以给VARIANT赋一个数组进去具体操作如下:方法1:

const

UINT

nDATALENGTH

=

100;

double

dData[nDATALENGTH];

for

(int

i=0;i<nDATALENGTH;i++)

{

dData[i]

=

100*sin((float)i)*cos((float)4*i);

}

//声明如下数据:

VARIANTvAX,vAY;

SAFEARRAY*

psax;

SAFEARRAY*

psay;

SAFEARRAYBOUNDrgsabound;

//初始化

rgsabound.cElements=nDATALENGTH;

rgsabound.lLbound=0;

psax=SafeArrayCreate(VT_R8,1,&rgsabound);//分配空间

psay=SafeArrayCreate(VT_R8,1,&rgsabound);

vAX.vt=VT_ARRAY|VT_R8;//设置为double型数组,VT_R8就是指double

vAX.parray=psax;//把内容加入VARIANT中

vAY.vt=VT_ARRAY|VT_R8;

vAY.parray=psay;

//这时VARIANT就可以加入数据了

double

dtemp;//用来临时存放x坐标

for(long

i=0;i<nDATALENGTH;i++)

{

dtemp

=

i;

SafeArrayPutElement(psax,&i,&dtemp);

dtemp

=

dData[i];

SafeArrayPutElement(psay,&i,&dtemp);

//更简单写法

//SafeArrayPutElement(psay,&i,dData+i);

}

//开始画图

CSerieslineSeries

=

(CSeries)m_TeeChart.Series(0);

lineSeries.Clear();

lineSeries.AddArray(nDATALENGTH,vAY,vAX);

方法2:这时我看TeeChart官方实例找到的方法,相对简单点

COleSafeArrayXValues;

COleSafeArrayYValues;

DWORD

numElements[]

=

{nDATALENGTH};

//创建安全数组

XValues.Create(VT_R8,

1,numElements);

YValues.Create(VT_R8,

1,numElements);

//初始化

long

i;

double

dval;

for(i=0;i<nDATALENGTH;i++)

{

dval

=

i;

XValues.PutElement(&i,

&dval);

dval

=

dData[i];

YValues.PutElement(&i,

&dval);

//YValues.PutElement(&i,dData+i);

};

CSerieslineSeries

=

(CSeries)m_TeeChart.Series(0);

lineSeries.Clear();

lineSeries.AddArray(nDATALENGTH,YValues,XValues);

2.3去除/显示legend如果不想要右边那一栏数据显示,可以通过代码去除CLegend是用来控制这个显示的

CLegendlegend

=

(CLegend)m_TeeChart.get_Legend();

legend.put_Visible(FALSE);

可以用一个check控件控制器显示状态添加单选控件

,id为IDC_CHECK_ShowLegend,单击响应void

CTChartDlg::OnBnClickedCheck_ShowLegend()

{

CLegendlegend

=

(CLegend)m_TeeChart.get_Legend();

if(BST_CHECKED

==

((CButton*)GetDlgItem(IDC_CHECK_ShowLegend))->GetCheck())

{

legend.put_Visible(TRUE);

}

else

{

legend.put_Visible(FALSE);

}

}

效果:不用代码的话可以通过设置控件属性明显,这没有代码灵活

2.4改变线图颜色

默认设置是红,我要设置成其他颜色可以用put_Colour

如上代码的lineSeries最后加一个,就会变成RGB(255,0,255)的颜色了

lineSeries.put_Color(RGB(255,0,255));

效果:3.teechart画图-

柱状图

3.1

添加柱状图这时会多一个图形注意这里默认是绿色的,等下会发现画出来的不一样3.2AddXY

方法和线图没什么区别,直接上码:

const

UINT

nDATALENGTH

=

20;

double

dData[nDATALENGTH];

for

(int

i=0;i<nDATALENGTH;i++)

{

dData[i]

=

abs(100*sin((float)i));

}

//

ClearAllSeries();

CSeriesbarSeries

=

(CSeries)m_TeeChart.Series(1);

for(int

i=0;i<nDATALENGTH;i++)

{

barSeries.AddXY((double)i,dData[i],NULL,0);

}

注意不是Series(0)了我擦~那效果

加个abs,好看很多~~3.3改变柱状图的颜色

为啥是黑色的?设置了绿色的,我一开始也以为坑爹的设置没有用,后来研究了一下发现时AddXY的第四个参数起作用的

上面的图我们是这样加的barSeries.AddXY((double)i,dData[i],NULL,0);

第四个参数0就相当于RGB(0,0,0),这第四个参数就是设置颜色的了

把程序稍作修改

for(int

i=0;i<nDATALENGTH;i++)

{

i%2==

0

?

barSeries.AddXY((double)i,dData[i],NULL,RGB(255,255,0))

:

barSeries.AddXY((double)i,dData[i],NULL,RGB(0,255,255));

}牛x3.4去除/显示数据标示

好吧又遇到问题了,去掉上面的标示ok,那个标示是用CMarks管理的,加入这个类就行了,用类向导,加入CMarks#include"CMarks.h"添加单选控件

IDC_CHECK_Marks

void

CTChartDlg::OnBnClickedCheckMarks()

{

CSeriesbarSeries

=

(CSeries)m_TeeChart.Series(1);

CMarksSeriesMarks

=

(CMarks)barSeries.get_Marks();

if(BST_CHECKED

==

((CButton*)GetDlgItem(IDC_CHECK_Marks))->GetCheck())

{

SeriesMarks.put_Visible(TRUE);

}

else

{

SeriesMarks.put_Visible(FALSE);

}

}

效果:3.5AddArray给柱状图添加数据和line一样

const

UINT

nDATALENGTH

=

20;

double

dData[nDATALENGTH];

for

(int

i=0;i<nDATALENGTH;i++)

{

dData[i]

=

abs(100*sin((float)i));

}

COleSafeArrayXValues;

COleSafeArrayYValues;

DWORD

numElements[]

=

{nDATALENGTH};

//创建安全数组

XValues.Create(VT_R8,

1,numElements);

YValues.Create(VT_R8,

1,numElements);

//初始化

long

i;

double

dval;

for(i=0;i<nDATALENGTH;i++)

{

dval

=

i;

XValues.PutElement(&i,

&dval);

dval

=

dData[i];

YValues.PutElement(&i,

&dval);

//YValues.PutElement(&i,dData+i);

};

//

ClearAllSeries();

CSerieslineSeries

=

(CSeries)m_TeeChart.Series(1);

lineSeries.AddArray(nDATALENGTH,YValues,XValues);

这时出现的图像就是默认的颜色了想改颜色!没问题,还是用put_Color

barSeries.put_Color(RGB(255,0,0));TeeChart绘图控件-之三-提高绘图的效率TeeChart是个很强大的控件,其绘图能力之强,其他控件难以比拟,但是有个问题就是他的绘图速度,其实TeeChart绘图速度还是很快的,只是大家一直都没正确运用其功能所以导致绘图速度慢的假象。下面说说影响绘图速度的两个主要因素1、当点数特别多时不需要绘出全部点(性能提升不大)TeeChart绘图控件-之一文章里已经讲过,可以设置只绘出部分点。设置方法如图:这个选项能一定程度的提升画图速度。提升多少,可看看如下实例:163840个随机点,取消DrawAll时效果,使用AddXY函数,耗时1092毫秒163840个随机点,取消DrawAll时效果,使用AddXY函数,耗时1217毫秒可见这个效果并不明显,但是显示效果却很明显2.通过画图函数来改变画图速度TeeChart的AddXY函数时画图最慢的函数,但是却好多人使用,可能是简单的原因吧,我专门做了一个程序来测试AddXY和AddArray函数的效率,发现效率几乎差30倍2.1AddXY函数:AddXY函数每次调用都要刷新,所以画图速率相当低如上图所示的界面画图(AddXY)按钮实现如下randf是一个产生随机数的函数实现见源文件,m_nPointNum是何文本编辑框关联的int型数据IDC_STATIC_T是文本标签的IDvoid

CTeeChartDlg::OnBnClickedButtondraw()

{

CSeriesChartSpeed

=

(CSeries)m_Chart.Series(0);

UpdateData(TRUE);

if

(m_nPointNum<=0)

{

MessageBox(_T("数据点数不能小于0"));

return;

}

DWORD

dwTimeS,dwTimeE;

CString

str(_T(""));

unsigned

i(0);

double*

pDataX=

NULL;

double*

pDataY=

NULL;

//分配内存

pDataX

=

newdouble[m_nPointNum];

pDataY

=

newdouble[m_nPointNum];

for

(i=0;i<(unsigned)m_nPointNum;i++)

{

pDataY[i]

=

randf(-20,20);

pDataX[i]

=

i;

}

//由于需要计算时间,画图就不在第一个for循环里实现了

dwTimeS

=

GetTickCount();

ChartSpeed.Clear();

for(i=0;i<(unsigned)m_nPointNum;i++)

{

ChartSpeed.AddXY(pDataX[i],pDataY[i],NULL,0);

}

dwTimeE

=

GetTickCount();

dwTimeE

-=

dwTimeS;

if

(pDataX)

{

delete[]pDataX;

}

if

(pDataY)

{

delete[]pDataY;

}

str.Format(_T("耗时:%dms"),dwTimeE);

SetDlgItemText(IDC_STATIC_T,str);

}在

for(i=0;i<(unsigned)m_nPointNum;i++)

{

ChartSpeed.AddXY(pDataX[i],pDataY[i],NULL,0);

}上下加了两个计时,专门计算画图时间程序运行时间如图:1638400个点居然花了差不多6秒2.2AddArray函数-真正实现快速画图函数为了验证AddArray的快速性,添加了一个按钮:按钮依然实现画图,不过是用AddArray函数利用COleSafeArray实现数据存储实现代码如下:void

CTeeChartDlg::OnBnClickedButtondraw2()

{

CSeriesChartSpeed

=

(CSeries)m_Chart.Series(0);

UpdateData(TRUE);

if

(m_nPointNum<=0)

{

MessageBox(_T("数据点数不能小于0"));

return;

}

DWORD

dwTimeS,dwTimeE;

CString

str(_T(""));

long

i(0);

double

val;

COleSafeArrayXValues;

COleSafeArrayYValues;

DWOR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论