Gdiplus学习2——画笔与画刷

1、画笔的使用

       画笔用于描绘图形的轮廓,Gdi+画笔除了常见的色彩和宽度属性外,还添加了其他属性,如对其方式、线帽和变换方式等。

       <1>、Pen类

       Gdi+使用Pen(画笔)类来定义一个画笔,Pen类的构造函数如下:

       *Pen(color, width)//利用此构造函数将创建一个宽为width、色彩为color的画笔;

              例如:创建宽度为4的红色画笔: Pen redpen(Color(255, 255,0,0),4.0f);

       *Pen(brush, width)//利用指定画刷来构建一个画笔,色彩为画刷的色彩, 宽度为width

              例1: 使用纯色画刷创建宽度为4的红色画笔

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

                         Pen pen(&sBrush, 4.0f);

              例2:使用画刷来创建文理画笔

                        Image image(_T("texture.bmp"));//加载文理图片

                        TextureBrush tBrush(&image);//构建文理画刷

                        Pen texturedPen(&tBrush, 30);//用文理画刷构建画笔

                        graphics.DrawLine(&texturedPen, 0, 0, 100, 200);

       <2>、画笔的线型

        使用Pen类的成员函数SetDashStyle来设置画笔的线型。

        DashStyle(线型)是一个枚举结构,提供了5种画笔线型风格:

                  enum  DashStyle{

                              DashStyleSolid =0;//实线

                              DashStyleDash =1;//虚线

                              DashStyleDot = 2;//点线

                              DashStyleDashDot = 3;//点划线

                              DashStyleDashDotDot = 4;//双点划线

                              DashStyleCustom = 5;//自定义线型

                            };

         关于自定义线型的实现:

          *使用Pen类的成员函数SetDashPattern(设置线型风格)来自定义线型:

                   首先,定义一个描述画笔虚实的数组,数组的格式是:

                               [画线部分长度, 间隔部分长度, 画线部分长度, 间隔部分长度......]

                    然后将该数组传参给SetDashPattern实现自定义线型。

          示例: REAL dashVals[4] = 

                             {

                                   5.0f,//线长5个像素

                                   2.0f,//间断2个像素

                                   15.0f,//线长15个像素

                                   4.0f,//间隔4个像素 

                             };

                        pen.SetDashPattern(dashVals, 4);

              注:Pen类的成员函数GetDashPattern(获取线型风格),GetDashPatternCount(获取线型的定义点总数)

         <3>、画笔的对齐方式

            画笔是具有宽度的,相对与绘制线条来说,画笔宽度中的中心位置是由其对齐方式决定的。

            画笔的对齐方式是由Pen类的成员变量PenAlignment枚举描述的:

                     enum  PenAlignment{

                              PenAlignmentCenter =0;//居中

                              PenAlignmentInset = 1;//嵌入};

           设置对齐方式:例:pen.SetAlignment(PenAlignmentInset);//设置内嵌对齐方式

        <4>、画笔的缩放与旋转

          画笔的缩放:三种方法:ScaleTransform、MultiplyTransform、SetTransfrom

          例子:Pen pen(Color(255, 255, 0,0), 5);

                     Matrix matrix(1,0,0,2,0,0);

                     pen.MultiplyTransform(&matrix, MatrixOrderPrepend);//方法一

                     pen.SetTransform(&matrix);//方法二

                     pen.ScaleTransform(1,4);//方法三

                     graphics.DrawRectangle(&pen, 50,50,200,200);

         画笔的旋转:RotateTransform。注:只有当画笔宽度大于1时,画笔的旋转才会对绘制的线条外观产生影响。

          例子:pen.RotateTransform(60, MatrixOrderAppend);//将画笔旋转60度。

        <5>、画笔的线帽属性

         “线帽”(LineCap是指线条首尾的外观。

         设置起点线帽:SetStartCap;          设置终点线帽:SetEndCap;

         不同的线帽外观由LineCap枚举。自定义线帽使用CustomLineCap类。

 例子:

GraphicsPath StartPath, EndPath;//定义两个路径
StartPath.AddRectangle(Rect(-10,-5, 20,10));//在路径中添加一个矩形
//构造结束点线帽外观
EndPath.AddLine(0, -20, 10, 0);
EndPath.AddLine(0, -20, -10, 0);
EndPath.AddLine(0,-10, 10, 0);
EndPath.AddLine(0, -10, -10, 0);

Pen MyLineCapPen(Color(255, 0,0,255),2);
//将路径设置为线帽外观
CustomLineCap startCap(NULL, &StartPath);
CustomLineCap endCap(NULL, &EndPath);
//设置画笔的线帽外观
MyLineCapPen.SetCustomStartCap(&startCap);
MyLineCapPen.SetCustomEndCap(&endCap);

graphics.DrawLine(&MyLineCapPen, 800,30, 1000,30);
//以(300,300)为中心,绘制直线
for(float i=0; i<6.28f; i+=0.15f)
{
    graphics.DrawLine(&MyLineCapPen,800.0f,300.0f, 800.0f+200.0f*cos(i),300.0f+200.0f*sin(i));
}
        <6>、画笔连接点属性

        ”连接点“(LineJoin):两条端点重合或重叠的直线形成的公共区域。

       Gdi+提供了4种直线连接方式:斜接(LineJoinMiter)、斜切(LineJoinBevel)、圆形(LineJoinRound)及剪切斜接(LineJoinMiterClipped)。由LineJoin枚举。

       通过Pen类SetLineJoin成员方法来定义线条之间的连接方式。

       例:将连接点设置为圆形:pen.SetLineJoin(LineJoinRound);

       注:LineJoinMiterClipped与LineJoinMiter的区别主要在直线的"斜连接限制"。

      <7>、画刷透明度

       在GDI+中之所以能够实现透明的效果,是因为它对色彩的定义使用了ARGB的方式。

       创建带透明度的画笔,本质是在设置画笔色彩时,在色彩中加入透明度。

        例子,书上的代码,效果非常漂亮:

       

        Pen MyRedPen(Color(255, 255, 0, 0));
	Pen MyBluePen1(Color(255, 0, 0, 255));
	//绘制网线
	int y = 512;
	for(int x=0; x<512; x+=5)
	{
		graphics.DrawLine(&MyBluePen1,0, y, x, 0);
		graphics.DrawLine(&MyRedPen, 512, x, y, 512);
		y-= 5;
		Sleep(120);
	}
	//使用绿色画笔绘制不同透明度的线条
	//透明度从上到下递减
	for(y=0; y<512;y++)
	{
		Pen MyGreenPen(Color(y/2, 0,255,0));
		graphics.DrawLine(&MyGreenPen, 0, y, 512, y);
		//延时查看动态效果
		Sleep(20);
	}

 

2、画刷的使用

     在GDI+中,画刷分为5种,分别为单色画刷、影线画刷、纹理画刷、线性渐变画刷和路径渐变画刷。

     用画刷填充区域时,可能用到的填充函数:

            *FillClosedCurve:填充闭合曲线

            *FillEllipse:填充椭圆

            *FillPath:填充路径

            *FillPie:填充扇形

            *FillPolygon:填充多边形

            *FillRectangle:填充矩形

            *FillRectangles:填充矩形集

            *FillRegion:填充区域

       <1>、单色画刷(SolidBrush)

              例:SolidBrush greenBrush(Color(255,0,255,0));

                     //定义几个点,  ......

                     PointF points[4] = {point1,point2,point3,point4};

                     graphics.FillClosedCurve(&greenBrush, points, 4, FillModeAlternate, 1.0);

       *使用GDI+填充函数时,一个值得注意的问题:如何保存填充的区域信息?

       对于大多数由数学函数曲线构成的封闭区域而言,程序不可能将每一点的坐标都保存在数组中(这样的数组体积很大,而且保存规则的定义也很难控制),GDI+中提供的“图形路径对象(GraphicsPath)”可以很好地简化对此问题的处理:(先在图形路径中绘图,再填充路径)

       例子:绘制正叶曲线

       数学公式:R= A*sin(N*Angle)

                         X = R*cos(Angle)

                         Y = R*sin(Angle)

       注:A相当于叶子长度,N是决定叶子数目的常量, Angle是叶子的偏转角度。

      

/******************************************************************************/
//绘制正叶曲线
        CRect rect;
	this->GetClientRect(&rect);
	int cx = rect.Width()/2;
	int cy = rect.Height()/2;
    
	//设定叶子长度
	int LeafLength = 100;
        //设定叶子数目
	int LeafNum = 5;
	float PI = 3.14159;
	int x2,y2, x,y, r;
	//创建一个图形路径对象,用来容纳正叶曲线的边界线
	GraphicsPath tmpPath(FillModeAlternate);
	//生成曲线边界数据:角度变化为一周2*PI
	for(float i= 0.0f; i<PI*2+0.1f; i+=PI/180)
	{
		r = abs(LeafLength*sin(LeafNum*i));
		x = r*cos(i);
		y = r*sin(i);
		x2 = cx+x;
		y2 = cy+y;
		//将曲线的边界信息存入临时路径,如果想要查看这些信息所构成的区域,可以在此加入
		//graphics.DrawLine(&BlackPen, x2,y2, x2-1,y2-1);
		tmpPath.AddLine(x2,y2,x2-1, y2-1);
	}
	//填充路径
        graphics.FillPath(&greenBrush, &tmpPath);
	//绘制中心坐标轴
	Pen pen(Color::Gray, 1);
	graphics.DrawLine(&pen, 0, cy, cx*2, cy );
	graphics.DrawLine(&pen, cx, 0, cx, cy*2);

        <2>影线画刷(HatchBrush)

        GDI+使用HatchBrush类来定义影线画刷:

        HatchBrush(

                 HatchStyle hatchStyle,//影线画刷的类型

                 const Color& foreColor,//影线画刷线条的前景色

                 const Color& backColor//影线画刷线条的背景色);    

        使用影线画刷的步骤:定义画刷、定义填充区域、开始填充;

        hatchStyle 枚举了53种风格的画刷类型   

        ***绘制原点:

        影线画刷是使用单个基本图案对区域进行填充的,基本图案必须以一个特定的像素位置作为排列的起点,这个起点在GDI+中称为“RenderingOrigin”。

        在绘图平面中设置绘制原点的方法:调用SetRenderingOrigin函数:

        Status SetRenderingOrigin(INT x, INT y);

        其中,参数x,y是点相对位移像素数目。

        例子:

        HatchBrush Brush_Test(HatchStyleForwardDiagonal, black, white);
	for(int i =0; i<12; i++)
	{
            graphics.FillRectangle(&Brush_Test, (i%4)*50, 200+50*(i/4), 50,50);
	}
	for(int j=0; j<12; j++)
	{
            //设置画刷原点
	    graphics.SetRenderingOrigin(j, 0);
	    graphics.FillRectangle(&Brush_Test, 250+(j%4)*50, 200+50*(j/4), 50,50);
	}

        注:就影线画刷而言,原点的设定对于多窗口程序的界面设定也有一定影响,如果有两个窗口,一个父窗口、一个子窗口,而且这两个窗口的背景都使用影线画刷进行填充,那么,在进行子窗口背景重绘时,如果将子窗口的原点设定成与父窗口的左上角一致,就能达到一种子窗口与父窗口融合的视觉效果。

        <3>、纹理画刷(TextureBrush)

        1*纹理画刷是将图片在目标区域中进行平铺。纹理画刷的基本图案是基于光栅的图形。

        2*创建纹理画刷的基本步骤:

               定制纹理画刷使用的基本图案(图形);

               设定画刷图片的大小;

               确定基本图案的排列方式;

       GDI+使用TextureBrush类来构造纹理画刷,TextureBrush要求依以上3个步骤在类构造函数中完成。

       TextureBrush有以下7种构造函数:

               TextureBrush(Image* image, Rect& dstRect, ImageAttributes* imageAttributes);

               TextureBrush(Image* image, RectF& dstRect, ImageAttributes* imageAttributes );

               TextureBrush(Image* image, WrapMode wrapMode);

               TextureBrush(Image* image, WrapMode wrapMode, Rect& dstRect);

               TextureBrush(Image* image, WrapMode wrapMode, RectF& dstRect);

               TextureBrush(Image* image, WrapMode wrapMode, INT dstX, INT dstY, INT dstWidth, INT dstHeight);

               TextureBrush(Image* image, WrapMode wrapMode,REAL X, REAL Y, REALWidth, REAL Height);

      参数:

              image: 纹理画刷使用的基本图案;

              dstRect: 用于指定图案中用于画刷的矩形区域,它的大小不能超过基本图案的范围,否则不能完成正常填充效果。

             wrapMode:指定在画刷中如何排列基本图案。

            imageAttributes:用于指定基本图案的附加特征参数。

     3* 纹理画刷对基本图案的3种载入方式:正常加载基本图案、部分选取基本图案、缩放后的基本图案。

   //装入纹理图片
   Image image(L"Chrysanthemum.jpg");
   //构造纹理画刷1,使用原始图片
   TextureBrush tBrush(&image);
   //使用纹理画刷填充圆形区域
   graphics.FillEllipse(&tBrush, rect1);
   
   //构造纹理画刷2,使用部分图片
   TextureBrush tBrush2(&image, Rect(0,0, 35,70));
   graphics.FillEllipse(&tBrush2, rect2);
   
   //构造纹理画刷3,对图片进行缩放
   TextureBrush tBrush3(&image);
   tBrush3.SetTransform(&Matrix(0.1f,0.0f, 0.0f, 0.1f, 0.0f,0.0f));
   graphics.FillEllipse(&tBrush3, rect3);
   

    注意:通过对基本图案进行缩放来构造纹理画刷时,如果将矩形区域的大小设置的比基本图案大,则这种方式生成纹理画刷会失败,编程时要注意。

     4*纹理画刷的排列方式(即基本图案单元的平铺方式)

      TextureBrush类的构造函数中,参数WrapMode指定了画刷中基本图案的排列方式。

      WrapMode枚举提供了5种图案排列方式:

      enmu WrapMode{

           WrapModeTile,//对图片使用简单的平铺方式

           WrapModeTileFlipX,//水平翻转并平铺,填充的目标区域相邻两列的基本图案一列是原始的,一列是水平翻转的

           WrapModeTileFilpY,//垂直翻转并平铺,填充的目标区域相邻两行的基本图案一行是原始的,一行是垂直翻转的

           WrapModeTileFilpXY,//垂直水平都翻转并平铺,WrapModeTileFlipX和WrapModeTileFilpY的叠加效果。

           WrapModeClamp//对基本图案不进行平铺,填充的目标区域只有左上角是图案,其余部分透明不可见。

          };

      RectF rect5(10, 250, 200,200);  

      TextureBrush tBrush5(&image, WrapModeTileFlipY);  

      tBrush5.SetTransform(&Matrix  (0.1f,0.0f, 0.0f, 0.1f,0.0f, 0.0f));  

      graphics.FillEllipse(&tBrush5, rect5);

    5* 纹理画刷的变换(即基本图案在画刷中的外观)

        纹理画刷的变换分为3种:旋转变换(RotateTransform)、缩放变换(ScaleTransform)、平移变换(TranslateTransform)。

        平移变换:对基本图案在水平方向和垂直方向上的移动;

        缩放变换:对基本图案的放大和缩小;

        旋转变换:对基本图案按照顺时针方向转动;

   

    例子:tBrush.RotateTransform(30);//将画刷旋转30度。

               tBrush.ScaleTransform(3,1);//将画刷水平方向上放大3倍。

               tBrush.TranlateTransform(30, 0);//将画刷在水平方向上平移30个像素。

       注意:画刷的变换是可以叠加的,如果进行一次变换后,恢复变换前的画刷状态,可以使用ResetTransform函数。

              tBrush.ResetTransform

                使用GetTransform函数可以对画刷的状态进行查询。

     
     <4>、线性渐变画刷(LinearGradientBrush)

      线性渐变画刷的“渐变”体现在:色彩变化沿着指定角度的直线路径方向进行。线性渐变画刷可以是双色渐变,也可以是多色渐变。

      LinearGradientBrush的构造函数:

            LinearGradientBrush(Point& point1, Point& point2, Color& color1, Color& color2);

            LinearGradientBrush(PointF& point1, PointF& point2, Color& color1, Color& color2);

            LinearGradientBrush(Rect& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable);

            LinearGradientBursh(RectF& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable);

            LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode);

            LinearGradientBrush(RectF& rect, Color& color1, Color& color2, LinearGradientMode mode);

      参数:

            color1, color2 :起点、终点的色彩;

            point1, point2 :起点、终点的坐标;

            rect : 画刷的矩形定义区间;

            isAngleScalable: 画刷是否需要旋转;

            Angle : 渐变画刷的旋转角度,只有当参数isAngleScalable为真时,该参数才有效;

            LinearGradientMode: 渐变线的填充方向。

    1* 填充方式

     把线性渐变画刷要定义的区域看成是一个单独的基本图案,就相当于纹理画刷中对基本图案的排列方式进行控制。

     例子:

     LineGraBrush(Point(0,0), Point(40,40),Color(255,255,0,0), Color(255,0,0,255));

     LineGraBrush.SetWrapMode(WrapModeTile);//平铺排列(默认方式)

     其余排列方式WrapModeTileFlipX、WrapModeTileFlipY、WrapModeTileFlipXY.(注意没有WrapModeClamp)

     若要重置绘制原点,调用:graphics.SetRenderingOrigin函数;

    2* 使用渐变模式

     LinearGradientMode(渐变模式)枚举定义了渐变线是如何从矩形的一边或一角构成的。

     enum LinearGradientMode

     {

           LinearGradientModeHorizontal,//渐变线是水平的,起点色在左边,终点色在右边

           LinearGradientModeVertical,//渐变线是垂直的,起点色在上面,终点色在下面

           LinearGradientModeForwardDiagonal,//从左上角到右下角渐变,起点色在左上角,终点色在右下角

           LinearGradientModeBackwardDiagonal//从右上角到左下角渐变,起点色在右上角,终点色在左下角

     }

     注意:后两种渐变模式,矩形的对角线是色彩的混合线,而不是渐变线。

    3* 渐变线

     渐变线是一条虚线,代表色彩变化的方向,渐变线由指定的矩形的左上角点和偏转角共同决定,例如LinearGradientModeHorizontal模式下偏转角是0度,LinearGradientModeVertical模式下偏转角是90度。

      开发人员可以对渐变线的偏转角度进行任意设置,设置的方法是:在LinearGradientBrush的构造函数中通过参数angle的值来进行。

      例如:定义一个渐变线偏角为30度的渐变画刷:

      LinearGradientBrush lineBrush(Rect(0,0,40,20), Color(255,255,0,0), Color(255,0,0,255), 30.0f);

    4* 多色线性渐变画刷的实现

      多色渐变是指在起点色和终点色的渐变过程中加入其它色彩作为变化的过渡色(又称为插值色)。

      实现多色渐变画刷的过程是,指明参与渐变的每一种过渡色彩值,然后定义每一个过渡色的合成位置值。

      GDI+通过设置插色值函数SetInterpolationColors来实现:

      原型:Status SetInterpolationColors(const Color* presetColors, const REAL* blendPositions, INT count);

      参数:

      presetColors:包含多种预定义过渡色的数组,该数组的第一个变量定义渐变的起点色,最后一个变量定义终点色,其余元素是过渡色色彩值。

      blendPositions:包含色彩合成位置的数组。在GDI+中,合成位置用百分比来表示,即从起点色到合成位置点的长度占整个区域的百分比,该数组的第一个变量代表了起点色的合成位置,必须为0%,最后一个变量代表终点色的合成位置,必须为100%。注意:合成位置并不是过渡色的开始,而是过渡色最浓的位置。

     count : 参与渐变的色彩总数,该值等于数组presetColors和blendPositions的大小。   

     5* 定制色彩渐变行为

       线性渐变画刷的合成因子(Blend Factors):合成因子以百分比的形式代表色彩的渐变程度, 100%意味着色彩完全转换,0%意味着色彩不进行渐变。

       双色渐变画刷,合成因子代表的是终点色的转变程度,对于多色渐变画刷,合成因子代表每一种参与过渡的渐变色的渐变程度。

       **1、使用设置合成方式函数SetBlend可以改变默认的色彩渐变行为。

       原型:Status SetBlend(const REAL* blendFactors,  const REAL* blendPositions,  INT count);

       参数:blendFactors:包含合成因子的数组,每一个数组成员的取值范围为0~1;

                  blendPosition : 包含合成位置的数组, 每一个成员依次代表着参与渐变的过渡色的合成位置,第一个变量代表起点色的合成位置,必须为0%, 最后一个成员代表终点色的合成位置,必须为100%。

                 count:合成点位置数,与blendFactors和blendPosition的数组大小一致。

       色彩回归现象:当一种色彩向另一种色彩渐变时,如果色彩的合成因子到一定程度,就会出现另一种色主导的色彩。

        **2、还可以使用下列函数自定义渐变过程:

        SetBlendTriangularShape(REAL focus, REAL scale);//基于三角形的渐变

        SetBlendBellShape(REAL focus, REAL scale);//基于钟型曲线的渐变

       这两个函数功能相同,只是内部实现原理不同,focus设置合成点位置, scale指明合成因子的大小。

 

     <5>、路径渐变画刷(PathGradientBrush)

      路径渐变画刷是指画刷的色彩变化在指定的路径内完成,渐变色从路径内部的中心点逐渐过渡到路径的边框。

      路径的概念:

      路径表明了一定的区间,应用程序使用路径来绘制形体的轮廓、填充形体内部以及创建剪切区域。路径可以由一个或多个图案组成,而每一个图案又可以由一系列的直线或曲线组成,还可以是基本的几何形体(矩形、圆形、扇形);

      路径渐变画刷(PathGradientBrush)的构造函数:

      PathGradientBrush(GraphicsPath* path);

      PathGradientBrush(Point* points, int count, WrapMode warpMode);

      PathGradientBrush(PointF* points, int count, WrapMode warpMode);

     参数:

      path: 由GraphicsPath类定义的路径;

      points: 用数组形式表示的组成路径的各个端点的坐标;

      count: 构造函数的端点总数;

      warpMode:渐变画刷在目标区域中的排列方式。

     路径渐变画刷与线性渐变画刷的比较:

     路径渐变画刷的渐变方向是从路径中央到路径边缘,是一种呈发散状的渐变,而线性渐变画刷的渐变方向较为单一(水平、垂直、固定角度)。

     它们的渐变实质,都是点到点的渐变。

     在使用路径渐变画刷填充目标区域前,要指明路径对象和指定路径的中心点色彩(起点色)和路径边界的色彩(终点色),中心色默认为黑色,边界色可以使用相同的色彩,也可以分别为每一个不同的路径边缘点指明终点色。

    

        Point points[] = {
	   Point(75,0),Point(100, 50),
	   Point(150,50),Point(112,75),
	   Point(150,150), Point(75, 100),
	   Point(0, 150), Point(37, 75),
	   Point(0, 50), Point(50, 50),
	   Point(75,0) };
	//创建路径
	GraphicsPath path;
	//在路径中加入直线
	path.AddLines(points, 11);
	PathGradientBrush pthGrBrush(&path);
	//设置起点色
	pthGrBrush.SetCenterColor(Color(255, 255, 0, 0));

	//设置每个终点的色彩
	Color colors[] ={
		Color(255, 0, 0,0), Color(255, 0, 255, 0),
		Color(255, 0, 0, 255),Color(255, 255, 255, 255),
		Color(255, 0, 0,0), Color(255, 0, 255, 0),
		Color(255, 0, 0, 255),Color(255, 255, 255, 255),
		Color(255, 0, 0,0), Color(255, 0, 255, 0),
	 };
	int Count =10;
	//设置终点色
	pthGrBrush.SetSurroundColors(colors, &Count);
	//填充路径
	graphics.FillPath(&pthGrBrush, &path);

     
      路径渐变画刷对目标区域的填充有一个特点,在画刷渐变区域之外的部分,画刷在这些区域不会进行填充,也就是说在填充的路径之外画刷是透明的,因此这些透明间隙可以用另一种或几种画刷继续填充,这样就会达到意想不到的效果。

      **1、渐变路径的约束矩形对象和渐变路径的中心点

             渐变路径的约束矩形对象:包围路径区域的最小矩形,这个矩形的左上角是定义路径的各点坐标的最小值,右下角是最大值。

      利用PathGradientBrush类的成员函数GerRectangle能够得到渐变路径的约束矩形对象。

      约束矩形的意义:在使用画刷对目标区域填充时,画刷的排列相当于约束矩形的排列。

             路径的中心点:定义路径的各个点坐标的平均值。      PathGradientBrush类的成员函数GetCenterPoint能够直接获得路径中心点坐标,SetCenterPoint能够改变中心点坐标。

       注意:渐变路径中心点并不一定是约束矩形的中心点。

       **2、路径渐变画刷的填充方式

       路径画刷的排列方式与其他画刷一样,也是使用SetWrapMode函数来完成的。

    

       注意:GDI+平面的默认绘制原点是窗口左上角(0,0),对于画刷而言,其填充区域相当于在程序中指定的填充区域加上该区域到窗口左上角之间的总和。

        **3、改变路径渐变画刷的中心点

       由于路径渐变画刷的色彩渐变体现在中心点到边缘点之间的一种色彩过渡,所以改变中心点将很大程度上影响整个填充效果,尤其适合对立体图形的处理。方法:调用路径渐变画刷的成员SetCenterPoint(point);

       注意:当设置的中心点位于路径之外时,路径色彩的变化还是从中心点到路径边缘,只不过显示的色彩只是渐变的一部分。

       **4、路径渐变画刷的多色渐变

       路径渐变画刷的多色渐变与线性渐变画刷一样,调用SetInterpolationColors来增加渐变色。编程也遵从“指明渐变色总数、指明合成位置”的基本思路。

        **5、更改路径渐变画刷的焦点缩放比例

       注:Graphics的成员函数CloseFigure提供对区域的封闭操作。

       对路径构成的一个封闭区域,如果在封闭区域的内部再选择一个与整个路径的形状一致、但是面积更小一些的区域,这个区域就称为对原始区域的焦点缩放。对三角形区域进行焦点缩放后的效果如下图:

      Gdiplus学习2——画笔与画刷_第1张图片

       图中,实线三角形是预定义的原始区域,虚线三角形是按照不同焦点缩放比例缩放后的三角形区域。

       焦点缩放比例是缩放后的区域尺寸与原始区域尺寸之比,分为水平焦点缩放比例和垂直焦点缩放比例,区域的焦点缩放就是对原始区域进行水平和垂直方向上的放大或缩小。

       注意:在路径渐变画刷中,设置的中心点色彩只在“中心点”(只有这一个点)显示,而在中心点周围的点的色彩则是渐变后的色彩。

       更改路径渐变画刷的焦点缩放比例的目的在于,让路径中心点的色彩按照不同的缩放比例在中心区域的每一处都显示,而不是仅仅在中心点显示。

      可以使用SetFouceScales函数来更改路径默认的焦点缩放比例。该函数的调用方法:

       Status SetFouceScales(

         REAL xScale,//水平方向上的缩放比例

         REAL yScale//垂直方向上的缩放比例         );

         注:路径渐变画刷默认的水平和垂直方向上的焦点缩放比例都是0,也就是将区域缩放为一点。

        使用GetFocusScale函数可以获得水平、垂直方向上的焦点缩放比例。

       注意:对路径渐变画刷的焦点进行缩小,缩小的极限是中心区域变成一个点(即中心点色彩仅在中心点显示,路径渐变画刷的默认值);如果对路径渐变画刷的焦点进行放大,放大的极限是中心区域与路径渐变画刷的约束矩形大小一致。

       **6、路径渐变画刷的变换

       同线性渐变画刷相同,路径渐变画刷同样支持3种常见的坐标变换:平移变换、缩放变换、旋转变换。操作过程与线性渐变画刷变换相同。通常将画刷的变换和排列方式结合使用,可以实现复杂的填充效果。

       **7、启动路径渐变画刷的Gamma校正

       不同的计算机对于同一幅图片的显示结果可能不一样,尤其是色彩信息。在计算机系统中,由于显卡或者显示器的原因,会出现实际图像在亮度上有偏差的情况,而Gamma校正就是通过一定的方法来校正图像的这种偏差方法。一般情况下,当Gamma校正值大于1时,图像的高光部分被压缩而暗调部分被扩展;当Gamma校正值小于1时,图像高光部分被扩展而暗调部分被压缩,Gamma一般用于平滑地扩展暗调细节。

       注:如果想让数字图片在不同计算机中能够达到同一显示效果,必须通过软件进行Gamma设置。

       对于路径渐变画刷的Gamma校正,可以通过PathGradientBrush类的“设置伽马校正”成员函数SetGammaCorrection来完成。

       默认情况下,路径渐变画刷的Gamma校正功能是被禁止的。调用SetGammaCorrection(TRUE);就可以启动Gamma校正。

     

你可能感兴趣的:(Gdiplus学习2——画笔与画刷)