1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 深入浅出CChart 每日一课——快乐高四第二十课 七月流火 总复习之CChart多种编程模式

深入浅出CChart 每日一课——快乐高四第二十课 七月流火 总复习之CChart多种编程模式

时间:2020-08-18 02:42:04

相关推荐

深入浅出CChart 每日一课——快乐高四第二十课 七月流火 总复习之CChart多种编程模式

人间四月天,又到毕业季。

前面这么多课程,笨笨实际上给大家介绍了CChart的多种编程模式。

第一课的编程模式是CChartWnd窗口类模式。这种模式实际是采用了Windows的窗口子类化方法,用笨笨自编的窗口函数替换了绘图窗口的窗口函数,自动处理了鼠标和键盘消息。目前,这种模式经过多次改进,已经完全消除了早期的各种局限性,是CChart默认的编程模式。

第八课的编程模式,笨笨现在称为裸模式。这种模式直接利用CChart这个类编程,需要自己处理鼠标键盘消息。当然处理过程也很简单,只需要调用一个接口函数就可以了。

第三十二课的编程模式,是ChartCtrl标准控件模式。这种模式实际上采用了Windows的窗口超类化方法,编程时新建蕴含CChart类指针的一个窗口。这种模式其实比窗口类模式更为灵活。

下面,笨笨就给大家演示一下这三种模式同时使用是一种什么感受。

需要注意的是,本节课的内容需要CChart的版本号不小于4.2.2.1。早期的版本只要启用了窗口类模式,用户代码里与CChart相关的鼠标键盘消息就被屏蔽了,按裸模式写的代码将失效。新版已经修复了这个问题。

第一步,还是老规矩,按第一课的方式建立一个Win32 Application,名字为LessonA20,拷贝头文件和库文件,增加下列代码。

#include "Chart.h"#if defined(_UNICODE) || defined(UNICODE)#pragma comment(lib,"CChartu.lib")#else#pragma comment(lib,"CChart.lib")#endifusing namespace NsCChart;

并响应鼠标双击

wcex.style= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

第二步,在窗口左1/3用裸方法画一条曲线。

1)增加一个CChart变量。

static CChart chart;

2)设置一个常量,用于数组长度。

const int len=100;

3)在WM_CREATE消息里面设置曲线属性

case WM_CREATE:double pX[len], pY[len];int i; for(i=0; i<len; i++){pX[i] = i;pY[i] = i*i/(double)len/len;}chart.AddCurve(pX, pY, len);chart.SetRectConfined(true);chart.SetTitle(_T("裸模式"));break;

4)响应WM_SIZE消息,以便把曲线绘制到左1/3区域。

case WM_SIZE:RECT rect;GetClientRect(hWnd, &rect);RECT rt1;rt1 = rect;rt1.right = (2*rect.left + rect.right)/3;chart.SetConfineRect(rt1);break;

5)在WM_PAINT消息里画图。

case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: Add any drawing code here...chart.OnDraw(hWnd);EndPaint(hWnd, &ps);break;

6)响应鼠标键盘消息。

case WM_LBUTTONDOWN:case WM_LBUTTONUP:case WM_LBUTTONDBLCLK:case WM_MOUSEMOVE:case WM_CONTEXTMENU:case WM_KEYDOWN:chart.Interactive(hWnd, message, wParam, lParam);break;

结果如图。

第三步,在窗口中间1/3用标准控件模式画一幅等高线图。

1)增加一个CChart指针变量。

static CChart *pchart;

2)写一个等高线图的高度函数。

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

3)在WM_CREATE消息里创建一个ChartCtrl标准控件窗口。

HWND myHWnd;myHWnd = CreateSubChartWnd(hWnd, kTypeContour, _T("Chart"), 0, 0, 600, 400);pchart = GetChart(myHWnd);pchart->SetTitle(_T("标准控件模式"));pchart->SetFieldFcn(f);pchart->SetPlotRange(-3.0, 3.0, -3.0, 3.0);

4)在WM_SIZE消息里面,让控件窗口显示在程序窗口中间1/3。

RECT rt2;rt2 = rect;rt2.left = rt1.right;rt2.right = (rect.left+2*rect.right)/3;MoveWindow(pchart->GetWnd(), rt2.left, rt2.top, rt2.right-rt2.left, rt2.bottom-rt2.top, TRUE);

结果如图。

第四步,在窗口右边1/3用窗口类模式画一幅柱图。

1)增加一个CChartWnd指针变量。

static CChartWnd chartWnd;

2) 在WM_CREATE消息里设置相关属性。

chartWnd.Attach(hWnd, kTypeStem);chartWnd.GetChart()->SetTitle(_T("窗口类模式"));chartWnd.GetChart()->SetRectConfined(true);double pBar[5];pBar[0] = 3;pBar[1] = 2;pBar[2] = 1;pBar[3] = 6;pBar[4] = 7;chartWnd.GetChart()->AddStems(pBar, 5);

3) 在WM_SIZE消息里面,让柱图显示在程序窗口右边1/3。

RECT rt3;rt3 = rect;rt3.left = rt2.right;chartWnd.GetChart()->SetConfineRect(rt3);

结果如图。

三个图像的消息响应均完全正常。

啊,能同时拥有三个女朋友的感觉不错吧!哈哈。

虽然以前她们之间还有些不兼容的地方,会闹矛盾,不过笨笨已经完美地消除了这些误会,现在她们情同姐妹哟。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。