深入浅出CChart 每日一课——快乐高四第五十五课 天然去雕饰,出水芙蓉之美轮美奂

前面的CChart奇幻之旅,笨笨带大家领略了C#,VB.Net、VB6、Delphi、C++Builder、易语言、Fortran、GCC、JAVA、WPF、SoUI、炫彩界面库、SDL、WxWidgets这些多种多样的异域风情,作为铺垫,同时也游览了C风格代码、控制台编程等区域。这趟旅行到此为止,下面仍然聚焦于CChart本身的功能。本节课轻松一下,介绍一下CChart对于曲线颜色显示的设置。

实际上,CChart的曲线具有多种颜色模式,可以形成美轮美奂的图像!

A55.1 曲线颜色基本模式

默认情况下,曲线的颜色不用设置,显示颜色是第一条红色,第二条蓝色......,只要曲线条数不是太多,可以保证每条曲线颜色不同。

实际上,这是系统自动设置的曲线颜色。

与自动设置曲线颜色的接口有两个。

        void		CChart::SetAutoDataColorGeneral(bool bAuto, int nPlotIndex=0);
		void		CChart::SetAutoDataColor(bool bAuto, int nDataIndex, int nPlotIndex=0);

这两个接口默认设置状态都是true。

第一个接口针对所有曲线生效,第二个接口针对某一条曲线生效。

对某一条曲线来说,必须两个接口均设置为true才会由系统自动设置颜色。

设置曲线颜色的接口函数如下。

void		CChart::SetDataColor(COLORREF color, int nDataIndex, int nPlotIndex=0);

下面就来试验一下。

我们按第一课的方法,建立一个最基本的Win32 Application程序LessonA55,在其中加入三条曲线。

具体过程不赘述,同学们应该很熟练了。

其中关键代码如下:

        case WM_CREATE:
			chartWnd.Attach(hWnd, kTypeXY);
			
			if(true)
			{
				int i, hc = 20;
				double hw = 4;
				for(i=-hc; i<=hc; ++i)
				{
					chartWnd.GetChart()->AddPoint2D(i, hw*i/hc);
					chartWnd.GetChart()->AddPoint2D(i, hw*i*i/hc/hc, 1);
					chartWnd.GetChart()->AddPoint2D(i, hw*i*i*i/hc/hc/hc, 2);
				}
				chartWnd.GetChart()->SetDataTitle(_T("1次方"), 0);
				chartWnd.GetChart()->SetDataTitle(_T("2次方"), 1);
				chartWnd.GetChart()->SetDataTitle(_T("3次方"), 2);
			}
			
			chartWnd.GetChart()->SetTitle(_T("曲线颜色设置!"));
			break;

图像如下。

 

测试一下,在上述代码的break;之前一行,添加代码:

chartWnd.GetChart()->SetAutoDataColorGerneral(false);

图像如下:

 

哦豁,三条曲线全部变成了黑色!

这是由于曲线的默认颜色就是黑色,除非你设置了它。

比如在这种状态下,我们想让第二条曲线变成红色,添加下面一行代码即可。

chartWnd.GetChart()->SetDataColor(RGB(255, 0, 0), 1);

图像如下!

 

前面说了,曲线要自动设置颜色,必须SetAutoDataColorGeneral和SetAutoDataColor均设置为true才行,下面试验一下。

删除刚才添加的两行代码,并添加以下两行代码。

            chartWnd.GetChart()->SetAutoDataColorGeneral(true);
 			chartWnd.GetChart()->SetAutoDataColor(false, 0);

按上面的描述,这样设置以后,应该是第一条曲线不能自动设置颜色(会变成默认的黑色),第二、第三条曲线还是自动设置颜色。

图像如下。

 

和预想的完全一样。

A55.2 曲线双色渐变模式

曲线双色渐变模式是指,曲线第一个点设置一个颜色,最后一个点设置另一个颜色,中间的点颜色逐渐过渡。

跟双色渐变有关的接口有以下三个。

void		CChart::SetBiColorMode(bool bBi, int nDataIndex, int nPlotIndex=0);

此接口用于设置某条曲线的双色渐变模式。

void		CChart::SetDataColor(COLORREF color, int nDataIndex, int nPlotIndex=0);

此接口用于设置双色渐变第一个点的颜色。

这个接口实际上就是基本模式下设置曲线颜色的同一个接口,在双色渐变模式下,起到了另一个作用。

void		CChart::SetDataColor2(COLORREF color, int nDataIndex, int nPlotIndex=0);

此接口用于设置双色渐变最后一个点的颜色。

下面试验一下。

比如,我们想把上面的三条曲线中,第一条曲线变成红-蓝渐变。

删除最后添加的两行代码,替换成如下代码。

            chartWnd.GetChart()->SetDataLineSize(3, 0);
			chartWnd.GetChart()->SetBiColorMode(true, 0);
			chartWnd.GetChart()->SetDataColor(RGB(255, 0, 0), 0);
			chartWnd.GetChart()->SetDataColor2(RGB(0, 0, 255), 0);

为了更清晰,这里把第一条曲线加粗了。

图像如下。

 

可见,第一条曲线的确是由红色渐变到蓝色。

A55.3 曲线多色渐变模式

前面介绍的双色渐变模式,有时候会觉得不过瘾,两种颜色还是太少了。

没关系,这里还有多色渐变模式。

在CChart内部,可以同时设置双色渐变模式和多色渐变模式,绘图时多色渐变模式优先。

与多色渐变模式相关的接口如下:

void		CChart::SetDataMultiColorMode(bool bMul, int nDataIndex, int nPlotIndex=0);

此接口用于设置某条曲线的多色渐变模式。

void		CChart::SetDataMultiColorInputType(int nType, int nDataIndex, int nPlotIndex=0);

此接口用于设置某条曲线多色渐变模式的输入方式。

nType有三种选择

0:按数据点从一个点到最后一个点的比例输入,其中第一个点的比例为0.0,最后一个点的比例为1.0。例如,第一个点红色,中间点蓝色,最后一个点绿色,即设置比例0.0为红,比例0.5为蓝,比例1.0为绿。

1:按数据点的X值设置,可以对不同的X值设置不同的颜色。

2:按数据点的Y值设置,可以对不同的Y值设置不同的颜色。

void		CChart::AddSegmentColor(double ratio, COLORREF color, int nDataIndex, int nPlotIndex=0);

此接口用于设置某条曲线多色渐变的节点。

其中ratio的含义由上一个接口SetDataMultiColorInputType定义。

下面继续试验一下。

例如我们计划把上面第二条曲线设置为多色渐变模式,其中起始点黄色,中间点蓝色,最后一个点红色。

在原来的代码中添加:

            chartWnd.GetChart()->SetDataLineSize(5, 1);
			chartWnd.GetChart()->SetDataMultiColorMode(true, 1);
			chartWnd.GetChart()->SetDataMultiColorInputType(0, 1);
			chartWnd.GetChart()->AddSegmentColor(0.0, RGB(255, 255, 0), 1);
			chartWnd.GetChart()->AddSegmentColor(0.5, RGB(0, 0, 255), 1);
			chartWnd.GetChart()->AddSegmentColor(1.0, RGB(255, 0, 0), 1);

图像如下。

 

可见图像和我们预想的完全一样。

当然这里的多色渐变只采用了三个颜色,采用更多的颜色也是完全没有问题的。

A55.4 曲线逐点定色模式

要让曲线颜色丰富,多色渐变是一种方法。CChart还提供了另一种方法,就是逐点定色模式,也就是每一个数据点设置一个颜色,数据点之间的连线颜色是渐变的。

逐点定色模式在CChart内部维护了一个颜色数组,该数组的长度应该和对应曲线的数据点数一致。如果颜色数组的长度不等于对应曲线的数据点数,那么逐点定色模式无效,曲线按基本模式绘制。

与逐点定色相关的接口如下:

void		CChart::SetColorPtByPt(bool bBy, int nDataIndex, int nPlotIndex=0);

此接口用于设置某条曲线的逐点定色模式。

void		CChart::AddDataPointColor(COLORREF color, int nDataIndex, int nPlotIndex=0);

此接口用于维护颜色数组。

每次可以在颜色数组末尾添加一个颜色。为了保证颜色数组的长度等于对应曲线的数据点数,此接口可能需要多次调用。

void		CChart::SetDataPointColors(COLORREF *pColor, int nLen, int nDataIndex, int nPlotIndex=0);

此接口用于直接设置颜色数组。

一般情况下,nLen应该和对应曲线的数据点数一致。如果不一致,应该调用其它的颜色数组维护接口加以增删。

void		CChart::SetDataPointColor(COLORREF color, int nPointIndex, int nDataIndex, int nPlotIndex=0);

此接口用于设置颜色数组一个特定点的颜色。

此接口应该在颜色数组建立以后才能使用,nPointIndex对颜色数组不应越界。

void		CChart::EraseDataPointColor(int nPointIndex, int nDataIndex, int nPlotIndex=0);

此接口用于删除颜色数组一个特定点。

此接口应该在颜色数组建立以后才能使用,nPointIndex对当前颜色数组不应越界。

void		CChart::InsertDataPointColor(COLORREF color, int nPointIndex, int nDataIndex, int nPlotIndex=0);

此接口用于在颜色数组中增加一个点。

同样,nPointIndex对当前颜色数组不应越界。

下面继续开展实验。

为简便,我们在图像上添加一条只有四个点的曲线,代码如下。

            chartWnd.GetChart()->AddPoint2D(-10, 0, 3);
			chartWnd.GetChart()->AddPoint2D(-5, 2, 3);
			chartWnd.GetChart()->AddPoint2D(5, 2, 3);
			chartWnd.GetChart()->AddPoint2D(10, 0, 3);
			chartWnd.GetChart()->SetDataLineSize(6, 3);

同样,我们把曲线加粗了。图像如下。

 下面把四个数据点分别设置为红、黄、绿、蓝,代码如下:

            chartWnd.GetChart()->SetColorPtByPt(true, 3);
			chartWnd.GetChart()->AddDataPointColor(RGB(255, 0, 0), 3);
			chartWnd.GetChart()->AddDataPointColor(RGB(255, 255, 0), 3);
			chartWnd.GetChart()->AddDataPointColor(RGB(0, 255, 0), 3);
			chartWnd.GetChart()->AddDataPointColor(RGB(0, 0, 255), 3);

注意到这里AddDataPointColor一共调用了四次,和数据点的个数一致。

图像如下。

 

怎么样,颜色还是挺艳的吧!

这一课就结束了。从这里也可以窥豹一斑,看到CChart功能的丰富性。

本节课的这些颜色设置功能已经实现很久了,本来几年前就想写这一课的内容,但由于各种原因,一直没有动笔。这次终于完成了这个任务!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值