在一个窗口中绘制多个图像是常见的需求。笨笨在前面的课程里面,已经介绍了三种多区域绘图的方式。利用分裂视图多区域绘图、利用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);
现在可以运行程序,结果如图。
明天就要大阅兵了,给大伙乐一乐,哈哈。