笨笨在前面的课程里面提到,在一个窗口上不能粘多个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!
版权声明:本文为博主原创文章,未经博主允许不得转载。