解析.Net框架下的GDI+编程
作者:王凯明 本文选自:赛迪网 2002年12月17日
目前微软的.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等命名空间中。
本文先向大家介绍一下图形类(Graphics Class)。然后,会向大家介绍一些最常用的类和结构,包括画笔(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环境下才能实现)