GDI+学习笔记(六)渐变画刷

画刷,顾名思义,就是像画刷一样,向设备上绘制,还记得小时候常唱的首歌,"我是一个粉刷匠.." 好吧,跑题了。

本系列博客希望尽可能简单的描述每项功能,而不希望把每个参数都介绍的详详细细,如果需要,请查阅msdn,本节讲述的渐变画刷,主要有两种,一种是叫线性画刷(LinearGradientBrush),还有一种叫路径画刷(PathGradientBrush),我希望以一种尽可能简单的方式去描述它,但能力有限,所以有什么意见,希望各位能帮忙提出,谢谢。

(一)使用画刷

上一节中,我们实际上实现了上中下三个面,然后所有的内容都会绘制上一种颜色或者一张图片。而绘制颜色其实本质上就是一种特殊的画刷,而这里我们将使用更高级的画刷--渐变的画刷来取代它们。

因此,我们本节的工作,就是要取代上一节中graphics.clear()的工作。其他的与上节内容没有任何区别。

(二)线性画刷

我们需要初始化一个线性画刷,代码如下:

		LinearGradientBrush *lgb = new LinearGradientBrush(Point(0,0), Point(100,0),
			Color::Blue, Color::Green);

简单说明一下参数,前两个参数,是两个点,这两个点组成了方向向量,唯一标记了渐进的方向。

后面两个参数,是两个颜色,指的是开始和结束的两个点的颜色。如果我们希望中间增加几组呢?我们可以设置插值,具体可以查阅GDI+的API函数:SetInterpolationColors。

然后,我们填充一下Graphics就可以了,代码如下:

bmpGraphics.FillRectangle(lgb, 0, 0, 100, 100);

ok,看看效果:

(三)路径画刷

相对比线性画刷,路径画刷就稍微复杂一点。它同样是一种渐进变化的画刷,但它是从一个闭合路径的中心点向路径中渐变的一种画刷。闭合路径的中心点默认是路径的几何中心,当然我们也可以通过SetCenterPoint来进行中心点的设置。

既然如此,那么我们首先需要定义一个闭合路径,这里我们定义一个正方形

		GraphicsPath *gp = new GraphicsPath;
		Point p[] = {
			Point(0,0),Point(100,0),Point(100,100),Point(0,100)
		};
		gp->AddLines(p, 4);

然后,用这个正方形为路径渐进画刷初始化

		PathGradientBrush *pgb = new PathGradientBrush(gp);

这之后,我们还需要设置中心的颜色和四周的颜色。

		pgb->SetCenterColor(Color::White);

		Color surroundColors[] = {
			Color::Red,
			Color::Green,
			Color::Blue,
			Color::Yellow
		};
		int nCount = 4;
		pgb->SetSurroundColors(surroundColors, &nCount);

最后,填充路径

bmpGraphics.FillPath(pgb, gp);

至此,我们就完成了渐进画刷的绘制,只需要按照上节的内容,将其会知道hdc对应的graphics中即可,看看效果:

(四)在正方体上使用渐进画刷

只需要将上述内容会知道正方体上的三个面即可,直接看看效果吧:

(五)其他说明

有很多细节的操作,还需要具体使用中多多尝试,才能更熟练的使用。

GDI+学习笔记(六)渐变画刷,布布扣,bubuko.com

时间: 2024-12-25 21:28:28

GDI+学习笔记(六)渐变画刷的相关文章

C# GDI+学习笔记1

?前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTest_Article1_161112_2346.rar 如果有什么疑问,或者建议,请留言联系本人. 1 窗口重绘 ?Windows自动处理鼠标拖动窗体.更改窗体大小等用户操作,自动调整窗体所占屏幕区域的大小,并进行重画 当需要重画时,Windows发送消息WM_PAINT 窗体对象的Paint事件用于

GDI+学习笔记(五)绘制一个正方体

本文将介绍如何利用GDI+绘制一个正方体. (一)准备阶段 想象一下,高中的时候,我们在学立体几何的时候是怎样画一个正方体的,我们在一张纸上利用投影的思路将其绘制在一张纸上,对吧,这计算投影的部分,我们暂且忽略.下图是我用windows的画图绘制的一个正方体: 我们计算出这些点在平面上的坐标如下: Point A(100,200); Point B(200,200); Point C(100,300); Point D(200,300); Point E(100+50*1.414, 200-50

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

C#GDI+基础(三)画刷详解

SolidBrush:一般的画刷,通常只用一种颜色去填充GDI+图形 创建一般画刷: SolidBrush sbBrush1 = new SolidBrush(Color.Green); HatchBrush:阴影画刷,有两种颜色:前景色和背景色创建阴影画刷: HatchBrush(HatchStyle,Color);//前景 HatchBrush(HatchStyle,Color,Color)://前景.背景 HatchStyle对应阴影方案列表. 名称 说明 BackwardDiagonal

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th