常用的绘图函数
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)
贝塞尔样条是由四个点构成的。第一个点,和最后一个点充当直线的两点,而另外两个点充当磁铁的作用,虽然线条不经过这两个磁铁点,
但这两个磁铁点会把线条往它那边吸。从而构成了贝赛尔样条。看图(左边图片来源: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(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);}
效果图:了解上面的知识点后,可以试着做一个五角星图形的例子(用路径渐变画刷,并使用不同的角点颜色)。

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

转载于:https://www.cnblogs.com/qq1223558/p/3593737.html

C# GDI+编程(二)相关推荐

  1. GDI+编程说明及小结

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

  2. C#GDI+编程基础

    C#GDI+编程基础(一) C#GDI+基础(二)画刷详解 C#GDI+图像处理 转载于:https://www.cnblogs.com/halou/archive/2013/02/18/291626 ...

  3. Windows GDI和GDI+编程实例剖析(1)

    Windows GDI和GDI+编程实例剖析(1) 作者:宋宝华  e-mail:21cnbao@21cn.com 1.基本概念 GDI在Windows中定义为Graphics Device Inte ...

  4. c#创建画布_C#GDI+编程基础(一:Graphics画布类)

    GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...

  5. MFC之GDI GDI+ 编程实例剖析

    GDI和GDI+编程实例剖析 1.基本概念  GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Pro ...

  6. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  7. GDI编程注意点-1

    最近接触GDI编程比较多,就把常见的技巧和注意点整理成一个系列吧,希望对大家有帮助. 1.TextOut的基本使用 TextOut的属于比较老的文本输出函数,但是简单的文本输出和格式控制使用它非常方便 ...

  8. Linux shell脚本编程(二)

    Linux shell脚本编程(二) -------------------------------------------------------------------- 注:如果你对python ...

  9. Linux 串口编程二 深入了解 termios

    前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识.如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈.关于 tty驱动架构参见我的其他博客: ...

  10. 侯捷面向对象高级编程(二)

    侯捷面向对象高级编程(二) 转换函数 转换函数没有返回值,返回值就是double即函数名,不需要自己写 因为转换函数一般不会改变其中内容,所以要加const限定 两条路都可以走,就回产生歧义,报错 e ...

最新文章

  1. 第十六节:语法总结(3)(C#6.0和C#7.0新语法)
  2. bootstraptable 加载完成_bootstrap table onLoadSuccess加载服务端数据成功事件
  3. [Java] Hashmap分析
  4. C#通过COM组件操作IE浏览器(四):实用代码总结
  5. HALCON示例程序class_2dim_unsup.hdev基于二维直方图的聚类分类
  6. 国内是否可以安装alexa_Alexa可以听到您无法听到的命令,哪些黑客可以利用
  7. 如何优化 .NET Core 中的 lambda 查询表达式 ?
  8. Tomcat 服务器只能存有一个正在运行的项目
  9. 使用 PowerShell 自动登录 Azure
  10. php登录实现session记住密码,利用php实现一周之内自动登录存储机制(cookie、session、localStorage)...
  11. 自学python-python自学难吗
  12. 主机网络切换后,docker toolbox里的容器网络不通了,解决方法
  13. 关于Java Web打印
  14. 1075c语言程序设计答案,山东理工大学ACM平台题答案关于C语言 1075 Doubles
  15. 惠普HP Laser MFP 137fnw 一体机驱动
  16. 无法更新 EntitySet“Ips_Articles”,因为它有一个 DefiningQuery,而 ModificationFunctionMapping 元素中没有支持当前操作的 Inse...
  17. 储备物资管理局计算机,国考报名税务过审居首 储备物资管理局最抢手
  18. word怎么拆分表格
  19. 29.7 MySQL灾难恢复
  20. 如何利用抖音精选联盟,实现月入10000+

热门文章

  1. MPEG-7 视觉描述符
  2. P3605 [USACO17JAN]Promotion Counting晋升者计数
  3. Linux网络相关知识
  4. vue 路由传参 params 与 query两种方式的区别(转载)
  5. 2018年1月29日
  6. Python学习笔记010——作用域
  7. hive 数据存储格式详解
  8. Exact跻身全球发展最快的云企业行列
  9. 前端开发学习笔记 - 1. Node.JS安装笔记
  10. 【NetApp】FC盘不能和装有ATA盘的DS14盘柜接入同一个loop中。