系列前面的两篇文章写的内容太简单了,本文对我理解的GDI+做一个综述,不再涉及代码细节。
GDI+中共有三种坐标,全局坐标、页面坐标和设备坐标。在GDI+的绘图调用中,传入的坐标位于全局坐标内,全局坐标经由全局变换转换到页面坐标,页面坐标再通过页面变换计算出设备坐标。
全局变换通过Graphics.Transform指定,其类型为Matrix。GDI+中的矩阵为3x3浮点矩阵,可以通过Matrix类的方法和属性来修改全局变换,也可以通过Graphics类上的TranslateTransform等方法来设定。页面变换通过Graphics类的PageUnit和PageScale来设定坐标单位和缩放倍数。
Point, Size, Rectangle是GDI+中常用的度量类型,并且都具有对应的float类型。Color则代表了32位A8R8G8B8的颜色。这一些都是基本的值类型,在实际使用的时候,要牢记其值类型的特征,类似o.Size.Width = 100的代码是没有作用的,因为.Width = 100是作用在了o.Size返回的临时变量上了,对于o的状态没有任何影响。
GraphicsPath,Region, Image则是GDI+中的一些资源性的类型,在使用完成后要尽快Dispose。GraphicsPath是一系列连续的线,包含直线和曲线。Region则表示封闭的一个区域,这个区域的边界可以由GraphicsPath来描述。Image表示一个图形,其中表现像素组成的位图的派生类为Bitmap,表现失量绘图指令组成的图形的派生类为Metafile。计算机屏幕最擅长展现两维的数据,因此Rectangle视为最简单的一种Region,并且应用面也非常广泛,计算包含整个Region的Rectangle也是非常常见的一种操作。
Brush用来填充一个Region,填充时可以使用单色填充,可以使用纹理(图片)填充,也可以使用线型填充和渐变填充,.NET中封充的GDI+提供了SolidBrush,TextureBrush,HatchBrush,LinearGradientBrush和PathGradientBrush类。Brush也是需要及时Dispose的,对于SolidBrush,可使用SystemBrushes和Brushes中的静态属性,获取预定义的Brush对表,免去Dispose的麻烦。
Pen是用来画线的,GDI+的线是有宽度的,也就有其内部区域,因此GDI+中的Pen需要一个Brush实例来构造。同样SystemPens和Pens中提供了预定义的单色Pen实例。
此外Font对象用来实现GDI+中不同字体的输出,Graphics类提供了一个MeasureString方法计算一段字符串绘制出来时占据的区域大小。
Graphics类提供了一系列Draw...方法,使用特定的Pen来绘制一定的形状,Fill...系列则使用特定的Brush来填充指定区域。
Graphics的Clip属性通过一个Region类的实例指定GDI+有效绘制区域,这是一个基础信息,Graphics的属性ClipBounds,IsClipEmpty,IsVisibleClipEmpty,VisibleClipBounds均基于Clip属性,并且为只读的。
CompositingQuality,InterpolationMode,PixelOffsetMode,SmoothingMode,TextRenderingHint用来控制绘制输出质量,质量越高,速度越慢。CompositingMode用来启用Alpha Blend,TextContrast控制文本输出时的Gamma值,RenderingOrigin用来控制8bit/16bit色深时的色彩拌动和Hatch Brush的起始点。
这些内容对之后的Minesweeper内容足够了,如果有问题,欢迎在评论中提出。