(三)纹理画刷
网格画刷依赖于已经预先设计的模式来填充图形,在某些情况下,需要设计自己的图案来填充一个图形。要这么做,必须执行两个步骤,首先设计一个图形并存储为一个文件,然后创建一个纹理画刷,并将图案传递给它。
纹理画刷拥有图案,并且通常使用它来填充封闭的图形。为了对它初始化,可以使用一个已经存在的别人设计好了的图案,或使用常用的设计程序设计的自己的图案,同时应该使图案存储为常用图形文件格式,如BMP格式。这里有一个设计好的位图,被存储为Papers.bmp文件。
 图四、位图效果图 | 有了图案,这时候就可以使用TextureBrush类,它有多种构造函数,最简单的构造函数只有一个Image对象做为参数,这个构造函数的语法是:
| public: TextureBrush(Image *bitmap); | 这个构造函数使用位图作为参数。初始化画刷后,你可以使用它来填充封闭的图形。例如你可以调用Fill...方法。下面是例子:
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers); e->Graphics->FillRectangle(brushPapers, 5, 5, 430, 280); } |
 图五、代码运行效果图 | 如果使用这个构造函数,编译器自身将对图案的尺寸和位置进行定位,尽管位置必须在(0,0)处,但长和宽必须小于或等于设计的图形尺寸,例如,有一个图案是48x48像素,你使用的图形的宽度和高度必须小于等于48,这样就允许只使用图形的一部分,为此需要使用下面的构造函数:
| public: TextureBrush(Image *bitmap, Rectangle destination); | 这个函数的第二个参数规定了图案的尺寸,如果愿意使用十进制的矩形参数,可以使用如下构造函数:
| public: TextureBrush(Image *bitmap, RectangleF destination); | 这有一个例子:
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers, new Rectangle(0, 0, 40, 42)); e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290); } |
 图六、代码运行效果图 | 目前为止我们使用的构造函数都是以平铺的方式在每个定位的矩形内绘制图案。为了更有趣,TextureBrush类提供了一个参数用来指定覆盖模式,可以使用下面的构造函数,
public: TextureBrush(Image *bitmap, WrapMode wrapMode); public: TextureBrush(Image *bitmap, WrapMode wrapMode, Rectangle destination); public: TextureBrush(Image *bitmap, WrapMode wrapMode, RectangleF destination); | 位图和尺寸参数与上述含义一样,wrapMode参数是枚举WrapMode的一个成员,枚举WrapMode定义在System::Drawing::Drawing2D名字空间中。
它有下面的成员:
·Clamp:在分配的矩形内只绘制一个图案。
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode::Clamp); e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290); } |
 图七、Clamp方式效果图 | ·Tile:以平铺方式绘图
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode::Tile, Rectangle(0, 0, 40, 42)); e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290); } |
 图八、Tile方式效果图 | ·TileFlipX:水平方向交差对称方式
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode::TileFlipX); e->Graphics->FillRectangle(brushPapers, 5, 5, 430, 290); } |
 图九、TileFlipX方式效果图 | ·TileFlipXY:水平竖直方向均交叉对称
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { Bitmap *bmpPapers = new Bitmap(S"Papers.bmp"); TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode.TileFlipXY, Rectangle(0, 0, 42, 42)); e->Graphics->FillRectangle(brushPapers, 5, 5, 412, 244); } |
 图十、TileFlipXY方式效果图 |
|
|