常用的绘图函数
DrawArc绘制一个弧形
示例:graphics.DrawArc(pen,,,,,,)
倒数第二个参数,表示起始度数,最后一个参数是弧形的跨越度数。比如起始度数是90,跨越度数是120的弧形如下图: 红色的是弧形。类似的方法还有DrawPie绘制一个扇形和FillPie填充一个扇形。都有起始度数,跨越度数。
DrawPolygon绘制多边形
示例: Point []pt=new Point[]{new Point(,),new Point(,),new Point(,)};
graphics.DrawPolygon(pen, pt);
Point数组指定每个点的位置,和点的数量。DrawPolygon绘制的多边形是闭合的,DrawPolygon会自动把第一点和最后一个点连接起来。
DrawCurve绘制基数样条
示例:Point[] pt = new Point[] { new Point(, ), new Point(, ),new Point(,)};
graphics.DrawCurve(pen, pt, 1.5f);
最后一个参数表示张力值,对这个绘制函数,具体我不是很了解,只能大概知道是怎么一回事。算是不能运用自如吧。
至少要有三个点,才能构成一个曲线。可以看一个图,我从GDI+参考资料上复制过来的。张力值不同的曲线表现: DrawBezier绘制贝赛尔样条
示例:graphics.DrawBezier(pen, , , , , , , , )
贝塞尔样条是由四个点构成的。第一个点,和最后一个点充当直线的两点,而另外两个点充当磁铁的作用,虽然线条不经过这两个磁铁点,
但这两个磁铁点会把线条往它那边吸。从而构成了贝赛尔样条。看图(左边图片来源:GDI+参考资料)两个贝塞乐样条示例: 路径GraphicsPath
可以到http://hi.baidu.com/3582077/blog/item/8e0204c245d82523e4dd3b47.html里了解一些概念,第九十二个函数。
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(, , ), );
Rectangle rect = new Rectangle(, , , );
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(, , , );
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(, );
路径画刷多种颜色渐变
多种颜色渐变在之前的线性渐变画里已经介绍过了,那么路径多种颜色渐变也是大同小异的,直接看示例吧: private void formPaint(Object sender, PaintEventArgs e)
{
//创建路径
GraphicsPath path = new GraphicsPath();
Rectangle rect = new Rectangle(, , , );
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[]{/3f,/3f,/3f};
brush.InterpolationColors = color_blend;
//用路径画刷填充一个矩形
e.Graphics.FillRectangle(brush, rect);
}
效果图: 中心点的颜色是color_blend.Colors数组的最后一个,像多种颜色渐变,你可以把中心点,到路径上的每一个点,看做一条条直线,然后这条线的3分之2是什么颜色到什么颜色渐变,3分之一又是哪种颜色到哪种颜色渐变。
上面的是红到绿渐变范围是:~/,绿到白(中心点颜色):/~; 假设整条直线的长度用1来代替。另外这个也可以自定义中心点位置。
用点构成的路径画刷
示例:
private void formPaint(Object sender, PaintEventArgs e)
{
Rectangle rect = new Rectangle(, , , );
Point []pts=new Point[]{new Point(,),new Point(,),new Point(,)};
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(, , , );
Point[] pts = new Point[] { new Point(, ), new Point(, ), new Point(, )};
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(, , , );
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);
}
效果图: 四个角点处颜色,用眼睛可以看得出大概的区别,分别是黑,红,蓝,绿。对应着左上(,),右上(,),右下(,),
左下(,)四个角点。
再来说一下这个渐变画刷是怎么看的,或者说是依据什么来的。首先在SurroundColos指定了角点(,)为Color.Black,
角点(,)为Color.Red,而这两个点可以连成一条直线。这条直线还是渐变的,从黑色到红色。并且这条直线是在路径上的。
那么这条路径(直线)上的各个点就有不同的颜色了。
比如(,)是黑色,(,)是淡一点的黑色,。。。。。(,)是暗红色(,)是红色。
而中心点颜色是白色,这样中心点到0,0这条直线就是从白色到黑色渐变,而到(,)是从白色到淡一点的黑色渐变。
其它角点上的渐变也是如此。
按着这样规则就组成了上面的渐变。
再来个三角形的例子:
private void formPaint(Object sender, PaintEventArgs e)
{
//创建路径
GraphicsPath path = new GraphicsPath();
Point []pts = new Point[] { new Point(, ), new Point(, ), new Point(, ) };
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);
}
效果图: 了解上面的知识点后,可以试着做一个五角星图形的例子(用路径渐变画刷,并使用不同的角点颜色)。

转:http://hi.baidu.com/3582077/item/1d345e6b97e1e237ac3e8352

C# GDI+编程(二)的更多相关文章

  1. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  2. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  3. GDI编程小结

    图形设备接口(GDI)是一个可运行程序,它接受Windows应用程序的画图请求(表现为GDI函数调用),并将它们传给对应的设备驱动程序,完毕特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  4. MFC控件GDI编程

    MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...

  5. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  6. 一篇文章让你彻底弄懂WinForm GDI 编程基本原理

    一 GDI编程原理 GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. GDI的常用 ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  9. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  10. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

随机推荐

  1. mysql DOS中中文乱码 ERROR 1366 (HY000): Incorrect string value: '\xC4\xEA\xBC\xB6' for column 'xxx' at row 1

    问题:ERROR (HY000): Incorrect string value: 在DOS中插入或查询中文出现乱码 登入mysql,输入命令:show variables like '%char%' ...

  2. python open函数关于w+ r+ 读写操作的理解(转)

    r 只能读 (带r的文件必须先存在)r+ 可读可写 不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆 ...

  3. 期望dp——zoj3640

    /* dp[i]表示力量为i时的期望 dp[i]=sum{tj}/n+sum{dp[i+cj]+1}/n //前一项是cj<i的和,后一项是cj>=i的和 初始状态dp[m] */ #in ...

  4. tp5 mkdir() 没有权限

  5. Http学习(一)

    HTTP 超文本传输协议 综述: HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从 ...

  6. LightOJ-1259-Goldbach`s Conjecture-素数打表+判断素数对数

    Goldbach's conjecture is one of the oldest unsolved problems in number theory and in all of mathemat ...

  7. day 54 Django基础四之模板系统

    Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模 ...

  8. HTTP协议响应篇

    http响应的基本介绍 一个HTTP响应代表服务器向客户端回送的数据, 由三个部分构成 状态行[200 , 302 304, 403, 404, 500] 响应消息头 返回的实体内容 http响应状态 ...

  9. PHP面向对象魔术方法之__call函数

    l 基本介绍: (1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用. (2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 p ...

  10. 深入浅出写一个多级异步回调从基础到Promise实现的Demo

    今天一时兴起,写了一个渐进升级的异步调用demo,记录一下. 1. 最基础的同步调用 //需求:f2在f1之后执行,且依赖f1的返回值.如下: function f1(){ var s="1 ...