常用的绘图函数
drawarc绘制一个弧形
示例:graphics.drawarc(pen,0,0,200,200,90,120)
倒数第二个参数,表示起始度数,最后一个参数是弧形的跨越度数。比如起始度数是90,跨越度数是120的弧形
红色的是弧形。类似的方法还有drawpie绘制一个扇形和fillpie填充一个扇形。都有起始度数,跨越度数。
drawpolygon绘制多边形
示例: point []pt=new point[]{new point(0,50),new point(0,100),new point(100,100)};
graphics.drawpolygon(pen, pt);
point数组指定每个点的位置,和点的数量。drawpolygon绘制的多边形是闭合的,drawpolygon会自动把第一点和最后一个点连接起来。
drawcurve绘制基数样条
示例:point[] pt = new point[] { new point(0, 0), new point(100, 50),new point(200,0)};
graphics.drawcurve(pen, pt, 1.5f);
最后一个参数表示张力值,对这个绘制函数,具体我不是很了解,只能大概知道是怎么一回事。算是不能运用自如吧。
至少要有三个点,才能构成一个曲线。可以看一个图,我从gdi+参考资料上复制过来的。
drawbezier绘制贝赛尔样条
示例:graphics.drawbezier(pen, 100, 0, 200, 20, 0, 80, 100, 100)
贝塞尔样条是由四个点构成的。第一个点,和最后一个点充当直线的两点,而另外两个点充当磁铁的作用,虽然线条不经过这两个磁铁点,
但这两个磁铁点会把线条往它那边吸。从而构成了贝赛尔样条。
路径graphicspath
graphicspath类属性system.drawing.drawing2d命名空间
路径是各种各样线条组成的,那么,矩形也可以看做是由四条直线组成的,圆形也可以看做是由几个弧形组成的。
所以graphicspath类里就有了添加各种形状的路径函数,如addline直线路径,addellipse椭圆路径,addrectangle矩形路径,
addbezier贝塞尔路径,addstring字符串路径等。
这些路径添加进去了,当然是看不着的,我们可以用graphics类里的drawpath函数把路径的轨迹描述出来,用画笔。
看示例:
private void formpaint(object sender, painteventargs e)
{
graphics graphics = e.graphics;
pen pen = new pen(color.fromargb(0, 255, 0), 2);
rectangle rect = new rectangle(10, 10, 100, 100);
graphicspath grcpath = new graphicspath();
grcpath.addrectangle(rect);
grcpath.addellipse(rect);
//添加字符串路径
fontfamily famfont = new fontfamily(黑体);
grcpath.addstring(a, famfont, (int)fontstyle.underline, 80f, rect, null);
//绘制路径
graphics.drawpath(pen, grcpath);
}
路径画刷 pathgradientbrush
使用示例:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
rectangle rect = new rectangle(0, 0, 100, 100);
path.addrectangle(rect);
//创建路径画刷
pathgradientbrush brush = new pathgradientbrush(path);
//中心点颜色是白色
brush.centercolor = color.white;
//路径(点)上的颜色是黑色
brush.surroundcolors = new color[] { color.black };
//用路径画刷填充一个矩形
e.graphics.fillrectangle(brush, rect);
}
上面的中心点颜色是白色,路径(点)上的颜色是黑色,也就是说,从中心点到每一个路径上的点,都是白到黑渐变的。
另外也可以自己指定中心点,如果不想用pathgradientbrush计算的中心点,就指定centerpoint,如brush.centerpoint = new point(20, 50);
路径画刷多种颜色渐变
多种颜色渐变在之前的线性渐变画里已经介绍过了,那么路径多种颜色渐变也是大同小异的,直接看示例吧:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
rectangle rect = new rectangle(0, 0, 100, 100);
path.addrectangle(rect);
//创建路径画刷
pathgradientbrush brush = new pathgradientbrush(path);
//创建colorblend对象,指定多种颜色渐变信息
colorblend color_blend=new colorblend();
//指定几种颜色
color_blend.colors=new color[]{color.red,color.green,color.white};
//指定颜色的范围
color_blend.positions=new float[]{0/3f,2/3f,3/3f};
brush.interpolationcolors = color_blend;
//用路径画刷填充一个矩形
e.graphics.fillrectangle(brush, rect);
}
中心点的颜色是color_blend.colors数组的最后一个,像多种颜色渐变,你可以把中心点,到路径上的每一个点,看做一条条直线,然后这条线的3分之2是什么颜色到什么颜色渐变,3分之一又是哪种颜色到哪种颜色渐变。
上面的是红到绿渐变范围是:0~2/3,绿到白(中心点颜色):2/3~1; 假设整条直线的长度用1来代替。另外这个也可以自定义中心点位置。
用点构成的路径画刷
示例:
private void formpaint(object sender, painteventargs e)
{
rectangle rect = new rectangle(0, 0, 100, 100);
point []pts=new point[]{new point(50,0),new point(0,100),new point(100,100)};
pathgradientbrush brush=new pathgradientbrush(pts);
//中心点颜色
brush.centercolor=color.white;
//路径点上的颜色
brush.surroundcolors=new color[]{color.black};
e.graphics.fillrectangle(brush, rect);
}
这种用点构成的图形,是路径画刷直接创建的,没有通过graphicspath,也可以指定三个以上的点,路径画刷会自动把这些点连接起来(按顺序),构成一个图形的,然后再填充,但填充的范围只限于这些点构成的图形内。就像上面,是用这个画刷填充一个矩形,
但超出这个三角图形的部分没有被填充。这个跟图形路径是一回事,只限于填充路径里面的。这个图形创建也可以通过graphicspath方式来完成,比如里面的添加addpolygon多边形路径函数。然后再用graphics类里的fillpolygon函数填充。
另外也可以用addlines添加路径函数来完成,这个函数是用直来组成的图形,但究其根底还是用点来组成的,两点构成一条直线嘛!
不过组成的图形必须是闭合的,不然无法达到想要的结果。然后调用fillpath填充路径。
addlines示例:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
rectangle rect = new rectangle(0, 0, 100, 100);
point[] pts = new point[] { new point(50, 0), new point(0, 100), new point(100, 100)};
path.addlines(pts);
pathgradientbrush brush = new pathgradientbrush(path);
//中心点颜色
brush.centercolor=color.white;
//路径点上的颜色
brush.surroundcolors=new color[]{color.black};
e.graphics.fillpath(brush, path);
}
fillpath函数就像drawpath一样,不过drawpath是用画笔来描述路径的,而fillpath是用“填充”来描述路径的。
注意fillpath填充的路径有一定的限制,闭合。不要起冲突。
pathgradientbrush类里的surroundcolors属性成员,路径点上的多种颜色
在之前,我只指定了一种颜色,surroundcolors是个color数组,那么它就可以指定多种颜色。指定的是一个图形上角点的颜色,
比如三角形,它有三个角,就可以给这三个角点指定不同的三种颜色,但不能是四种颜色,因为三角形只有三个角,超出范围了就会出错。
矩形也一样的,可以指定四种颜色,但如果指定的颜色数量少于角点数,比如矩形,我只指定一个角点的颜色。
那么剩下的角点都使用的都是surroundcolors数组最后一个颜色值。
拿路径画刷的第一个例子来说,我们把它修改一下,指定四个角点的颜色。如下:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
rectangle rect = new rectangle(0, 0, 100, 100);
path.addrectangle(rect);
//创建路径画刷
pathgradientbrush brush = new pathgradientbrush(path);
//中心点颜色是白色
brush.centercolor = color.white;
//指定不同角点的颜色
brush.surroundcolors = new color[] { color.black,color.red,color.green,color.blue };
//用路径画刷填充一个矩形
e.graphics.fillrectangle(brush, rect);
}
四个角点处颜色,用眼睛可以看得出大概的区别,分别是黑,红,蓝,绿。对应着左上(0,0),右上(100,0),右下(100,100),
左下(0,100)四个角点。
再来说一下这个渐变画刷是怎么看的,或者说是依据什么来的。首先在surroundcolos指定了角点(0,0)为color.black,
角点(100,0)为color.red,而这两个点可以连成一条直线。这条直线还是渐变的,从黑色到红色。并且这条直线是在路径上的。
那么这条路径(直线)上的各个点就有不同的颜色了。
比如(0,0)是黑色,(1,0)是淡一点的黑色,。。。。。(99,0)是暗红色(100,0)是红色。
而中心点颜色是白色,这样中心点到0,0这条直线就是从白色到黑色渐变,而到(1,0)是从白色到淡一点的黑色渐变。
其它角点上的渐变也是如此。
按着这样规则就组成了上面的渐变。
再来个三角形的例子:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
point []pts = new point[] { new point(50, 0), new point(0, 100), new point(100, 100) };
path.addlines(pts);
pathgradientbrush brush=new pathgradientbrush(path);
//中心点颜色白色
brush.centercolor=color.white;
//角点颜色:红,绿,蓝。按pts数组顺序依次
brush.surroundcolors = new color[] { color.red, color.green, color.blue };
//用路径画刷填充路径
e.graphics.fillpath(brush, path);
}
了解上面的知识点后,可以试着做一个五角星图形的例子(用路径渐变画刷,并使用不同的角点颜色)。
更多c# gdi+编程(二)。