当前位置:C++技术网 > 资讯 > “手电筒“式的球体

“手电筒“式的球体

更新时间:2015-11-29 15:39:04浏览次数:1+次

默认情况下,路径的中心点是定义路径的各个点坐标的平均值。调用PathGradientBrush类的成员函数SetCenterPoint可以对路径渐变画刷的中心点进行调整。由于路径画刷色彩的渐变体现在中心点到边缘点之间的色彩。所以,如果对路径渐变画刷的中心点进行调整,整个填充效果将会是另一种情景。对于渐变画刷的中心点,可以做个形象的比喻:如果在一个区域周围使用手电筒进行照射,那么手电筒的灯泡就相当于渐变画刷的中心点,使用SetCenterPoint函数就相当于移动手电筒,中心点在很大程度上适用于对立体图形的处理。代码实现在程序中动态的更改花刷的中心点,从而实现一个球体的填充效果。

写GDI+程序,你需要加一些代码,我在之前的很多文章都写了,你去了解下。新建单文档工程,在菜单中加一个菜单项,并在新

加的菜单项下,新增一个子菜单项。看图:

为子菜单项“更改路径画刷中点”建立消息响应,在其中写入代码:

void CPathBrushCenterView::OnBrushpathcenterpoint()
{
	// TODO:  在此添加命令处理程序代码
	Graphics graphics(this->m_hWnd);
	this->RedrawWindow();
	/////构造一个圆形区域
	GraphicsPath path;
	path.AddEllipse(0, 0, 200, 200);
	SolidBrush brush(Color(155, 255, 0, 0));
	/////构造一个圆形路径渐变画刷
	PathGradientBrush pthGrBrush(&path);
	/////设置中心点色彩
	pthGrBrush.SetCenterColor((Color(155, 255, 255, 255)));
	Color colors[] = {
		Color(55, 0, 0, 255)//////第一个参数可以理解为颜色对比度
	};
	INT count = 1;
	/////设置边缘色
	pthGrBrush.SetSurroundColors(colors, &count);
	/////填充区域,使用单色画刷
	graphics.FillEllipse(&pthGrBrush, 0, 0, 200, 200);
	Point CenterPoint;
	pthGrBrush.GetCenterPoint(&CenterPoint);
	////////更该画刷的中心点,沿圆周的上半部分平移
	for (int i = 0; i < 200; i++)
	{
		CenterPoint.X = i;
		CenterPoint.Y = 10; 
		pthGrBrush.SetCenterPoint(CenterPoint);
		graphics.FillEllipse(&pthGrBrush, 0, 0, 200, 200);
		//////标记当前中心点
		graphics.FillEllipse(&brush, CenterPoint.X, CenterPoint.Y, 5, 5);
		//Sleep(1000);
	}
	/////更改画刷的中心点,沿圆周的下半部分平移
	for (int i = 200; i>0; i--)
	{
		CenterPoint.X = i;
		CenterPoint.Y = 190;
		pthGrBrush.SetCenterPoint(CenterPoint);
		graphics.FillEllipse(&pthGrBrush, 0, 0, 200, 200);
		graphics.FillEllipse(&brush, CenterPoint.X, CenterPoint.Y, 5, 5);
		//Sleep(1000);
	}
}
代码实现图:

最后一张是最终代码实现图。

你取消掉sleep的注释。你就会看到有”手电筒“般的效果。

使用默认的画刷中心点时,白色圆环位于蓝色圆圈的中央;当中心点的位置变动后,白色圆环也随之移动,从而产生一种光照效果。同时,上述代码在对中心点的位置进行更改时,也示意了中心点位于路径之外时画刷的填充效果。渐变画刷的色彩渐变原理是,中心点距离渐变区域越近,中心点色彩在渐变区域中的部分越多,反之越少。更改渐变路径的中心点位置对渐变画刷填充效果的影响仅仅体现在中心点色彩在整个渐变区域的分布比例。这就是”手电筒“效果的原理。你好好跑一遍程序,理解下,就很简单。