TeeChart柱状图

目录

前言

一、详细内容

1.添加类,引入必要的头文件

2.清除图形

3.teechart 画图 -  柱状图

4.取消显示数据标记

5.去除/显示legend(右边数据)

6.补充:AddArray 给柱状图添加数据

二、全部代码


前言

本文参考:

https://blog.csdn.net/czyt1988/article/details/7428415

https://blog.csdn.net/czyt1988/article/details/7538979

几乎原搬上述页面内容,按照自己的习惯改了部分,以便自己学习。

本文基于TeeChart插入而写,是前文的延续,因而可在完成前文操作的基础上,继续下列操作

操作系统:win10        开发工具:vs2012


一、详细内容

1.添加类,引入必要的头文件

之前的方法比较麻烦,更简单就是通过类向导,导入类型库的类

如图进入类向导,选择添加类按钮的下拉菜单,选择类型库中的MFC类

 

 

 cpp中引入。添加代码

#include "CSeries.h" 
#include "CAxis.h"
#include "CAxes.h"

2.清除图形

双击控件 确定

 跳转至

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

void CTChartDlg::ClearAllSeries(void) 
{
	for(long i = 0;i<m_chart.get_SeriesCount();i++)
	{
		((CSeries)m_chart.Series(i)).Clear();
	}
}

添加结果如下图

 声明

3.teechart 画图 -  柱状图

双击控件,Add

 

 添加代码。修改函数为如下内容

void CTChartDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	
	/*
	//折线例子
	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();
	CSeries lineSeries = (CSeries)m_Chart.Series(0);
	lineSeries.Clear();//在最前面加上ClearAllSeries(ClearAllSeries是自己写的函数)就不用了
	for(int i=0;i<nDATALENGTH;i++)
	{
		lineSeries.AddXY((double)i,dData[i],NULL,0);
	}
	*/
	//清除之前的图形
	ClearAllSeries();

	const UINT nDATALENGTH = 50; 
	double dData[nDATALENGTH]={1,22,60,5,100,70,40,50,3,22,
		11,12,0,80,55,66,55,10,7,32,11,22,33,66,41,10,8,74,
		32,11,91,22,33,14,55,66,25,4,33,22,11,19,33,24,85,106,55,44,33,22};//赋值
	
	/*赋值例子
	for (int i=0;i<nDATALENGTH;i++)
	{
		dData[i] = abs(100*sin((float)i));
	}
	*/

	//ClearAllSeries();
	CSeries barSeries = (CSeries)m_chart.Series(1);
	
	for(int i=0;i<nDATALENGTH;i++) 
	{
		//barSeries.AddXY((double)i,dData[i],NULL,0);//i柱名,dData[i]数值,参数0是颜色
		i%2==0
			? barSeries.AddXY((double)i,dData[i],NULL,RGB(0,0,255))
			: barSeries.AddXY((double)i,dData[i],NULL,RGB(0,255,255));
	}
	//取消右边数据显示
	//CLegend legend = (CLegend)m_Chart.get_Legend();     
	//legend.put_Visible(FALSE);
	//CDialogEx::OnOK();
}

开始执行(不调试),得到结果

4.取消显示数据标记

添加一个控件,修改说明

 双击控件,添加代码

CSeries barSeries = (CSeries)m_chart.Series(1);
	CMarks SeriesMarks = (CMarks)barSeries.get_Marks();
	if(BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck())
	{
		SeriesMarks.put_Visible(FALSE);
	}
	else
	{

		SeriesMarks.put_Visible(TRUE);
	}

结果图如下

 标示是用CMarks管理的,加入这个类就行了。用类向导,加入CMarks

 引用

#include "CMarks.h"

开始执行(不调试),得到结果

 如果报错:

1>LINK : fatal error LNK1168: 无法打开 D:\MFCdemo\TChart\Debug\TChart.exe 进行写入

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

可能是运行的图没有关闭,看一下任务栏下图图标是否存在

5.去除/显示legend(右边数据)

如果不想要右边那一栏数据显示,可以通过代码去除

CLegend是用来控制这个显示的。在OnBnClickedOk()中添加

CLegend legend = (CLegend)m_TeeChart.get_Legend();     
legend.put_Visible(FALSE);

添加类

引用

#include "CLegend.h"

运行

6.补充:AddArray 给柱状图添加数据

OnBnClickedOk()中的代码修改为如下

const UINT nDATALENGTH = 50; 
	double dData[nDATALENGTH]={1,22,60,5,100,70,40,50,3,22,
		11,12,0,80,55,66,55,10,7,32,11,22,33,66,41,10,8,74,
		32,11,91,22,33,14,55,66,25,4,33,22,11,19,33,24,85,106,55,44,33,22};//赋值
	COleSafeArray XValues;    
	COleSafeArray YValues;    
	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();
	CSeries lineSeries = (CSeries)m_chart.Series(1);
	lineSeries.AddArray(nDATALENGTH,YValues,XValues);
	CSeries barSeries = (CSeries)m_chart.Series(1);
	barSeries.put_Color(RGB(255,0,0));

结果如图,右上角Series1颜色与图的颜色一致了。

二、全部代码

cpp全部代码如下


// TChartDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TChart.h"
#include "TChartDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include "CSeries.h" 
#include "CAxis.h"
#include "CAxes.h"
#include "CLegend.h"
#include <math.h>
#include "CMarks.h"

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();
	CTchart1 m_chart;
// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTChartDlg 对话框



CTChartDlg::CTChartDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CTChartDlg::IDD, pParent)
	
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTChartDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TCHART1, m_chart);
}

BEGIN_MESSAGE_MAP(CTChartDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CTChartDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDC_CHECK1, &CTChartDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()


// CTChartDlg 消息处理程序

BOOL CTChartDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CTChartDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CTChartDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTChartDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CTChartDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	
	/*-----------------------------------------------------
	//折线例子
	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();
	CSeries lineSeries = (CSeries)m_Chart.Series(0);
	lineSeries.Clear();//在最前面加上ClearAllSeries(ClearAllSeries是自己写的函数)就不用了
	for(int i=0;i<nDATALENGTH;i++)
	{
		lineSeries.AddXY((double)i,dData[i],NULL,0);
	}
	-----------------------------------------------------*/

	//AddArray 给柱状图添加数据
	const UINT nDATALENGTH = 50; 
	double dData[nDATALENGTH]={1,22,60,5,100,70,40,50,3,22,
		11,12,0,80,55,66,55,10,7,32,11,22,33,66,41,10,8,74,
		32,11,91,22,33,14,55,66,25,4,33,22,11,19,33,24,85,106,55,44,33,22};//赋值
	COleSafeArray XValues;    
	COleSafeArray YValues;    
	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();
	CSeries lineSeries = (CSeries)m_chart.Series(1);
	lineSeries.AddArray(nDATALENGTH,YValues,XValues);
	CSeries barSeries = (CSeries)m_chart.Series(1);
	barSeries.put_Color(RGB(255,0,0));
	
	/*-----------------------------------------------------
	//为柱状图添加数据
	ClearAllSeries();//清除之前的图形
	const UINT nDATALENGTH = 50; 
	double dData[nDATALENGTH]={1,22,60,5,100,70,40,50,3,22,
		11,12,0,80,55,66,55,10,7,32,11,22,33,66,41,10,8,74,
		32,11,91,22,33,14,55,66,25,4,33,22,11,19,33,24,85,106,55,44,33,22};//赋值

	CSeries barSeries = (CSeries)m_chart.Series(1);
	for(int i=0;i<nDATALENGTH;i++) 
	{
		//barSeries.AddXY((double)i,dData[i],NULL,0);//i柱名,dData[i]数值,参数0是颜色
		i%2==0
			? barSeries.AddXY((double)i,dData[i],NULL,RGB(0,0,255))
			: barSeries.AddXY((double)i,dData[i],NULL,RGB(0,255,255));
	}
	//barSeries.put_Color(RGB(255,0,0));
	//取消右边数据显示
	CLegend legend = (CLegend)m_chart.get_Legend();     
	legend.put_Visible(FALSE);
	//CDialogEx::OnOK();
	-----------------------------------------------------*/
}
void CTChartDlg::ClearAllSeries(void) 
{
	for(long i = 0;i<m_chart.get_SeriesCount();i++)
	{
		((CSeries)m_chart.Series(i)).Clear();
	}
}

void CTChartDlg::OnBnClickedCheck1()
{
	// TODO: 在此添加控件通知处理程序代码
	CSeries barSeries = (CSeries)m_chart.Series(1);
	CMarks SeriesMarks = (CMarks)barSeries.get_Marks();
	if(BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck())
	{
		SeriesMarks.put_Visible(FALSE);
	}
	else
	{
		SeriesMarks.put_Visible(TRUE);
	}
}

本文到此结束

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TeeChart 是一个强大的图表控件,可以用于多种编程语言,包括 C++。下面是一个简单的示例,展示如何使用 TeeChart 在 C++ 中绘制柱状图。 首先,在你的项目中添加 TeeChart 控件,然后在代码中添加以下代码: ```cpp #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "TeeChart.hpp" #include "TeeProcs.hpp" #include "Chart.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // 创建一个柱状图 TBarSeries *Series1 = new TBarSeries(Form1->Chart1); Form1->Chart1->AddSeries(Series1); // 设置柱状图的标题和数据 Series1->Title = "My Data"; Series1->Add(10, "Bar 1", clRed); Series1->Add(20, "Bar 2", clBlue); Series1->Add(30, "Bar 3", clGreen); // 设置图表的标题和轴标签 Form1->Chart1->Title->Text->Clear(); Form1->Chart1->Title->Text->Add("My Chart"); Form1->Chart1->Axes->Bottom->Title->Caption = "X Axis"; Form1->Chart1->Axes->Left->Title->Caption = "Y Axis"; // 更新图表 Form1->Chart1->Refresh(); } //--------------------------------------------------------------------------- ``` 上面的代码创建了一个包含三个柱子的柱状图,并设置了图表的标题和轴标签。你可以在 `FormCreate` 事件中添加这些代码,或者在任何其他你认为合适的事件中添加。 运行应用程序,你将看到一个漂亮的柱状图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值