科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于VC.NET的GDI+编程入门之画刷

基于VC.NET的GDI+编程入门之画刷

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

基于线条的、封闭的图形需要画笔来表现,封闭的形状的典型的特点在于它可以用图形、颜色或模式来填充。

作者:coffer编译 来源:VCKBASE 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(三)纹理画刷

  网格画刷依赖于已经预先设计的模式来填充图形,在某些情况下,需要设计自己的图案来填充一个图形。要这么做,必须执行两个步骤,首先设计一个图形并存储为一个文件,然后创建一个纹理画刷,并将图案传递给它。

  纹理画刷拥有图案,并且通常使用它来填充封闭的图形。为了对它初始化,可以使用一个已经存在的别人设计好了的图案,或使用常用的设计程序设计的自己的图案,同时应该使图案存储为常用图形文件格式,如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方式效果图
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章