GDI+学习之路5--线条、曲线和图形(三)

 

         今天更新多点吧,把线条、曲线和图形部分写完了。看起来得要有时间的紧迫感啊,呵呵……

画刷和填充图形(Brushes and Filled Shapes)

         一个闭合图形比如矩形和椭圆包含一个边框和内部区域。边框是由Pen对象绘制,而内部区域由Brush对象进行填充。Microsoft Windows GDI+提供几种画刷类用于填充闭合图形的内部区域:SolidBrushHatchBrushTextureBrushLinearGradientBrushPathGradientBrush。所有这些类都继承于Brush类。下图显示了一个由纯色画刷填充的矩形和一个由阴影画刷填充的椭圆。

   

纯色画刷(Solid Brushes)

         如下的例子将用实心红色填充椭圆:

SolidBrush mySolidBrush(Color(255, 255, 0, 0));

myGraphics.FillEllipse(&mySolidBrush, 0, 0, 60, 40);

         FillEllipse方法的参数分别为:Brush对象地址(SolidBrush继承自Brush)、矩形左上角、矩形宽度和高度(椭圆由矩形限定)。

阴影画刷(Hatch Brushes)

         当用阴影画刷填充图形时,您需要指定前景色、背景色和阴影样式。前景色即阴影的颜色。比如:

         HatchBrush myHatchBrush(HatchStyleVertical, Color(255, 0, 0, 255), Color(255, 0, 255, 0));

将创建一个阴影画刷对象,阴影样式为垂直,前景色为蓝色,背景色为绿色。

GDI+提供了超过50种阴影样式,这些样式在HatchStyle中定义。下面显示的3种阴影分别是水平、正向对角线和十字交叉阴影。

纹理画刷(Texture Brushes)

         通过纹理画刷,您可以使用存储于位图中的纹理来填充图形。例如,假设下面的图形存储在磁盘文件MyTexture.bmp中。

    下面的例子将演示一个由MyTexture.bmp中存储的图片填充得到的椭圆。

         Image myImage(L”MyTexture.bmp”);

         TextureBrush myTextureBrush(&myImage);

         myGraphics.FillEllipse(&myTextureBrush, 0, 0, 100, 50);

下图为填充效果:

渐变画刷(Gradient Brushes)

         你可以采用颜色从图形的一部分到另一部分逐渐变化的渐变画刷来填充图形。下面的例子将采用水平渐变画刷填充一个椭圆,从左至右颜色由蓝色逐渐变为绿色。

         LinearGradientBrush myLinearGradientBrush(

myRect,

Color(255, 0, 0, 255),

Color(255, 0, 255, 0)

LinearGradientModeHorizontal);

         myGraphics.FillEllipse(&myLinearGradientBrush, myRect);

下图为填充后的椭圆

渐变画刷的路径也可以设置成从中心到边界逐渐渐变

渐变画刷的路径是非常灵活的。下图中展示填充三角形的渐变画刷中心为红色,向每个顶点渐变为3个不同的颜色。

开放与闭合曲线(Open and Closed Curves)

         下图显示了两个曲线,一个开放、一个闭合。

         闭合曲线因为有内部区域因而可以被画刷填充。GDI+中的Graphcis类提供如下方法用于填充闭合图形和曲线:FillRectangleFillEllipseFillPieFillPolygonFillClosedCurveFillPathFillRegion。任何时候在您调用这些方法的其中之一时,您必须将一个指定类型的画刷(SolidBrushHatchBrushTextureBrushLinearGradientBrush或者PathGradientBrush)地址作为参数之一传入。

         FillPie方法配合DrawArc方法,将绘制出如下的图形:

    DrawArc绘制弧边界的部分,FillPie方法填充弧内部区域的部分。代码如下:

        myGraphics.FillPie(&mySolidBrush, 0, 0, 140, 70, 0, 120);

        myGraphics.DrawArc(&myPen, 0, 0, 140, 70, 0, 120);

        FillClosedCurve方法配合DrawClosedCurve方法。这两个方法都将终点自动连接起点从而使曲线闭合。

        Point myPointArray[] = {Point(10, 10), Point(60, 20), Point(40, 50)};

        myGraphics.DrawClosedCurve(&myPen, myPointArray, 3);

        myGraphics.FillClosedCurve(&mySolidBrush, myPointArray,3, FillModeAlternate)

    一条路径可以包含多个图形(子路径)。FillPath方法填充每个图形的内部区域。如果一个图形不是闭合的,那么FillPath方法将假设它是闭合的然后进行填充。下面的例子将填充一个由弧线、基数样条、字符串和饼图组成的路径。

         myGraphics.FillPath(&mySolidBrush, &myGraphicsPath);

         myGraphics.DrawPath(&myPen, &myGraphicsPath);

         下图为该路径采用纯色画刷填充前后的样子。注意,采用DrawPath方法时,字符串描出轮廓,但是没有填充。而FillPath方法将字符串各字符内部进行了着色。

区域(Regions)

         区域指的是显示表面的一部分。区域可以简单(单个矩形)也可以复杂(由一个由多边形和闭合曲线组成)。下图显示了2个区域:一个由矩形构成,另一个由路径构成。

通常区域用来裁剪 (Clipping) 和进行点击测试 (Hit Testing)。裁剪包括限制对显示区域的某个特定区域进行绘制,通常该区域为必须进行更新的部分。点击测试包括检查并判断当按下鼠标按钮时,光标是否位于屏幕的某个特定区域中。

        您可以从矩形或路径建立区域。您也可以通过组合现有的区域来建立复杂的区域。Region 类提供下列用来组合区域的方法:IntersectUnionXorExclude Complement

        两个区域的交集(Intersection)是指隶属于这两个区域的所有点的组合。并集(Union)是指属于其中一个或两个区域的所有点的组合。区域的补码 (Complement) 是指所有区域以外的点。下图将显示前图所说明的两个区域的交集和并集。

         Xor方法和Exclude方法所绘制出来的图形如下图:

         绘制区域,您需要Graphics对象、Brush对象和Region对象。Graphics对象提供FillRegion方法,而Brush对象则是储存填充的特性,Region对象存有所绘区域。

         myGraphics.FillRegion(&mySolidBrush, &myRegion);

裁剪(Clipping)

裁剪是指对特定区域进行绘制。下图将显示 "Hello" 字符串被裁剪为心形的区域。

区域可从路径建立,而路径中可包含字符串的字型外框,因此您可以使用外框文字来进行裁剪。下图将显示裁减为文字字符串内景的一组同心椭圆。

下例将绘制一条被矩形区域裁剪的直线:

Region myRegion(Rect(20, 30, 100, 50));

myGraphics.DrawRectangle(&myPen, 20, 30, 100, 50);

myGraphics.SetClip(&myRegion, CombineModeReplace);

myGraphics.DrawLine(&myPen, 0, 0, 200, 200);

路径平直化(Flattening Paths)

         路径平直化处理表示将路径中的每条贝塞尔样条转化为一系列的直线。

若要平直化一条路径,需要调用GraphicsPath对象的Flatten方法。Flatten方法有一个平直度的参数,表示平直化后的路径与原始路径的最大距离。下图显示了一条路径平直化处理前后的情形:

线条和曲线的抗锯齿功能(Antialiasing with Lines and Curves)

         使用 GDI+ 绘制线条时,您必须提供线条的起始点和结束点,但不必提供该线条的个别像素相关信息。GDI+ 是与显示驱动程序软件搭配使用,来决定必须开启哪些像素,才可以在特定显示装置上显示该线条。

         比如从(4,2)(16,10)的红色线条。假设坐标系统的原点在左上角,而度量单位为像素。同时我们也假设 X 轴指向右方,而 Y 轴则向下延伸。下图将显示在多重色彩背景上绘制的红色线条的放大画面。

此类线条绘制方式所产生的线条会出现锯齿形的外观,看起来有点像阶梯。这种将线条绘制成阶梯状的技术称为锯齿 (Aliasing)

另一种更为复杂的绘制线条技术是同时使用透明的像素和不透明的像素。像素将设为纯红色或红色与背景色彩的混色,这依赖像素与线条接近的程度。此类绘制方式称为反锯齿 (Antialiasing),可产生肉眼感觉更为平滑的线条。下图将显示某些像素将与背景混色以产生反锯齿线条。

反锯齿 (亦称为平滑化) 套用至曲线,如下图所示:

    以下的图显示一个未使用防锯齿功能,一个使用防锯齿功能。

    以下示例使用平滑的线条:

    myGraphics.SetSmoothingMode(SmothingModeAntiAlias);

    myGraphics.DrawLine(&myPen, 0, 0, 12, 8);

 

你可能感兴趣的:(GDI+)