提到绘图在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+相关的类非常繁杂,不可能把每个类的功能都作详细的介绍,我们应把精力放在最重要的方面——理解绘图的基 本规则。
对于绘图 不过多介绍,我认为这个东西没必要一点一点认真去学习,只需要大概了解一下。因为这不是咱们编程的重点,并且这个东西不是理解型的。到时候用的时候有概念就行,可以再上网查找具体的实现的方法。