<script src="http://www.cnnet.com.cn/servlets/ad?Pool=tech_art_center&ajtype=jscript"> </script> 目前微软的.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环境下才能实现) (责任编辑 Sunny ) |