GDI+ for VCL基础 -- 画刷之LinearGradientBrush

          本文为GDI+ for VCL基础系列文章之一,主要供GDI+初学者入门参考,例子使用GDI+版本下载地址和说明见《 GDI+ for VCL基础 -- GDI+ 与 VCL 》。如有错误或者建议请来信:maozefa@hotmail.com

        GDI+由二维矢量图形、图像和版面等三部分组成,其中的二维矢量图形的图元,包括点、线条、曲线和图形等的绘制工具就是画笔和画刷,而画笔的特征又是由画刷决定的(在以后的关于画笔的文章中介绍),因此,熟练地掌握GDI+的各种画刷特性和使用方法是绘制GDI+图形的前提条件。

        GDI+提供了SolidBrush(实色刷)、HatchBrush(阴影刷)、TextureBrush(纹理刷)、LinearGradientBrush(渐变刷)和PathGradientBrush(路径刷)等五种画刷,在GDI+ for VCL中,各种画刷在原C++类类名基础上加了TGp前缀,均派生于TGpBrush,其中的TGpSolidBrush和TGpHatchBrush相当于VCL中传统的GDI的画刷TBrush。

        GDI+ for VCL的TGpLinearGradientBrush采用颜色线性渐变填充图形,包括双色渐变和多色渐变,渐变的方向是沿着指定的角度或者2点之间的直线进行的。

        一、双色渐变

        下面的代码通过两个点和起始颜色及结束颜色建立了一个双色渐变刷,渐变沿两个点(0,0) - (50,10)组成的直线进行,由于填充区域大于两个点的距离,所以填充过程是重复进行的,其效果截图见图一:      

//  Delphi 2007
var
  brush: TGpLinearGradientBrush;
begin
   brush :
=  TGpLinearGradientBrush.Create(GpPoint( 0 0 ), GpPoint( 50 10 ), kcYellow, kcRed);
  g.FillRectangle(brush, GpRect(ClientRect));
  brush.Free;
end;

//  C++ Builder 2007
    TGpLinearGradientBrush  * brush  =
       
new  TGpLinearGradientBrush(TGpPoint( 0 0 ), TGpPoint( 50 10 ), kcYellow, kcRed);
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush, ClientRect);
    delete brush;

        也可以通过指定的矩形、起始颜色和结束颜色以及方向,创建TGpLinearGradientBrush对象,效果截图见图二:

//  Delphi 2007
var
  brush: TGpLinearGradientBrush;
begin
  brush :
=  TGpLinearGradientBrush.Create(GpRect( 0 0 50 50 ), kcYellow, kcRed, lmBackwardDiagonal);
  
//  假定TGpGraphics对象g已经建立
  g.FillRectangle(brush, GpRect(ClientRect));
  brush.Free;
end;

//  C++ Builder 2007
    TGpLinearGradientBrush  * brush  =
        
new  TGpLinearGradientBrush(TGpRect( 0 0 50 50 ), kcYellow, kcRed, lmBackwardDiagonal);
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush, ClientRect);
    delete brush;

其中的lmBackwardDiagonal是个TLinearGradientMode枚举成员,它决定了渐变的方向,定义如下:

  TLinearGradientMode  =  (
    lmHorizontal,         
//  指定从左到右的渐变。
    lmVertical,            //  指定从上到下的渐变。
    lmForwardDiagonal,     //  指定从左上到右下的渐变。
    lmBackwardDiagonal     //  指定从右上到左下的渐变。
  );

          还可以通过指定的矩形、起始颜色、结束颜色和角度,建立TGpLinearGradientBrush对象,将上面的代码中TLinearGradientMode构造方法的参数lmBackwardDiagonal替换为90,渐变方向是从上到下进行的,相当于TLinearGradientMode成员lmVertical,效果截图见图三。

        利用上面建立的渐变刷填充的图案都是重复的,要改变这种情况,必须使渐变刷的指定矩形等于我们要绘的图形矩形,下面代码没有重复填充,而且起始色和结束色都使用kcRed,但是起始色的为半透明,所以渐变填充为半透明红色到不透明红色的效果,见图四:

//  Delphi 2007
var
  brush: TGpLinearGradientBrush;
begin
  brush :
=  TGpLinearGradientBrush.Create(GpRect( 0 0 128 128 ), ARGB( 32 , kcRed), kcRed);
  
//  假定TGpGraphics对象g已经建立
  g.FillRectangle(brush,  0 0 128 128 );
  brush.Free;
end;

//  C++ Builder 2007
    TGpLinearGradientBrush  * brush  =
        
new  TGpLinearGradientBrush(TGpRect( 0 0 128 128 ), TGpColor( 32 , kcRed), kcRed);
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush,  0 0 128 128 );
    delete brush;

          

                       图一                          图二                          图三                            图四

        二、多色渐变

        使用TGpLinearGradientBrush的SetInterpolationColors 方法可以实现多色渐变, SetInterpolationColors方法定义如下:

procedure SetInterpolationColors(const presetColors: array of TARGB;
                                     const blendPositions: array of Single);

        其中,presetColors为沿渐变的相应位置处使用的颜色的颜色数组;blendPositions为沿渐变线的位置,这些位置是介于 0 到 1 之间的值,指定沿定位相应颜色的渐变线的距离的比率,其中,最左边的值必须为0,最右边的值必须为1,否则,会出现InvalidParameter的错误。

        调用该方法后,将在沿渐变线的每一位置创建具有一种颜色的多色渐变。设置该属性将使该 TGpLinearGradientBrush对象的以前所有颜色、位置和过渡设置无效。当然,尺寸和方向设置还是有效的。下面的代码建立了一个45度角的5色渐变刷,填充效果见图五:

//  Delphi 2007
var
  brush: TGpLinearGradientBrush;
begin
  brush :
=  TGpLinearGradientBrush.Create(GpRect( 0 0 128 128 ),  0 0 45 );
  brush.SetInterpolationColors([kcGreen, kcYellow, kcRed,
        kcBlue, kcOrange], [
0 0.25 0.5 0.75 1 ]);
  
//  假定TGpGraphics对象g已经建立
  g.FillRectangle(brush,  0 0 128 128 );
  brush.Free;
end;

//  C++ Builder 2007
    TGpColor colors[]  =  {kcGreen, kcYellow, kcRed, kcBlue, kcOrange};
    
float  ps[]  =  { 0 0.25 0.5 0.75 1 };
    TGpLinearGradientBrush 
* brush  =
    
new  TGpLinearGradientBrush(TGpRect( 0 0 128 128 ),  0 0 45 );
    brush
-> SetInterpolationColors(colors, ps,  5 );
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush,  0 0 128 128 );
    delete brush;

例子中的渐变线的位置是均匀分配的(00.250.50.751),改变各个位置的值,可增减任意2色之间的过渡宽度。

         

                   图五                                              图六                                               图七

        三、其它设置

        1、重新设置起始色和结束色。下面的C++代码演示了颜色设置:

    TGpLinearGradientBrush  * brush  =
        
new  TGpLinearGradientBrush(TGpRect( 0 0 128 128 ), kcYellow, kcRed);
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush,  0 0 128 128 );        //  黄色到红色的渐变
    brush -> SetLinearColors(kcWhite, kcBlack); //  重新设置渐变色
    g -> TranslateTransform( 128 0 );
    g
-> FillRectangle(brush,  0 0 128 128 );        //  白色到黑色的渐变
    delete brush;

        2、设置双色渐变的混合因子。TGpLinearGradientBrush的SetBlend方法可以按指定的位置设置渐变色的混合因子,该方法定义如下:

    // 设置 Blend,它指定为渐变定义自定义过渡的位置和因子。对双色渐变有效
    // blendFactors:用于渐变的混合因子数组,混合因子表示相应位置结束色占起始色的比率。
    // blendPositions:渐变的混合位置的数组,这些位置是介于 0 到 1 之间的值,
    // 最左边必须为0,最右边必须为1
    procedure SetBlend(const blendFactors, blendPositions: array of Single);

下面的代码演示混合效果,效果图见图六:

//  Delphi 2007
var
  brush: TGpLinearGradientBrush;
begin
  brush :
=  TGpLinearGradientBrush.Create(GpRect( 0 0 128 128 ), kcYellow, kcRed);
  
//  假定TGpGraphics对象g已经建立
  g.FillRectangle(brush,  0 0 128 128 );
  brush.SetBlend([
0 0.3 1 ], [ 0 0.5 1 ]);
  g.TranslateTransform(
128 0 );
  g.FillRectangle(brush, 
0 0 128 128 );
  brush.Free;
end;

//  C++ Builder 2007
     float  fs[]  =  { 0 0.3 1 };
    
float  ps[]  =  { 0 0.5 1 };
    TGpLinearGradientBrush 
* brush  =
        
new  TGpLinearGradientBrush(TGpRect( 0 0 128 128 ), kcYellow, kcRed);
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush,  0 0 128 128 );
    brush
-> SetBlend(fs, ps,  3 );
    g
-> TranslateTransform( 128 0 );
    g
-> FillRectangle(brush,  0 0 128 128 );
    delete brush;

效果图左边是正常渐变填充,右边则是设置中间位置(0.5)的混合因子0.3(正常情况应该为0.5),所以右边图的中间的黄色比例比正常渐变大。

        3、设置钟型曲线渐变。

    // 创建基于钟形曲线的渐变过渡过程。
    // focus: 0 - 1,指定渐变中心(渐变中只由结束色构成的点)。
    // scale: 0 - 1, 指定颜色从 focus 过渡的规模(程度)。

    procedure SetBlendBellShape(focus: Single; scale: Single = 1.0);       

    TGpLinearGradientBrush  * brush  =
        
new  TGpLinearGradientBrush(TGpRect( 0 0 128 128 ),  kcRed, kcYellow);
    brush
-> SetBlendBellShape( 0.5 1.0 );
    
//  假定TGpGraphics对象g已经建立
    g -> FillRectangle(brush,  0 0 128 128 );

        上面的C++代码演示了一个钟型曲线渐变填充,渐变中心点为0.5,如果小于0.5,钟型曲线偏左,大于则偏右;渐变过渡程度为1,随着这个值的减小,结束色黄色就越淡。效果图见图七。

        4、中心色向两端单个颜色线性过渡的线性渐变。

    // 创建一个从中心色向两端单个颜色线性过渡的线性渐变过程。参数同钟型曲线渐变
   procedure SetBlendTriangularShape(focus: Single; scale: Single = 1.0);

var
  brush: TGpLinearGradientBrush;
begin
  brush :
=  TGpLinearGradientBrush.Create(GpRect( 0 0 128 128 ), kcRed, kcYellow);
  
try
    brush.SetBlendTriangularShape(
0.5 );
    g.FillRectangle(brush, 
0 0 128 128 );
  
finally
    brush.Free;
  end;
end;

        上面的Delphi代码演示了中心色向两端渐变,参数的设置原理同钟型渐变,效果图见图八。  

        5、伽玛修正。

        如果在上面的代码中填充图形前加入:brush.GammaCorrection := True;则启用伽玛修正,效果图见图九,可以同图八进行比较。

       

                   图八                                图九

        6、其它。如画刷几何变换和绕行模式对填充的影响,可参见《GDI+ for VCL基础 -- 画刷之TextureBrush》。

 

GDI+ SDK参考(翻译版本) 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值