VC6 下学习使用Teechart8记录

目录

一 安装和熟悉teechart8

二 绘制实时曲线

三 数据库读取与鼠标选取数据

 

说明:本博文摘自东哥的“VC6 下学习使用Teechart8记录”,欢迎大家前去关注!

一 安装和熟悉teechart8

  上网找了一个teechart8的Activex版本,在VC6下使用正常,感觉功能挺强大的,于是决定认真用一用,我是完全完全的新手,请高手们直接忽略我,或者给我提些好的建议。

  我得到的是一个teechart8.ocx文件,这是Activex的文件,使用之前先注册一下,将该文件放入系统目录下,然后打开命令提示符,或者直接在运行窗口输入:regsvr32 TeeChart8.ocx,然后会有一个注册成功的提示框,说明我们的ActiveX控件注册成功,在VC6下就可以使用了。如果不想使用了,可以使用regsvr32 -u TeeChart8.ocx 解除对teechart8的注册。

  我的第一个任务是熟悉teechart控件。首先新建一个基于MFC的exe工程,选择对话框,其他默认。进入工程以后可以看到类视图中只有系统生成的默认的几个类,我先在类视图中在工程名上点右键新建两个文件夹,一个叫src,一个叫tee,然后把默认生成的几个类(dlg,app,about三个类)拖放到src文件夹中。做这一步实际上没有什么实质的意义,只是为了看起开比较方便,因为一会儿添加了teechart8以后会有很多的类添加进来,看起来非常困难,所以先提前把他们分开。

  闲话不多说,进入资源视图,点击主对话框后,删除todo那个静态文本。下一步我们要在这个对话框上放置一个teechart图表,但是工具栏中没有,所以需要先添加一下。依次点击 工程-》增加到工程-》components and controls,进入对话框后选择registered ActiveX controls,找到TeeChart Pro Activex control v8后点击insert,会弹出添加类的对话框,左边的列表里面是可以选择添加的类,现在我还不太了解具体类的作用,所以只好一并添加了,点击确定以后回到资源视图会发现工具栏下面多累一个圆形的小图标,这就是我们的teechart8控件了。这时注意到,类视图中已经为我们添加了一堆的类,我把他们都放到tee文件夹中,看起来舒服多了。

  下一步回到资源视图,将工具箱中的teechart控件托入对话框,改变一下大小,稍作修改,界面设计就完成了。下一步要让teechart输出一个图形,那这次的任务就大功告成了。在对话框上右键点击图标控件,点击属性,选择teechart pro editer 选项卡,点击edit chart ,出现一个名为edit的对话框,该对话框非常重要,包括了teechart的各种属性。简要介绍一下这些属性,我的参考资料是“TEECHART应用技术详解”一书,该书是通过delphi描述的,我没有学过delphi,勉强看着。首先就是series选项,该属性包含的是需要绘制的图表的类型,如曲线,饼图,柱状图,等等等等,种类很多,这也是teechart的优势。其次是chart,这个选项包含了图表的显示部分的很多属性,如坐标轴,背景,标题,等等。data选项中就是绘制图表需要的数据。export选项中包含了一些将图表导出为图片等格式的选项。print选项包含打印的设置。themes包含图表的主题,主要是显示方式。

  介绍完这写选项以后,试着新建了一个serie,我建立的是fast line,准备做一个实时曲线的显示,于是又更改了一下标题,改为实时曲线,并将chart选项中的legend的Visible前面的勾去掉。OK,编译,运行。发现什么都没有~~~别说实时曲线了,就连曲线也没有一根。其实很容易理解,画曲线得有数据吧,数据都没有怎么给你画呢?所以,还得给该曲线填充一点数据。最简单的方法就是,直接在data选项中添加一些数据,然后运行,发现我们可爱的图表显示出曲线了。

  好,熟悉teechart的基本任务完成。下一次我接着在这个基础上试着绘制实时曲线。

 

二 绘制实时曲线

  接着上一篇文章,本次我的任务是绘制一个实时曲线图,可以实现坐标轴以及曲线随着数据的增加而移动。

  要完成该功能,首先应该为该图表指定一个对象用于操作。单击图表,选择 建立类向导,点击member variables选项卡,点击add variable按钮,弹出添加变量对话框,输入m_chart后点击OK,一个与该图表控件对应的控件变量就建立完成了。进入类视图,看到dlg类中多了一个m_chart变量。

  首先,我们利用该变量为该图表填充随机的初始数据。在使用之前,需要包含一些头文件,于是,在XXXDlg.cpp的上面添加如下代码:

1 #include "tchart.h"
2 #include "axis.h"
3 #include "axes.h"
4 #include "scroll.h"
5 #include "series.h"
View Code

  然后在OnInitDialog()方法中添加如下代码:

1 // TODO: Add extra initialization here
2 m_chart.Series(0).FillSampleValues(50);
View Code

  这是点击运行以后,就可以看到图表控件上输出了50个点连成的曲线了。如下图所示

  下一步我们要做的是让曲线动起来。简单分析一下,要让曲线动起来,可以将左侧的点隐藏,右侧再增加一些新的点。我们可以设置一个定时器,比如1s,每隔1s增加一个数,这样的话数据就可以不断增长了。

  即添加如下代码:

1 //在OnInitDialog()中添加
2 SetTimer(1,1000,NULL);
View Code

  然后为dlg类添加WM_TIMER的消息响应函数,并添加代码:

1 void CChartDlg::OnTimer(UINT nIDEvent) 
2 {    
3     // TODO: Add your message handler code here and/or call default    
4     m_chart.Series(0).Add(900,"lable",1);    
5     CDialog::OnTimer(nIDEvent);
6 }
View Code

  这里需要说明一下,add方法的三个参数,第一个为y值,我添加的是900,第二个为x轴的标签,第三个我不懂,希望有知道的人告诉我一声,谢谢了。添加完毕后可以运行了,这时大家可以发现曲线在动,横坐标消失,变成了lable,而且左侧的曲线没有移出界面,而是曲线整个压缩,这不是我们想要的效果。所以我们还要再做更改。

  首先进入资源视图,点击对话框,右键单击编辑属性点击tools选项,单击add添加工具。teechart8有很多的工具给我们选择,这里我们点击axis选项卡,选中axis scroll工具后点击add后回到编辑窗,在axis下拉框中选择bottom axis,然后关闭属性编辑即可。

  接下来,需要实现坐标轴的移动。很简单,只需要在OnTimer中添加中间的那一句代码,

1 代码 
2 
3 void CChartDlg::OnTimer(UINT nIDEvent) 
4 {
5     // TODO: Add your message handler code here and/or call default
6     m_chart.Series(0).Add(900,"lable",1);
7     m_chart.GetAxis().GetBottom().Scroll(1.0,TRUE);
8     CDialog::OnTimer(nIDEvent);
9 }
View Code

  完成后运行,基本就可以了。坐标轴和曲线后可以移动了。还有些需要更改的地方,比如横坐标改成时间显示,新增的点不是固定的900,而是随机数。这些都比较简单,读者自行琢磨吧~~~

  本次的任务就基本完成了,下一次想实现从数据库中读取数据进行绘图。

 

三 数据库读取与鼠标选取数据

本次我学习的是在teechart中读取数据库中的数据,同时实现党鼠标在曲线图上移动是有十字线显示,并且能够指示当前指示的数据是多少。实现的效果如下图所示:

QQ截图未命名

如上图所示,红色的曲线数据来自我的sqlserver2000,黑色的十字线交点是我的鼠标,右侧指示posX和posY是鼠标的位置对应的坐标值,x和y只有当鼠标在曲线上时才会显示,表面数据点的坐标。

在Teechart中实现数据库的链接其实是很简单的,可以直接在属性里面更改。我这里没有采用这种简单的方法,我采用的是通过代码自己进行链接。主要用到了ado,该数据库链接技术我在另一篇随笔里面已经讲过了,按照那篇文章的步骤就可以建立连接,说说主要步骤,初始化:AfxOleInit(),导入库:#import,新建超级指针变量,连接,执行查询,获取数据集。

获得数据以后,就是怎样把数据在图表上显示出来。我把该部分的程序写在了绘图按钮响应函数中:

1 if (m_chart.GetSeriesCount()<1) 
2 { 
3     m_chart.AddSeries(6); 
4 } 
5 while (!m_pRecordset->GetadoEOF()) 
6 { 
7     m_chart.Series(0).Add(m_pRecordset->GetCollect("y"),(_bstr_t)m_pRecordset->GetCollect("x"),0); 
8     m_pRecordset->MoveNext(); 
9 }
View Code

 

  代码很简单,简单说明,首先添加一个序列,为防止重复添加,我增加了一个判断。然后一个while循环,只要没有读到数据的末尾就一直读取,我的数据表里面有两个字段,一个是x,一个是y,所以调用serias 0的add函数添加这两个字段的值,一个作为x轴的值,一个作为y轴的值,主要用到的函数就一个,GetCollect函数,该函数是记录集超级指针的函数,作用是取得某字段的数据然后返回,参数就是字段名,返回值为_variant_t类型,由于add函数的第二个参数是LPCTSTR类型,即常量字符串指针类型,所以将_variant_t进行一下强制转换。读取完一个记录以后别忘了将指针下移,即moveNext。

  至此,点击绘图以后就可以显示曲线了。下一步是要实现鼠标移动的时候的十字线绘制以及坐标显示。

  首先添加鼠标移动的消息响应函数,这个可以通过在控件上点击右键,事件,找到onMouseMove消息添加即可,然后添加如下代码:

 1 void CChartADODlg::OnOnMouseMoveTchart1(long Shift, long X, long Y) 
 2 { 
 3     // TODO: Add your control notification handler code here 
 4     m_chart.Repaint(); 
 5     long x1,y1,x2,y2; 
 6     x1 = m_chart.GetAxis().GetLeft().GetPosition(); 
 7     y1 = m_chart.GetAxis().GetTop().GetPosition(); 
 8     x2 = m_chart.GetAxis().GetRight().GetPosition(); 
 9     y2 = m_chart.GetAxis().GetBottom().GetPosition(); 
10     if (X>=x1&&Y>=y1&&X<=x2&&Y<=y2) 
11     { 
12 
13         m_chart.GetCanvas().DrawLine(x1,Y,x2,Y); 
14         m_chart.GetCanvas().DrawLine(X,y1,X,y2); 
15     } 
16 
17     DOUBLE posX,posY; 
18     posX = m_chart.GetAxis().GetBottom().CalcPosPoint(X)+1; 
19     posY = m_chart.GetAxis().GetLeft().CalcPosPoint(Y); 
20     dataX = posX; 
21     dataY = posY; 
22     CString cs; 
23     cs.Format("posX:%f posY:%f\r\n",posX,posY); 
24     TRACE(cs); 
25     SetDlgItemText(IDC_STATIC_X,cs); 
26 }
View Code

上述代码执行时,首先对图表进行重绘,如果不加这一句大家一看就知道会发生什么效果。

后面保存图表绘图区的四个坐标,然后当鼠标在图表的绘图区域以内时,绘制两条交叉的线,利用DrawLine函数。接下来是显示在静态文本框中,文本框中显示的应该是数据区的坐标值,而不是鼠标的屏幕坐标值,所以应该进行一下转化,用到的函数是CalPosPoint函数,至于为什么计算x坐标要在后面加1我也不太清楚,就是在做的过程中发现需要加1才能对,比较诡异。

后面的代码就是显示了,不用赘述。

另外,当鼠标指针指向曲线时得显示当前的数据值,很简单,只需要添加一个消息响应函数,OnMouseEnterSeries即可

 1 void CChartADODlg::OnOnMouseEnterSeriesTchart1(long SeriesIndex) 
 2 { 
 3     // TODO: Add your control notification handler code here 
 4     if (SeriesIndex==0) 
 5     { 
 6         CString cs; 
 7         cs.Format("x:%f y:%f",dataX,dataY); 
 8         SetDlgItemText(IDC_STATIC_Y,cs); 
 9     } 
10 }
View Code

其中用到的dataX和dataY其实就是onMouseMove中计算出来的。当鼠标离开曲线时要把显示清空,所以再添加一个响应函数:

1 void CChartADODlg::OnOnMouseLeaveSeriesTchart1(long SeriesIndex) 
2 { 
3     // TODO: Add your control notification handler code here 
4     SetDlgItemText(IDC_STATIC_Y,""); 
5 }
View Code

至此,今天的任务就完成了~~~

 

 

转载于:https://www.cnblogs.com/taiping6365/archive/2013/06/09/3129321.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值