`
sogotobj
  • 浏览: 651678 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
本文为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的TGpTextureBrush为纹理刷,也叫位图填充刷,顾名思义,是使用位图中的纹理来填充图形的画刷,假设图形存储在磁盘文件MyTexture.bmp中,下面的代码将创建一个由MyTexture.bmp中存储的图片反复填充得到的椭圆:

var
brush:TGpTextureBrush;
Image:TGpImage;
begin
Image:
=TGpImage.Create('MyTexture.bmp');
brush:
=TGpTextureBrush.Create(Image);
//假定TGpGraphics对象g已经建立
g.FillEllipse(brush,0,0,100,50);
......
end;

TGpTextureBrush的纹理填充效果不仅因不同的位图图案而异,也受各种设置的影响,同样的位图图案会产生各种不同的效果,下面谈谈影响填充效果的几个因素:

1、绕行模式。GDI+ 定义的绕行模式如下:

TWrapMode=(
wmTile,
//平铺渐变或纹理。
wmTileFlipX,//水平反转纹理或渐变,然后平铺该纹理或渐变。
wmTileFlipY,//垂直反转纹理或渐变,然后平铺该纹理或渐变。
wmTileFlipXY,//水平和垂直反转纹理或渐变,然后平铺该纹理或渐变。
wmClamp//将纹理和渐变向对象边界拉拢。
);

不同的绕行模式决定位图纹理的重复方式,如设置为wmTileFlipX,填充图案依次水平反转进行填充,缺省为wmTile。稍后给出例子。

2、位图图案裁剪尺寸。这个很容易明白,同一个位图,使用的图案位置和大小对填充肯定有影响。

3、几何变换。TGpTextureBrush可以设置全局和局部的几何变换,包括平移、缩放、旋转、切变以及各种组合变换,这将造成位图图案的变形,从而影响填充效果,如brush.RotateTransform(45);使得原填充图案旋转45度。填充图案也受TGpGraphics几何变换的影响,比如使用TGpGraphics.TranslateTransform方法后,图案填充将按相对坐标进行,否则会按绝对坐标填充,对于实际的图形位置,相对坐标和绝对坐标会影响填充的效果,因为TGpTextureBrush的图案填充是以坐标原点开始的,g.FillRectangle(brush, 10, 10, 100, 100);使用的是绝对坐标,填充将从图案的10,10点位置开始;而g.TranslateTransform(10, 10);g.FillRectangle(brush, 0, 0, 100, 100);图形输出到前面相同的位置,但是填充却是从图案的0,0点位置开始的。具体例子代码稍后给出。

4、图像显示属性。建立TGpTextureBrush对象时,可以给定义个TGpImageAttributes(该类将会在以后的文章中具体讨论)对象,而这个对象的各种设置会对位图图案产生影响,如下面的代码会产生一个和前面例子中相同的半透明填充图案的椭圆图形:

const
ColorMatrix:TColorMatrix
=
((
1.0,0.0,0.0,0.0,0.0),
(
0.0,1.0,0.0,0.0,0.0),
(
0.0,0.0,1.0,0.0,0.0),
(
0.0,0.0,0.0,0.5,0.0),
(
0.0,0.0,0.0,0.0,1.0));
var
brush:TGpTextureBrush;
Image:TGpImage;
attr:TGpImageAttributes;
begin
Image:
=TGpImage.Create('MyTexture.bmp');
attr:
=TGpImageAttributes.Create;
attr.SetColorMatrix(ColorMatrix);
brush:
=TGpTextureBrush.Create(Image,GpRect(0,0,Image.Width,Image.Height),attr);
//假定TGpGraphics对象g已经建立
g.FillEllipse(brush,0,0,100,50);
......
end;

例子构造方法中的矩形就是参数就是设置位图图案的位置及大小,本例取全部图案。有关纹理刷TGpTextureBrush的介绍就到这里,下面给出例子片断和效果图:

Delphi 例子:

procedureTForm1.FormCreate(Sender:TObject);
var
backgroundImage:TGpImage;
begin
backgroundImage:
=TGpBitmap.Create('....Mediamarble.jpg');
try
FBackgroundBrush:
=TGpTextureBrush.Create(backgroundImage);
finally
backgroundImage.Free;
end;
FShadowBrush:
=TGpSolidBrush.Create(ARGB(80,kcBlack));
DoubleBuffered:
=True;
PaintProc:
=TexturePaint;
end;

procedureTForm1.FormDestroy(Sender:TObject);
begin
FBackgroundBrush.Free;
FShadowBrush.Free;
end;

procedureTForm1.PaintBox1Paint(Sender:TObject);
var
g:TGpGraphics;
begin
g:
=TGpGraphics.Create(PaintBox1.Canvas.Handle);
try
g.FillRectangle(FBackgroundBrush,GpRect(PaintBox1.ClientRect));
PaintProc(g);
finally
g.Free;
end;
end;

procedureTForm1.SetPaintProc(
constValue:TPaintProc);
begin
FProc:
=Value;
PaintBox1.Invalidate;
end;

procedureTForm1.TexturePaint(g:TGpGraphics);
var
brush:TGpTextureBrush;
Image:TGpImage;
I:Integer;
begin
Image:
=TGpImage.Create('....Mediacolorbars1.jpg');
brush:
=TGpTextureBrush.Create(Image);
Image.Free;
try
forI:=0to4do
begin
ifImod2=0then
begin
g.ResetTransform;
g.TranslateTransform(
-165,Idiv2*94+10);
end;
g.TranslateTransform(
175,0);
brush.WrapMode:
=TWrapMode(I);
g.FillRectangle(FShadowBrush,
3,3,165,85);
g.FillRectangle(brush,
0,0,165,85);
end;
//旋转45度
brush.RotateTransform(45);
brush.WrapMode:
=wmTile;
g.TranslateTransform(
175,0);
g.FillRectangle(FShadowBrush,
3,3,165,85);
g.FillRectangle(brush,
0,0,165,85);
finally
brush.Free;
end;
end;

代码中的PaintProc是个过程属性。注意例子中的图案填充是按相对坐标进行的。

C++ Builder 例子:

//---------------------------------------------------------------------------
void__fastcallTForm1::FormCreate(TObject*Sender)
{
TGpImage
*backgroundImage=newTGpBitmap("..\..\Media\marble.jpg");
try
{
FBackgroundBrush
=newTGpTextureBrush(backgroundImage);
}
__finally
{
deletebackgroundImage;
}
FShadowBrush
=newTGpSolidBrush(TGpColor(80,kcBlack));
DoubleBuffered
=true;
PaintProc
=&TexturePaint;
}
//---------------------------------------------------------------------------
void__fastcallTForm1::FormDestroy(TObject*Sender)
{
deleteFBackgroundBrush;
deleteFShadowBrush;
}
//---------------------------------------------------------------------------
void__fastcallTForm1::SetPaintProc(constTPaintProcValue)
{
FProc
=Value;
PaintBox1
->Invalidate();
}
//---------------------------------------------------------------------------
void__fastcallTForm1::PaintBox1Paint(TObject*Sender)
{
TGpGraphics
*g=newTGpGraphics(PaintBox1->Canvas->Handle);
try
{
g
->FillRectangle(FBackgroundBrush,TGpRect(PaintBox1->ClientRect));
PaintProc(g);
}
__finally
{
deleteg;
}
}
//---------------------------------------------------------------------------
void__fastcallTForm1::TexturePaint(TGpGraphics*g)
{
TGpImage
*Image=newTGpImage("..\..\Media\colorbars1.jpg");
TGpTextureBrush
*brush=newTGpTextureBrush(Image);
deleteImage;
try
{
for(intI=wmTile;I<=wmClamp;I++)
{
if(I%2==0)
{
g
->ResetTransform();
g
->TranslateTransform(-165,I/2*94+10);
}
g
->TranslateTransform(175,0);
brush
->WrapMode=(TWrapMode)I;
g
->FillRectangle(FShadowBrush,3,3,165,85);
g
->FillRectangle(brush,0,0,165,85);
}
brush
->RotateTransform(45);
brush
->WrapMode=wmTile;
g
->TranslateTransform(175,0);
g
->FillRectangle(FShadowBrush,3,3,165,85);
g
->FillRectangle(brush,0,0,165,85);
}
__finally
{
deletebrush;
}
}
//---------------------------------------------------------------------------

效果图:

效果图中,左上为wmTile模式,图案循环填充;右上为wmTileFlipX模式,图案依次水平反转填充;左中为wmTileFlipY模式,图案依次垂直反转填充;右中是wmTileFlipXY,图案水平和垂直方向同时反转填充;左下是wmClamp模式,非平铺填充方式,所以只填充了一个图案,如果使用绝对坐标,由于该位置远离原点,图案将不可见;右下则是wmTile模式,画刷旋转45度后的输出效果。

分享到:
评论

相关推荐

    GDI+_for_VCL基础

    画刷则负责填充图形,GDI+ for VCL中包含了多种画刷类型,如SolidBrush(实色刷)、HatchBrush(阴影刷)、LinearGradientBrush(线性渐变刷)、TextureBrush(纹理刷)和PathGradientBrush(路径渐变刷)。这些画刷...

    GDI+ for VCL

    GDI+ for VCL 是一个专门为 Delphi 和 C++Builder 开发者设计的库,它允许程序员利用 GDI+(图形设备接口加)的功能在这些编程环境中创建丰富的图形和图像处理应用。GDI+ 是微软提供的一种图形绘制技术,比传统的 ...

    c++ GDI,C++Builder GDI,GDI,Png,Png to Image,支持多种图片格式,能够在多种图片间进行转换(bmp,jpg,wmf,emf,png,gif)

    GDI+ for VCL 提供了许多种画刷,包括 PathGradientBrush、LinearGradientBrush、TextureBrush、HatchBrush 和 SolidBrush 等。这些画刷可以用于填充图形、绘制路径和图案等。 GDI+ for VCL 基础 -- GDI+ 与 VCL ...

    GDI+ for VCL and GDI+ for C (2010.10.7)

    标签中的"C/C++"表明这是针对C++程序员的资源,"GDI+"意味着它是关于GDI+编程的,"Gdiplus"是GDI+的库名,"VCL"指的是与Delphi和C++Builder中的组件库相关的部分,"BCB"(Borland C++ Builder)表示该资源也适用于...

    Delphi使用GDI+制作任意图片形状窗口

    GDI+提供了丰富的图形对象,如画刷、画笔、图像、字体等,以及用于绘制这些对象的方法。在Delphi中,我们可以导入GDI+的头文件(如GDIPAPI.dcu和GDIPOBJ.dcu),以便在我们的项目中使用GDI+的功能。 创建任意图片...

    Delphi用的强大的控件DevExpressVCL一键编译安装工具_v10.0+-+2018-03-18(2018新春版)

    本工具为"DevExpress VCL一键编译安装工具_v10.0+-+2018-03-18(2018新春版)",专为方便Delphi用户快速安装和使用DevExpress VCL控件集而设计。 Delphi,源自 Borland 公司,现在由 Embarcadero Technologies 维护...

    DevExpressVCL+17.2.4+V1+XE-RAD10.2.2+FullSource+Fix+By+Flying+Wang+自动编译安装+带汉化包+V2018-02-14.zip

    标题 "DevExpressVCL+17.2.4+V1+XE-RAD10.2.2+FullSource+Fix+By+Flying+Wang+自动编译安装+带汉化包+V2018-02-14.zip" 暗示了这是一个包含DevExpress VCL组件的压缩包,版本为17.2.4,由Flying Wang修复并提供了...

    FastReport+VCL+v5.4.6+Pro+for+D7-D10.2+Full+Source

    总的来说,FastReport VCL v5.4.6 Pro for D7-D10.2 Full Source是一个全面的报表解决方案,它提供了一套强大的工具,帮助Delphi开发者高效地创建、管理和分发报表,提升应用程序的专业性和用户体验。通过其丰富的...

    BCB6版GDI+桌面歌词

    标题中的“BCB6版GDI+桌面歌词”是指使用了Borland C++ Builder 6(简称BCB6)开发的一个应用,该应用利用了“妖哥的GDI+库”来实现桌面歌词的展示功能。GDI+是微软Windows操作系统提供的一种图形设备接口,用于增强...

    DevExpress VCL Auto-Installer 1.81

    +------ ExpressCommon Library | +------ Packages ------- Sources ------- ... +------ ExpressBars 6 | +------ Packages +------ Sources +------ ... +------ ExpressQuantumGrid 6 | +------ ...

    H.264 源码与RTP发送和接收的处理

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | +-+-+-+-+-+-+-...

    DevExpress VCL Auto-Installer v1.8

    +------ ExpressCommon Library | +------ Packages ------- Sources ------- ... +------ ExpressBars 6 | +------ Packages +------ Sources +------ ... +------ ExpressQuantumGrid 6 | +------ ...

    delphi GDI+ 缩略图查看

    本项目“Delphi GDI+ 缩略图查看”是一个利用GDI+库实现的功能,它旨在创建一个类似ACDSee的图片浏览体验,让用户能够快速预览和查看图像的缩略图。 GDI+(Graphics Device Interface Plus)是微软提供的一个图形...

    DBISAM VCL Client-Server V4.02 for D567

    DBISAM VCL Client-Server with Source Code 4.02 for Delphi 567;压缩包含DBISAM Additional Software and Utilities 4.02。DBISAM VCL Client-Server是一个优秀的文件型数据库引擎,拥用自己特有的文件格式和接口...

    H264 RTP 发送和接收

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | +-+-+-+-+-+-+-...

    GDI+用PNG图片做半透明异型窗口 Delphi

    Delphi通常使用VCL(Visual Component Library)进行UI构建,而GDI+则提供了一种在Delphi程序中实现更复杂图形操作的方法。要使用GDI+,你需要包含`gdiplus.pas`单元,这个单元为Delphi程序员提供了GDI+的接口。 ...

    gdi+绘制jpeg、png

    首先,GDI+相比Delphi自带的VCL组件,提供了更多的图像处理功能,如抗锯齿、透明度调整、图像旋转、缩放等。GDI+的接口设计更加面向对象,使得代码更易于理解和维护。 在`TestSynGdiPlusMain.dfm`文件中,可以看到...

    ElevateDB VCL 203--Dbisam的替代数据库

    ElevateDB VCL 203--Dbisam的替代数据库

    CMP_Button_GDI+Button_

    描述 "GDI+ Button for usage in Delphis forms" 明确了这款组件是专门用于Delphi的表单设计。Delphi是一种流行的面向对象的 Pascal 编程语言,它的集成开发环境(IDE)以其强大的VCL(Visual Component Library)...

    Jedi Code Library V1.22 + JEDI VCL 2.10 For D5-D7

    总的来说,"Jedi Code Library V1.22 + JEDI VCL 2.10 For D5-D7" 是Delphi开发者不可或缺的工具集,它能提升开发效率,确保代码质量,并提供大量实用功能,使得开发者能够更专注于业务逻辑的实现,而不是基础功能的...

Global site tag (gtag.js) - Google Analytics