现在的位置: 首页 > 综合 > 正文

略谈teechart

2017年11月29日 ⁄ 综合 ⁄ 共 2275字 ⁄ 字号 评论关闭

VC,BCB下的曲线图形显示可以自己编写代码,主要是GDI(+)的WinAPI函数,主要是MoveTo和LineTo等函数,自己编写很繁琐。

 最好是用第三方控件,当然VC高版本也提供了MsChart,很强大,本人在C#里用过,主要是C#效率不高,编写的程序太大,还是用VC了.

第三方控件有ntGraph,优点是小巧,只有几个类,缺点不能缩放等;而teechart则给出强大,但是他比较庞大,有几十个类。顺便说下BCB自带有这个控件。

使用比较简单,当然也要花几个小时功夫。讲几个需要注意的地方吧。

1.先注册, regsvr32 teechart8.ocx;再在工程添加,在对话框上右键插入teechart控件;再设置属性,添加曲线等;再添加控件变量,添加头文件

#include "tchart.h"
#include "scroll.h"
#include "Series.h"
#include "Axis.h"
#include "page.h"
#include "ValueList.h"
#include "ToolList.h"
#include "Tools.h"
#include "AnnotationTool.h"
#include "Axes.h"

2.由于添加后类比较多,可以在ClassView中新建一个文件夹存放类。

3.常用代码:

m_chart.Series(0).FillSampleValues(50);//添加sample点

m_chart.Series(0).AddXY(i,arr[i],NULL,RGB(0,0,0));//添加点,效率较低,可用AddArray函数

m_chart.Series(0).Clear();//清空曲线

m_chart.Series(i).SetActive(false);//隐藏显示曲线, true显示

void CTeeChartDlg::OnBnClickedButtondraw2()

{
    CSeries ChartSpeed = (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;

    COleSafeArray XValues;    
    COleSafeArray YValues;
    DWORD pNumElements[] = {m_nPointNum};
    XValues.Create(VT_R8, 1, pNumElements);    
    YValues.Create(VT_R8, 1, pNumElements);
    for(i=0; i<m_nPointNum; i++) 
    {         
        val = i;
        XValues.PutElement(&i, &val);
        val = randf(-20,20);
        YValues.PutElement(&i, &val);
    };
    //由于需要计算时间,画图就不在第一个for循环里实现了
    dwTimeS = GetTickCount();
    ChartSpeed.Clear();
    ChartSpeed.AddArray(m_nPointNum,YValues,XValues);
    dwTimeE = GetTickCount();
    dwTimeE -= dwTimeS;

    str.Format(_T("耗时:%d ms"),dwTimeE);
    SetDlgItemText(IDC_STATIC_T,str);
}
void DrawLine(double* pX,double* pY,long nNum) 
{
    COleSafeArray XValues;    
    COleSafeArray YValues;
    long i(0);
    DWORD wLength = nNum;
    XValues.Create(VT_R8, 1, &wLength);    
    YValues.Create(VT_R8, 1, &wLength);

    for(i=0; i<nNum; i++) 
    {         
        XValues.PutElement(&i, pX+i);
        YValues.PutElement(&i, pY+i);
    }
    CSeries Chart = (CSeries)m_Chart.Series(0);
    Chart.Clear();
    Chart.AddArray(nNum,YValues,XValues);

}

////////////////////////////////////////////////////////////////////

 (pMsg->message == WM_KEYDOWN)  
    {  
        switch(pMsg->wParam)  
        {  
            case VK_ESCAPE: //Esc按键事件  
                return true;  
            case VK_RETURN: //Enter按键事件  
                return true;  
            default:  
                ;  
        }  

    }  

//////////////////////////////////////////////////////////////////

【上篇】
【下篇】

抱歉!评论已关闭.