|
<p >目前微软的.Net框架正进一步发展,1.1版本即将发布,伴随而来是增加了诸如命名空间(Namespace)、Windows Form、GDI+和CLR等新概念、新机制。本文就来向大家介绍一下.Net框架下GDI+编程的一些基本知识。<p >GDI+是从GDI演化而来的,但是在Visual Studio的以前版本中使用GDI是相当复杂的,而且工作量巨大。现在在GDI+中,微软已经帮我们解决了许多问题,因而使用GDI+编程将变得非常容易。<p >GDI+包含在System.Drawing.Dll集合中,所有的GDI+类包含在System.Drawing,System.Text,System.Printing,System.Internal,System.Imaging,System.Drawing2D以及System.Design等命名空间中。<p >本文先向大家介绍一下图形类(Graphics Class)。然后,会向大家介绍一些最常用的类和结构,包括画笔(Pen)、画刷(Brush)、字体(Font)、颜色(Color)等类或结构。文章的最后还给出了一些很有用的用.Net框架的原生语言C#实现的例子。<p ><center><font color="#000099"><strong>图形类(Graphics Class)</strong></font></center><p >我们用图形类的对象来表示GDI+的图形表面。为了使用GDI+,我们必须先建立一个图形类对象。通常,我们可以从Paint这个事件获得图形类对象的一个引用或是通过重载方法OnPaint来取得该对象。具体方法如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>private void form1_Paint(object sender, PaintEventArgs pe){Graphics g = pe.Graphics;}</ccid_code></pre></td></tr></table></ccid_nobr><p >或是:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>protected override void OnPaint(PaintEventArgs pe){Graphics g = pe.Graphics;}</ccid_code></pre></td></tr></table></ccid_nobr><p >建立好图形类对象后,我们就可以调用以下一些方法来完成基本的画图功能了。<p ><center><ccid_nobr><table border="1" width="502" class="content"><tr><td>DrawArc </td><td>(已重载的)画一段弧线</td></tr><tr><td>DrawClosedCurve</td><td>(已重载的)画一段由一些点确定的闭合折线</td></tr><tr><td>DrawCurve</td><td>(已重载的)画一段由一些点确定的折线</td></tr><tr><td>DrawEllipse</td><td>(已重载的)画一个椭圆</td></tr><tr><td>DrawImage</td><td>(已重载的)画一副图象</td></tr><tr><td>DrawLine</td><td>(已重载的)画一条直线</td></tr><tr><td>DrawPath</td><td>画一段路径(包括直线和曲线)</td></tr><tr><td>DrawPie</td><td>(已重载的)画一个馅饼区的轮廓</td></tr><tr><td>DrawPolygon</td><td>(已重载的)画一个多边形的轮廓</td></tr><tr><td>DrawRectangle</td><td>(已重载的)画一个矩形的轮廓</td></tr><tr><td>DrawString</td><td>(已重载的)画一串字符串</td></tr><tr><td>FillEllipse</td><td>(已重载的)填充一个椭圆形区域</td></tr><tr><td>FillPath</td><td>填充一个路径</td></tr><tr><td>FillPie</td><td>(已重载的)填充一个馅饼区域</td></tr><tr><td>FillPolygon</td><td>(已重载的)填充一个多边形</td></tr><tr><td>FillRectangle</td><td>用画刷填充一个矩形</td></tr><tr><td>FillRectangles</td><td>用画刷填充一系列矩形</td></tr><tr><td>FillRegion</td><td>填充一个区域</td></tr></table></ccid_nobr></center><p ><center><font color="#000099"><strong>图形对象</strong></font></center><p >建立图形对象后,我们就可以用它来画线、填充图形以及画文本等等。以下是一些主要的图形对象:<p ><center><ccid_nobr><table border="1" width="502" class="content"><tr><td>Brush</td><td>用来填充特定的表面</td></tr><tr><td> en</td><td>用来画直线、多边形、矩形、弧线以及馅饼区等</td></tr><tr><td>Font</td><td>用来设置文本的字体</td></tr><tr><td>Color</td><td>用来设置特定对象的颜色(在GDI+中,颜色可以是Alpha混合的)</td></tr></table></ccid_nobr></center><p ><center><font color="#000099"><strong>画刷类(Brush Class)</strong></font></center><p >画刷类是一个抽象基类,我们不能直接将它实例化。我们必须实例化它的子类对象,它的子类包括:SolidBrush,TextureBrush,RectangleGradientBrush以及LinearGradientBrush。<p >举例如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red, Color.Yellow,LinearGradientMode.BackwardDiagonal);Brush brsh = new SolidBrush(Color.Red), 40, 40, 140, 140);</ccid_code></pre></td></tr></table></ccid_nobr><p >SolidBrush类定义一把由单色构成的画刷。这个画刷可以用来填充像矩形、椭圆形、馅饼形、多边形以及路径这样的图形区域。<p >TextureBrush类定义一把可以将一定区域用图象来填充的画刷。<p >LinearGradiantBrush类可以定义一把两种颜色间变化的画刷,也可以定义一把多种颜色间变化的画刷。<p ><center><font color="#000099"><strong>画笔类(Pen Class)</strong></font></center><p >画笔类用来画具有特定宽度和风格的直线和曲线。我们必须先用画笔类的构造函数初始化一个画笔对象,在实例化的时候还可以用到颜色和画刷。<p >用特定的颜色初始化新的画笔对象:<p >public Pen(Color);<p >用特定的画刷初始化新的画笔对象:<p >public Pen(Brush);<p >用特定的画刷以及宽度初始化新的画笔对象:<p >public Pen(Brush, float);<p >用特定的颜色以及宽度初始化新的画笔对象:<p >public Pen(Color, float);<p >举例如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code> en pn = new Pen( Color.Blue );</ccid_code></pre></td></tr></table></ccid_nobr><p >或是:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code> en pn = new Pen( Color.Blue, 100 );</ccid_code></pre></td></tr></table></ccid_nobr><p >以下是画笔类的一些最常用的属性:<p ><center><ccid_nobr><table border="1" width="502" class="content"><tr><td>Alignment</td><td>获得或设置用画笔画的对象的边界</td></tr><tr><td>Brush</td><td>获得或设置决定画笔特性的画刷</td></tr><tr><td>Color</td><td>获得或设置画笔的颜色</td></tr><tr><td>Width</td><td>获得或设置画笔的宽度</td></tr></table></ccid_nobr></center><p ><center><font color="#000099"><strong>字体类(Font Class)</strong></font></center><p >字体类决定了特定文本的字体格式,比如:字体类型、大小以及风格。我们用字体类的构造函数建立一种字体。<p >用特定的属性初始化新的字体对象:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public Font(string, float);</ccid_code></pre></td></tr></table></ccid_nobr><p >用特定的已存在的字体和字体风格初始化新的字体对象:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public Font(Font, FontStyle);</ccid_code></pre></td></tr></table></ccid_nobr><p >以下是一些字体风格:<p ><center><ccid_nobr><table border="1" width="502" class="content"><tr><td>Bold</td><td>粗体</td></tr><tr><td>Italic</td><td>斜体</td></tr><tr><td>Regular</td><td>正常字体</td></tr><tr><td>Strikeout</td><td>有删除线</td></tr><tr><td>Underline</td><td>有下划线</td></tr></table></ccid_nobr></center><p >举例如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>Graphics g ;Font font = new Font("Times New Roman", 26);</ccid_code></pre></td></tr></table></ccid_nobr><p ><center><font color="#000099"><strong>颜色结构(Color Structure)</strong></font></center><p >一个颜色结构代表一种ARGB格式的颜色。以下是它的ARGB属性:<p >A:获得颜色的Alpha成分值<p >B:获得颜色的蓝色成分值<p >G:获得颜色的绿色成分值<p >R:获得颜色的红色成分值<p >下面是如何使用颜色结构的例子:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code> en pn = new Pen( Color.Blue );</ccid_code></pre></td></tr></table></ccid_nobr><p >到现在,我相信大家已经对.Net框架下的GDI+有了大致的了解。为了让大家更直观的理解有关GDI+的编程知识,我特意为大家准备了以下一些基本但又很有用例子。通过对这些例子的学习,我相信大家对.Net框架下的GDI+编程会有更深刻的理解。同时要说明的是,下面的例子是用C#语言实现的,如果你是一位VB.net的爱好者,不妨通过适当修改代码来实现同样的功能。<p >画一个矩形:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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);}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >画一个椭圆:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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 );}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >画一段文本:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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);}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >画一条直线:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>protected override void OnPaint(PaintEventArgs pe){Graphics g = pe.Graphics en pn = new Pen( Color.Blue, 10 );//预先设定好两个点Point pt1 = new Point( 30, 30) oint pt2 = new Point( 110, 100);g.DrawLine( pn, pt1, pt2 );}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >画一段折线:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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),});}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >画一个填充颜色逐渐变化的多边形图形:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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);}</ccid_code></pre></td></tr></table></ccid_nobr><p >图示如下:<p ><center></center><p >(注:以上例子均需在Windows2000 Server版或Windows XP Professional版以及Vs.net环境下才能实现)<p >(责任编辑 <ccid_nobr>Sunny</ccid_nobr>) <p align="center"></p></p> |
|