笨笨在前面的课程里面提到,在一个窗口上不能粘多个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!