自学C#之路12——绘图

提到绘图在MFC中很容易想到GDI,GDI提供了很多基本的绘图操作。但是难以完成复杂的绘图。所以微软额外提供了Microsoft Windows GDI+。Microsoft Windows GDI+是为 C/C++开发者提供的一个基于类的应用程序编程接口(API)。 使用前需要外部链接。

但C#背靠.net好乘凉。在.NET 中直接通过 GDI+(Graphics Device Interface Plus) 来绘制图形。

GDI+特点

1、不再使用设备环境或句柄 

在使用GDI绘图时,必须要指定一个设备环境(DC),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。而GDI+不再使用这个设备环境或句柄,取而代之是使用Graphics对象。与设备环境相类似,Graphics对象也是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。但是,只有这个Graphics对象与设备环境句柄还存在着联系,其余的如Pen、Brush、Image和Font等对象均不再使用设备环境。 

2、Pen、Brush,Font,Image等对象是图形对象独立的

  画笔对象能与用于提供绘制方法的图形对象分开创建于维护,Graphics绘图方法直接将Pen对象作为自己的参数,从而避免了在GDI使用SelectObject进行繁琐的切换,类似的还有Brush、Path、Image和Font等。 

3、“当前位置”

  GDI绘图操作(如画线)中总存在一个被称为"当前位置"的特殊位置。每次画线都是以此当前位置为起始点,画线操作结束之后,直线的结束点位置又成为了当前位置。设置当前位置的理由是为了提高画线操作的效率,因为在一些场合下,总是一条直线连着另一条直线,首尾相接。有了当前位置的自动更新,就可避免每次画线时都要给出两点的坐标。尽管有其必要性,但是单独绘制一条直线的场合总是比较多的,因此GDI+取消这个"当前位置"以避免当无法确定"当前位置"时所造成的绘图的差错,取而代之的是直接在DrawLine中指定直线起止点的坐标。    

4、绘制和填充

  GDI总是让形状轮廓绘制和填充使用同一个绘图函数,例如Rectangle。轮廓绘制需要一个画笔,而填充一个区域需要一个画刷。也就是说,不管我们是否需要填充所绘制的形状,我们都需要指定一个画刷,否则GDI采用默认的画刷进行填充。这种方式确实给我们带来了许多不便,现在GDI+将形状轮廓绘制和填充操作分开而采用不同的方法,例如DrawRectangle和FillRectangle分别用来绘制和填充一个矩形。    

5、区域的操作

  GDI提供了许多区域创建函数,如:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等。诚然,这些函数给我们带来了许多方便。但在GDI+中,由于为了便于将区域引入矩阵变换操作,GDI+简化一般区域创建的方法,而将更复杂的区域创建交由Path接管。由于Path对象是与设备环境分离开来的,因而可以直接在Region构造函数中加以指定。

和 GDI+相关的类分布在下列命名空 间中: 

System.Drawing; 
System.Drawing.Drawing2D; 
System.Drawing.Imaging; 
System.Drawing.Text; 
System.Drawing.Printing; 

System.Drawing 命名空间提供了最基本的绘图功能(比如画直线、矩形、椭圆等);

System.Drawing.Drawing2D 命名空间提供了高级的二维和矢量绘图功能(比如渐变、 图案填充、轨迹等);

System.Drawing.Imaging 命名空间提供图像处理功能,System.Drawing. Text 命名空间提供排版功能;

System.Drawing.Printing 命名空间则提供与打印相关的 服务;

 

绘图前我们需要知道两个基本知识:

1.界面坐标系

如下图所示

坐标系中的点用 Point 类表示,Point 类的 X 属性和 Y 属性代表该点的横坐标和纵坐标。 另外窗体的大小用 Size 类表示,矩形区域用 Rectangle 类表示。

 

2.颜色

 

在计算机中,颜色用RGB表示,红、绿、蓝三种颜色分量的取值范围在 0~255 之间,所以显示器共能表 示 2563 =16777216 种颜色。

 

Graphics类 

在.NET 中,最核心的绘图类是 Graphics 类,通过它的属性和方法可以非常方便的画 出各种基本图形。

实例:画一条斜线

 

Graphics g = this.CreateGraphics(); //创建 Graphics 对象
Pen pen = new Pen(Color.Red, 5);
Point startPoint = new Point(50, 80);
Point endPoint = new Point(250, 100);
g.DrawLine(pen, startPoint, endPoint); //画直线
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;//高质量
g.CompositingQuality = CompositingQuality.HighQuality;//再加一点
g.TranslateTransform(0, 120); 
g.DrawLine(pen, startPoint, endPoint); //画直线
pen.Dispose(); //释放资源
g.Dispose();

 

普通绘图和抗锯齿绘图对比

与 GDI+相关的类非常繁杂,不可能把每个类的功能都作详细的介绍,我们应把精力放在最重要的方面——理解绘图的基 本规则。

对于绘图 不过多介绍,我认为这个东西没必要一点一点认真去学习,只需要大概了解一下。因为这不是咱们编程的重点,并且这个东西不是理解型的。到时候用的时候有概念就行,可以再上网查找具体的实现的方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值