深入浅出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变量也是可以的)。这个CChartWnd变量两次Attach到同一个窗口hWnd上了。当然,既然要分区域,Attch的时候就要设定要绘制的区域(也可以在WM_SIZE消息里用SetConfineRect设置)

在笨笨目前的CChart版本里面,已经完美实现了CChartWnd的多次Attach。具体地说,就是可以一个CChartWnd变量往一个窗口句柄上多次Attach;也可以多个CChartWnd变量往同一个窗口句柄上Attach;如果有多个窗口句柄,也可以用不同的CChartWnd变量各自Attach。在使用的时候只要注意一点就可以了,这一点完全不影响功能的实现,就是一个CChartWnd只能往同一个窗口句柄上Attach。

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

建立一个基于对话框的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!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值