解析.Net框架下的GDI+编程

来源:互联网 发布:淘宝淘一站网店 编辑:程序博客网 时间:2024/05/29 12:28

目前微软的.Net框架正进一步发展,1.1版本即将发布,伴随而来是增加了诸如命名空间(Namespace)、Windows Form、GDI+和CLR等新概念、新机制。本文就来向大家介绍一下.Net框架下GDI+编程的一些基本知识。

GDI+是从GDI演化而来的,但是在Visual Studio的以前版本中使用GDI是相当复杂的,而且工作量巨大。现在在GDI+中,微软已经帮我们解决了许多问题,因而使用GDI+编程将变得非常容易。

GDI+包含在System.Drawing.Dll集合中,所有的GDI+类包含在System.Drawing,System.Text,System.Printing,System.Internal,System.Imaging,System.Drawing2D以及System.Design等命名空间中。

本文先向大家介绍一下图形类(GraphicsClass)。然后,会向大家介绍一些最常用的类和结构,包括画笔(Pen)、画刷(Brush)、字体(Font)、颜色(Color)等类或结构。文章的最后还给出了一些很有用的用.Net框架的原生语言C#实现的例子。

图形类(Graphics Class)

我们用图形类的对象来表示GDI+的图形表面。为了使用GDI+,我们必须先建立一个图形类对象。通常,我们可以从Paint这个事件获得图形类对象的一个引用或是通过重载方法OnPaint来取得该对象。具体方法如下:

private void form1_Paint(object sender, PaintEventArgs pe)
{
Graphics g = pe.Graphics;
}

或是:

protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics;
}

建立好图形类对象后,我们就可以调用以下一些方法来完成基本的画图功能了。

DrawArc(已重载的)画一段弧线DrawClosedCurve(已重载的)画一段由一些点确定的闭合折线DrawCurve(已重载的)画一段由一些点确定的折线DrawEllipse(已重载的)画一个椭圆DrawImage(已重载的)画一副图象DrawLine(已重载的)画一条直线DrawPath画一段路径(包括直线和曲线)DrawPie(已重载的)画一个馅饼区的轮廓DrawPolygon(已重载的)画一个多边形的轮廓DrawRectangle(已重载的)画一个矩形的轮廓DrawString(已重载的)画一串字符串FillEllipse(已重载的)填充一个椭圆形区域FillPath填充一个路径FillPie(已重载的)填充一个馅饼区域FillPolygon(已重载的)填充一个多边形FillRectangle用画刷填充一个矩形FillRectangles用画刷填充一系列矩形FillRegion填充一个区域图形对象

建立图形对象后,我们就可以用它来画线、填充图形以及画文本等等。以下是一些主要的图形对象:

Brush用来填充特定的表面Pen用来画直线、多边形、矩形、弧线以及馅饼区等Font用来设置文本的字体Color用来设置特定对象的颜色(在GDI+中,颜色可以是Alpha混合的)画刷类(Brush Class)

画刷类是一个抽象基类,我们不能直接将它实例化。我们必须实例化它的子类对象,它的子类包括:SolidBrush,TextureBrush,RectangleGradientBrush以及LinearGradientBrush。

举例如下:

LinearGradientBrush  lBrush = new  LinearGradientBrush(rect, Color.Red, 
Color.Yellow,
LinearGradientMode.BackwardDiagonal);
Brush brsh = new SolidBrush(Color.Red), 40, 40, 140, 140);

SolidBrush类定义一把由单色构成的画刷。这个画刷可以用来填充像矩形、椭圆形、馅饼形、多边形以及路径这样的图形区域。

TextureBrush类定义一把可以将一定区域用图象来填充的画刷。

LinearGradiantBrush类可以定义一把两种颜色间变化的画刷,也可以定义一把多种颜色间变化的画刷。

画笔类(Pen Class)

画笔类用来画具有特定宽度和风格的直线和曲线。我们必须先用画笔类的构造函数初始化一个画笔对象,在实例化的时候还可以用到颜色和画刷。

用特定的颜色初始化新的画笔对象:

public Pen(Color);

用特定的画刷初始化新的画笔对象:

public Pen(Brush);

用特定的画刷以及宽度初始化新的画笔对象:

public Pen(Brush, float);

用特定的颜色以及宽度初始化新的画笔对象:

public Pen(Color, float);

举例如下:

Pen  pn = new  Pen( Color.Blue );

或是:

Pen  pn = new  Pen( Color.Blue, 100 );

以下是画笔类的一些最常用的属性:

Alignment获得或设置用画笔画的对象的边界Brush获得或设置决定画笔特性的画刷Color获得或设置画笔的颜色Width获得或设置画笔的宽度字体类(Font Class)

字体类决定了特定文本的字体格式,比如:字体类型、大小以及风格。我们用字体类的构造函数建立一种字体。

用特定的属性初始化新的字体对象:

public Font(string, float);

用特定的已存在的字体和字体风格初始化新的字体对象:

public Font(Font, FontStyle);

以下是一些字体风格:

Bold粗体Italic斜体Regular正常字体Strikeout有删除线Underline有下划线

举例如下:

Graphics  g ;
Font font = new Font("Times New Roman", 26);

颜色结构(Color Structure)

一个颜色结构代表一种ARGB格式的颜色。以下是它的ARGB属性:

A:获得颜色的Alpha成分值

B:获得颜色的蓝色成分值

G:获得颜色的绿色成分值

R:获得颜色的红色成分值

下面是如何使用颜色结构的例子:

Pen  pn = new  Pen( Color.Blue );

到现在,我相信大家已经对.Net框架下的GDI+有了大致的了解。为了让大家更直观的理解有关GDI+的编程知识,我特意为大家准备了以下一些基本但又很有用例子。通过对这些例子的学习,我相信大家对.Net框架下的GDI+编程会有更深刻的理解。同时要说明的是,下面的例子是用C#语言实现的,如果你是一位VB.net的爱好者,不妨通过适当修改代码来实现同样的功能。

画一个矩形:

protected override void OnPaint(PaintEventArgs pe) 
{
Graphics g = pe.Graphics ;
//设置矩形区域的位置和大小
Rectangle rect = new Rectangle(0, 0, 200, 200);
//使填充矩形的颜色从红色到黄色渐变
LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red, Color.Yellow,
LinearGradientMode.BackwardDiagonal);
g.FillRectangle(lBrush, rect);
}

图示如下:

画一个椭圆:

protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics ;
//建立一只100象素宽、呈蓝色的画笔
Pen pn = new Pen( Color. ForestGreen, 100 );
Rectangle rect = new Rectangle(50, 50, 180, 100);
g.DrawEllipse( pn, rect );
}

图示如下:

画一段文本:

protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics;
//文本内容为"Welcome to the Graphics World!"
g.DrawString("Welcome to the Graphics World!", this.Font, new SolidBrush(Color.Red), 10,10);
}

图示如下:

画一条直线:

protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics ;
Pen pn = new Pen( Color.Blue, 10 );
//预先设定好两个点
Point pt1 = new Point( 30, 30);
Point pt2 = new Point( 110, 100);
g.DrawLine( pn, pt1, pt2 );
}

图示如下:

画一段折线:

protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics;
//建立一只20象素宽、呈粉红色且半透明的画笔
Pen penExample = new Pen(Color.FromArgb(150, Color.Purple), 20);
//使画笔画出虚线
penExample.DashStyle = DashStyle.Dash;
//将画笔开始和结束处都设置为圆形
penExample.StartCap = LineCap.Round;
penExample.EndCap = LineCap.Round;
//现在用画笔画曲线
g.DrawCurve(penExample, new Point[] {
new Point(100, 70),
new Point(350, 120),
new Point(250, 170),
new Point(70, 70),
new Point(20, 170),
});
}

图示如下:

画一个填充颜色逐渐变化的多边形图形:

protected override void OnPaint(PaintEventArgs e)//这里是重载OnPaint函数
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(180,Color.White)),
ClientRectangle);
//建立图形路径
GraphicsPath path = new GraphicsPath(new Point[] {
new Point(40, 40),
new Point(275, 100),
new Point(105, 125),
new Point(190, 200),
new Point(50, 250),
new Point(20, 80),
}, new byte[] {
(byte)PathPointType.Start,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Line,
(byte)PathPointType.Line,
});
//建立一个PathGradientBrush对象
PathGradientBrush pgb = new PathGradientBrush(path);
pgb.SurroundColors = new Color[] {
Color.Green,
Color.Yellow,
Color.Red,
Color.Blue,
Color.Orange,
Color.White,
};
//最后进行填充
e.Graphics.FillPath(pgb, path);
}

图示如下:

(注:以上例子均需在Windows2000 Server版或Windows XP Professional版以及Vs.net环境下才能实现)

(责任编辑 Sunny)

 

原创粉丝点击