深入浅出CChart 每日一课——快乐高四第十五课 罗马通途,利用ChartCtrl控件实现多区域绘图

在一个窗口中绘制多个图像是常见的需求。笨笨在前面的课程里面,已经介绍了三种多区域绘图的方式。利用分裂视图多区域绘图、利用CChart类多区域绘图、利用CChartWnd类多区域绘图。其中第三种方法是笨笨最近才实现的,以前的版本CChartWnd只能画一个图。

由于新版本中提供了ChartCtrl这个控件,笨笨发现,利用这个控件实现多区域绘图才是最完美的。

其实,从前面三课的内容,小伙伴们肯定已经知道怎么用ChartCtrl绘制多图了,那里虽然每次只画了一个图,但同样的方法完全可以画多个图。

这里笨笨还是给大伙完整地演示一下吧。

第一步,建立一个基于对话框的MFC程序LessonA15。

第二步,拷贝CChart库文件到LessonA15目录。

第三步,用资源编辑器打开主对话框,删除“TODO: 在这里设置对话控制”这个标签,并添加两个Custom Control,其ID分别为IDC_CHART1、IDC_CHART2,其class均设置为ChartCtrl。

对话框布局大致如下。

第四步,打开LessonA15Dlg.cpp文件,在头部加入CChart头文件和导入库文件的引用,同时加入数学库头文件。

 

#include <math.h>
#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;

第五步,在OnInitDialog函数前面,添加一个函数,用于绘制等高线。

double func(double x, double y)
{
	return 1.0/((x-1.5)*(x-1.5)+(y-0.8)*(y-0.8)+1.0)
		+1.0/((x+1.5)*(x+1.5)+(y-0.8)*(y-0.8)+1.0)
		+1.0/(x*x+(y+0.8)*(y+0.8)+1.0);
}


第六步,在OnInitDialog函数里面添加绘图代码如下。

// TODO: Add extra initialization here
	CWnd *pWnd;
	CChart *chart;
	
	pWnd = GetDlgItem(IDC_CHART1);
	chart = GetChart(pWnd->m_hWnd);
	chart->SetType(kTypeContour);
	chart->SetFieldFcn(func);
	chart->SetPlotRange(-2, 2, -2, 2);
	chart->SetContourLineNum(80);
	chart->SetTitle(_T("安倍晋三"));
	chart->SetBkgndColor(GetSysColor(COLOR_3DFACE));
	chart->SetEdgeShow(true);

	pWnd = GetDlgItem(IDC_CHART2);
	chart = GetChart(pWnd->m_hWnd);
	chart->AddPoint2D(10.0, 0.0);
	chart->AddPoint2D(9.7, 6.0);
	chart->AddPoint2D(0.0, 6.0);
	chart->AddPoint2D(0.025, 5.5);
	chart->AddPoint2D(9.225, 5.5);
	chart->AddPoint2D(9.5, 0.0);
	chart->AddPoint2D(10.0, 0.0);

	chart->AddPoint2D(6.0, 5.5, 1);
	chart->AddPoint2D(6.15, 2.5, 1);
	chart->AddPoint2D(9.375, 2.5, 1);

	double pX[100], pY[100];
	int i;
	for(i=0; i<100; i++)
	{
		pX[i] = 7.7+0.5*cos(i*2.0*3.1415926536/100.0);
		pY[i] = 4.0+0.5*sin(i*2.0*3.1415926536/100.0);
	}
	chart->AddCurve(pX, pY, 100);

	chart->SetDataColor(RGB(20, 20, 20), 0);
	chart->SetDataColor(RGB(20, 20, 20), 1);
	chart->SetDataColor(RGB(20, 20, 20), 2);

	chart->SetDataLineSize(3, 0);
	chart->SetDataLineSize(3, 1);
	chart->SetDataLineSize(3, 2);

	chart->SetXRange(-2, 12);
	chart->SetYRange(-5, 10);
	chart->SetTitle(_T("屠狗神器"));
	chart->SetBkgndColor(GetSysColor(COLOR_3DFACE));
	chart->SetEdgeShow(true);


现在可以运行程序,结果如图。

明天就要大阅兵了,给大伙乐一乐,哈哈。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值