GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有 Windows 程序的图形输出。在 Windows 操作系统下,绝大多数具备图形界面的应用程序都离不开 GDI,我们利用GDI 所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。
GDI+对 GDI 进行了性能优化,并添加了许多新的功能。GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,GDI+使得图形硬件和应用程序相互隔离,从而使开发人员编写设备无关的应用程序变得非常容易。GDI+的核心是 Graphics 对象,Graphics 类定义了绘制和填充图形对象的方法和属性。Graphics 类的属性(字段)很多,具体可参见 MSDN。Graphics 类的方法分为三类:绘制、填充及其他。
1 GDI+用途
一般来说,GDI+在以下场景中具有广泛的应用:
- 2D 向量图:利用 GDI+,我们可以绘制直线、曲线、矩形和椭圆等形状,并且可以绘制路径,并填充区域。
- 图片:GDI+可以将位图图片渲染到界面上,同时支持对位图进行各类操作(例如缩放、旋转等)。
- 字体排印:GDI+可以让我们渲染出光滑的反锯齿的文本,同时可以设置其大小、字体、颜色和方向等。
2 GDI+绘制
既然 GDI+在界面绘制上占有重要的地位,那么问题来了,如何才能调用 GDI+绘制对象呢?常用的方式为重载控件的 OnPaint 事件,然后在事件内进行 GDI+绘制,请看下面的代码:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; namespaceGDIDemo{ publicpartialclassForm1 : Form { publicForm1() { InitializeComponent(); } privatevoidForm1_Load(objectsender, EventArgse) { //绘图无效PendrawingPen=newPen(Color.Black, 3); this.CreateGraphics().DrawArc(drawingPen, 36, 19, 100, 100, 40, 180); drawingPen.Dispose(); } protectedoverridevoidOnPaint(PaintEventArgse) { PendrawingPen=newPen(Color.Black, 3); Rectanglerec=newRectangle(10,10,120,80); e.Graphics.DrawRectangle(drawingPen, rec); drawingPen.Dispose(); base.OnPaint(e); } privatevoidbutton1_Click(objectsender, EventArgse) { PendrawingPen=newPen(Color.Red, 15); Graphicsg=this.CreateGraphics(); Rectanglerec=newRectangle(60, 60, 120, 80); g.DrawRectangle(drawingPen, rec); //释放非托管的资源drawingPen.Dispose(); g.Dispose(); } } }
运行结果如下图所示:
值得注意的是,在窗体 Load 事件中,进行的绘制并未反映到 UI 上,因为事件执行顺序为先 Load再 OnPaint,虽然 Load里面的代码正常的执行,但是也会被 OnPaint重新“抹 掉”。我们利用 GDI+进行绘图时,先要获取 Graphics 对象,一般可以在 OnPaint 事件中通过 e.Graphics 进行获取,在 OnPaint 事件我们不需要手动释放资源,.NET 会自动帮我们处理。但是如果是用 Control.CreateGraphics()方法来创建的 Graphics 对象,那么必须要手动进行资源释放,究其原因是因为 Graphics 对象采用的非托管的系统资源。我们单击 button1 按钮,会在界面上绘制第二个方块,但是这种在 Click 事件中绘图的方法和在 OnPaint 事件中绘图的方法有着较大的区别,当你将窗体最小化或者隐藏(最大化或者窗体大小调整不影响)再最大化或者显示时,第二个方块就自动消失。对于这种很是奇怪的现象,对于刚接触 GDI+的人来说,确实有点摸不着头脑,究其原因是当最小化或者隐藏窗体时,操作系统将窗体进行了重绘,也就是再次调用了 Paint 事件,原有的绘图都被重新抹掉。