深入浅出CChart 每日一课——快乐高四第十一课 不离不弃,利用CChartWnd实现多区域绘图

笨笨在前面的课程里面提到,在一个窗口上不能粘多个CChartWnd,否则图像不正常,故而在高四6到8课,均使用CChart类,实现了在普通窗口、对话框窗口、DuiLib窗口上的多区域绘图。

使用CChart类必须手动处理消息,而采用CChartWnd类省去了处理消息的步骤,编程更为简便。

近几天笨笨进行了一些改进,采用CChartWnd类也可以在一个窗口上多区域绘图了。

1 首先按照前面的步骤建立一个基于Win32 Application的程序,名为LessonA11。

2 在WndProc函数之前,建立一个函数,用于绘制等高线。

double f(double x, double y)
{
	return 1.0/(x*x+y*y+1.0);
}

3 在WndProc函数里面靠前的位置,设置如下几个变量。

static CChartWnd chartWnd;
RECT rect, rt1, rt2;

4 在WndProc函数里面,增加WM_CREATE消息的处理例程如下。

case WM_CREATE:
			GetClientRect(hWnd, &rect);
			rt1 = rect;
			rt2 = rect;
			rt1.right = (10*rect.left + 9*rect.right)/19;
			rt2.left = (9*rect.left + 10*rect.right)/19;

			chartWnd.Attach(hWnd, kTypeXY, rt1);
			chartWnd.Attach(hWnd, kTypeContour, rt2);

			chartWnd.GetChart(0)->AddPoint2D(0.0, 0.0);
			chartWnd.GetChart(0)->AddPoint2D(1.0, 2.0);
			chartWnd.GetChart(0)->AddPoint2D(2.0, 2.0);
			chartWnd.GetChart(0)->AddPoint2D(3.0, 0.0);
			chartWnd.GetChart(0)->SetBkgndColor(GetSysColor(COLOR_3DFACE));

			chartWnd.GetChart(1)->SetFieldFcn(f);
			chartWnd.GetChart(1)->SetPlotRange(-1, 1, -1, 1);
			chartWnd.GetChart(1)->SetBkgndColor(RGB(200, 255, 255));
			break;

运行结果如图。

这里要注意到,笨笨并没有添加多个CChartWnd变量,而是只有一个。这个CChartWnd变量两次Attach到同一个窗口hWnd上了。当然,既然要分区域,Attch的时候就要设定要绘制的区域(也可以在WM_SIZE消息里用SetConfineRect设置)

还有一点要注意,在笨笨目前的实现版本里面,只能向同一个窗口句柄hWnd多次Attach。如果又向另一个窗口句柄Attach,将没有任何作用,即使你采用另一个CChartWnd变量也不行。

下面再看看在对话框窗口里面的应用。

建立一个基于对话框的MFC程序LessonA11_1。

在主对话框上放置两个Picture控件,ID分别为IDC_CHART1和IDC_CHART2。

添加头文件和库文件的包含。

在CLessonA11_1Dlg类里面添加一个成员变量。

CChartWnd m_ChartWnd;

在CLessonA11_1Dlg类的OnInitDialog函数里面,添加代码如下。

// TODO: Add extra initialization here
	m_ChartWnd.Attach(m_hWnd, IDC_CHART1, kTypeXY);
	m_ChartWnd.Attach(m_hWnd, IDC_CHART2, kTypeXY);

	m_ChartWnd.GetChart(0)->AddPoint2D(0.0, 0.0);
	m_ChartWnd.GetChart(0)->AddPoint2D(1.0, 1.0);
	m_ChartWnd.GetChart(0)->AddPoint2D(2.0, 1.0);
	m_ChartWnd.GetChart(0)->AddPoint2D(3.0, 0.0);
	m_ChartWnd.GetChart(0)->SetBkgndColor(RGB(200, 200, 200));

	m_ChartWnd.GetChart(1)->AddPoint2D(0.0, 1.0);
	m_ChartWnd.GetChart(1)->AddPoint2D(1.0, 0.0);
	m_ChartWnd.GetChart(1)->AddPoint2D(2.0, 0.0);
	m_ChartWnd.GetChart(1)->AddPoint2D(3.0, 1.0);
	m_ChartWnd.GetChart(1)->SetBkgndColor(RGB(200, 255, 255));

运行结果如下。

OK,Bye!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 09:07:30

深入浅出CChart 每日一课——快乐高四第十一课 不离不弃,利用CChartWnd实现多区域绘图的相关文章

深入浅出CChart 每日一课——快乐高四第七课 铁蛋的竹马,返璞归真之对话框窗口多区域绘图

上一课笨笨给大家介绍的是在普通窗口上多区域绘图,本课将介绍对话框下的情形.由于对话框的消息循环和普通窗口有一些区别,所以在具体操作上略有不同,下面的处理过程可以供大家参考. 第一步,打开VC,建立一个基于MFC AppWizard(exe)向导的项目LessonA07.向导中选择Dialog Based,其它不做任何更改,直接点Finish. 第二步,拷贝库文件到LessonA07文件夹中, 第三步,在VC界面的资源编辑器中,删除掉对话框中间的"TODO: 在这里设置对话控制."这个标

深入浅出CChart 每日一课——快乐高四第十课 见微知著,CChart内置功能介绍之数据处理篇

CChart内置数据处理功能默认是不打开的.要打开数据处理功能,请点击菜单"绘图状态-->特别功能-->允许数据处理",这时菜单"曲线数据-->数据名"下,将多出一个"数据处理"菜单,如图所示. 可以看到,笨笨内置了四种数据处理功能,线性变换.微积分.数据平滑.数据拟合. A10.1线性变换 "线性变换"菜单提供了三个功能,分别是偏移.缩放.变换.这三个功能都非常简单,只要看看弹出的对话框就全明白了. 可见,

深入浅出CChart 每日一课——快乐高四第十三课 月上柳梢,Win32标准控件ChartCtrl之牵手

上节课笨笨介绍了新增加的ChartCtrl控件,是在对话框中使用的.本节课简单介绍这个控件的另一种用法. 首先按照以前的步骤建立一个Win32Application. 增加WM_CREATE消息的响应例程如下. case WM_CREATE: HWND hW; hW = CreateWindow(_T("ChartCtrl"), _T("Cap"), WS_CHILD | WS_VISIBLE, 20, 20, 600, 400, hWnd, NULL, hInst

深入浅出CChart 每日一课——快乐高四第十四课 枝头红杏,Win32标准控件ChartCtrl之围城

本节课笨笨继续介绍ChartCtrl控件在DuiLib中的应用. 请大家先复习高四第三课. 本节课的方法和这一课的方法差不多,由于笨笨提供了ChartCtrl这个新工具,所以编程可以有一定的简化. 首先,XML文件和高四第三课完全一样. 其次,cpp文件只有CreateControl部分有所修改,如下.当然,前面那个CChartWnd变量不需要了. virtual CControlUI* CreateControl(LPCTSTR pstrClassName) { if (_tcsicmp(ps

深入浅出CChart 每日一课——快乐高四第十六课 老马识途,ChartCtrl控件在WTL中的使用

这几天有个朋友想在WTL下使用ChartCtrl控件,因此笨笨在这里也写一个简单的教程. 要使用WTL当然要先安装它. 笨笨在这里介绍两个例子,一个是WTL对话框界面,一个是WTL单文档SDI界面. A16.1 WTL对话框界面 第一步,首先用AppWizard建立一个基于对话框的WTL程序LessonA16. 第二步,在主对话框资源IDD_MAINDLG上添加一个Custom Control控件,其ID设置为IDC_CHART,class设置为ChartCtrl. 第三步,拷贝库文件. 第四步

深入浅出CChart 每日一课——快乐高四第九课 于无声处,CChart内置功能介绍之数据存取篇

笨笨长期以来一直使用Origin软件画图和处理数据,但Origin软件没有编程语言的接口.笨笨开发CChart的一个潜在的目标.是想实现Origin软件的功能.当然这是一个不可能达到的目标.Origin软件的功能太强了.笨笨仅仅能膜拜. 下节课将介绍CChart内置的数据处理功能,这是笨笨向Origin的致敬. 在这之前.本节课首先介绍一下CChart内置的数据存取功能. A9.1 CChart数据保存 假定我们绘制了如图的两条曲线. 假设要保存全部曲线数据,请点击右键菜单"曲线数据-->

深入浅出CChart 每日一课——必也正名,Win32标准控件ChartCtrl之初识

各位用过CChart的小伙伴们,笨笨的这个控件还算好使吧. 慢着,慢着,让我想想,CChart是一个控件吗?好像顶多就是一个类库吧,根本就不是正儿八经的控件. 呵呵,本节课就给大家介绍一下CChart怎么作为一个Windows标准控件来使用. 还是按前面的规矩吧. 第一步,建立一个基于对话框的MFC程序LessonA12. 第二步,在LessonA12.h文件的头部加入CChart头文件和函数库的引用. 第三步,在主对话框中删除掉原来那个标签,并添加一个Custom Control控件.设置其I

NeHe OpenGL教程 第四十二课:多重视口

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:) 欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其中有

微积分重点 第一课至第四课

1.微积分是关于两个函数间关系的学问 例如, 距离与速度的关系  f(t)  --- df/dt 高度与斜率的关系  y(x)  ---- dy/dx 函数1--->函数2:   求斜率 函数2--->函数1:   求面积,乘以自变量 两条曲线不同,但是包含了相同的信息 函数2表示了函数1在某一瞬间的变化率 2.导数的总览和计算 三个重要的基本函数:幂函数 三角函数 指数函数 求导过程: Δy/Δx 无限逼近取极限 就得到了 dy/dx sinx 在零点处斜率逼近1, 在pi/2处斜率为零,