分享
 
 
 

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

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

解析.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环境下才能实现)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有