65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 中的 GDI+ 入门

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.25/5 (24投票s)

2003 年 7 月 31 日

11分钟阅读

viewsIcon

183892

在本文中,我们将了解 GDI+ 的基础知识,以及 GDI+ 如何比其前身 GDI 成为一个更好的接口。

引言

Microsoft .NET 是微软最近发布的开发框架。Microsoft .NET 不仅引入了 C# 和 VB.NET 等强大的语言,还为包括图形、多媒体、Web 开发和语音在内的其他程序员带来了便利。

在本文中,我们将了解 GDI+ 的基础知识,以及 GDI+ 如何比其前身 GDI 成为一个更好的接口。

GDI - 图形用户界面

GDI 代表图形设备接口。在 Microsoft Windows 中,GDI 是一种处理绘图对象(如在窗口、窗体或其他媒体上绘图)的方式。

为什么需要 GDI?要编写 GUI 应用程序,您需要以窗口和控件的形式编写某种可视化界面。只有一种方法可以看到可视化界面——通过硬件,例如打印机和显示器。

GDI 是一组 C++ 类,它提供了借助设备驱动程序将程序数据渲染到硬件设备的功能。GDI 位于程序和硬件之间,并在两者之间传输数据。

在早期版本的 Microsoft 产品中使用 GDI 对象是一件痛苦的事。我已经在 C++ 中使用 Microsoft 产品(C++ 和 VB)超过 5 年,我知道使用 GDI 的痛苦。如果您曾经用 C++ 或 MFC 编程过,我敢打赌您一定也对使用 GDI 对象感到沮丧。您是否尝试过在 C++/MFC 中更改窗口和控件的颜色或字体?

例如,如果您想在 C++ (MFC) 中更改控件的字体,您需要创建一个具有其类型的字体,然后调用 SetFont。请参见图 1.1。

CStatic *lpLabel=(CStatic *)GetDlgItem(IDC_STATIC1);
CFont LabelFont;
LabelFont.CreateFont(20,20,0,0,FW_BOLD,FALSE,FALSE,0,DEFAULT_CHARSET,             
   OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY, 
   DEFAULT_PITCH,NULL);
lpLabel->;SetFont(&LabelFont,TRUE);

图 1.1。

这只是一个简单的例子。如果您想更改工具栏的背景颜色怎么办?那会更痛苦。您需要重写 OnEraseBackground 并获取 pDC 对象等等。

GDI+:更高级别的 API

在 Visual Studio .NET 中,微软解决了大多数 GDI 问题,并使其易于使用。.NET 的 GDI 版本称为 GDI+。

GDI+ 是 GDI 的下一代演进。它是一个比 GDI 改进得多且易于使用的版本。GDI+ 最好的地方在于您无需了解任何驱动程序的详细信息即可在打印机和显示器上渲染数据。GDI+ 会为您处理这些。换句话说,GDI 是一个中低级编程 API,您需要了解设备;而 GDI+ 是一个更高级别的编程模型,它提供了为您工作的函数。

例如,如果您想设置控件的背景或前景颜色,只需设置控件的 ForeGroundColor 属性即可。我们将在本教程的后面更深入地探讨所有这些内容。

GDI+ 有什么新功能?

除了 GDI+ API 比 GDI 更简单灵活之外,API 还增加了许多新功能。GDI+ 提供的一些新功能包括:

  • 改进的颜色。现在 GDI+ 提供了更多颜色,并且这些颜色与其他颜色(如 Windows 等)兼容。 
  •    抗锯齿支持 
  •    渐变画笔 
  •    样条曲线 
  •    变换和矩阵 
  •    可伸缩原因 
  •    Alpha 混合

很难在这篇文章中涵盖所有内容,但也许在本系列下一篇文章中,我将涵盖其中一些详细信息。

本文涵盖了什么?

在本文中,我们首先将讨论 GDI+ 类(在 .NET 中也称为类型)和接口,然后讨论 GDI+ 对象,最后我们将看到一些示例。

.NET 中的 GDI+ 类和接口

在 Microsoft .NET 库中,所有类(类型)都分组在命名空间中。namespace 只是相似类别的分类。例如,与窗体相关的类存储在 Windows.Forms 命名空间中,与数据库相关的类分组在 Data 及其子命名空间(如 System.Data.SqlClientSystem.Data.OleDbSystem.Data.Common)中。同样,GDI+ 类也分组在六个命名空间下,这些命名空间位于 System.Drawing.dll 程序集中。

GDI+ 命名空间

GDI+ 定义在 Drawing 命名空间及其五个子命名空间中。所有绘图代码都位于 **System.Drawing.DLL** 程序集中。这些命名空间是 System.Drawing、System.Drawing.DesignSystem.Drawing.Printing、 System.Drawing.ImagingSystem.Drawing.Drawing2DSystem.Drawing.Text 命名空间。 

现在让我们快速浏览一下这些命名空间。

System.Drawing 命名空间

System.Drawing 命名空间提供了基本的 GDI+ 功能。它包含 BrushPenGraphicsBitmapFont 等基本类的定义。Graphics 类在 GDI+ 中起着重要作用,并包含将显示设备绘图的方法。下表包含 System.Drawing 命名空间中的一些类、结构及其定义。

描述

Bitmap, Image

Bitmap 和 Image 类。

Brush, Brushes

Brush 类用于定义用于填充 GDI 对象(如矩形、椭圆、扇形、多边形和路径)的对象。

Font, FontFamily

定义文本的特定格式,包括字体、大小和样式属性。不可继承。

图形

封装 GDI+ 绘图图面。不可继承。

画笔

定义用于绘制线条和曲线的对象。不可继承。

SolidBrush, TextureBrush,

定义单一颜色的画笔。画笔用于填充图形形状,如矩形、椭圆、扇形、多边形和路径。不可继承。

结构体

结构

描述

Color

表示 ARGB 颜色。

Point, PointF

表示二维 x 和 y 坐标。Point 以数字形式获取 x、y 值。如果您想使用浮点数值,可以使用 PointF。

Rectangle, RectangleF

表示具有整数值的矩形。矩形表示两个点对——左上角和右下角。您可以在 RectangleF 中使用浮点值。

大小

具有有序宽度和高度对的矩形区域的大小。Size 以整数形式表示宽度和高度,而 SizeF 则使用浮点数表示宽度和高度。

System.Drawing.Design 命名空间


与 System.Drawing 相比,**System.Drawing.Design** 命名空间略小。它扩展了设计时用户界面 (UI) 逻辑和绘图功能,并提供了用于自定义工具箱和编辑器类的类。对于初学者,此命名空间中没有内容。目前(.NET Beta 2),它有两种类型的类:

编辑器类

BitmapEditorFontEditorImageEditor 是编辑器类。您可以使用这些类来扩展功能,并在属性窗口中提供编辑图像和字体的选项。

工具箱类

ToolBoxItemToolBoxItemCollection 是两个主要的工具箱类。通过使用这些类,您可以扩展工具箱的功能并提供工具箱项目的实现。

System.Drawing.Drawing2D 命名空间


此命名空间包含用于高级二维和矢量图形功能的类和枚举。它包含用于渐变画笔、矩阵和变换以及图形路径的类。下表定义了一些常用类和枚举:

描述

Blend 和 ColorBlend

这些类定义了渐变画笔的混合。ColorBlend 定义了多色渐变的颜色和位置数组。

GraphicsPath

此类表示一组连接的线条和曲线。

HatchBrush

具有阴影样式、前景色和背景色的画笔。

LinearGradientBrush

提供具有线性渐变的画笔功能。

矩阵

3x3 矩阵表示几何变换。

枚举

枚举

描述

CombineMode

不同的剪裁类型

CompositingQuality

合成的质量

DashStyle

用 Pen 绘制的虚线的样式。

HatchStyle

表示 HatchBrush 可用的不同图案

QualityMode

指定 GDI+ 对象的质量。

SmoothingMode

指定 GDI+ 对象的质量。

System.Drawing.Imaging 命名空间


此命名空间提供高级 GDI+ 图像功能。它定义了图元文件图像的类。其他类是编码器和解码器,它们允许您使用任何图像格式。它还定义了一个 PropertyItem 类,允许您存储和检索有关图像文件的信息。 

System.Drawing.Printing 命名空间


**System.Drawing.Printing** 命名空间定义了应用程序中打印功能的类。下表定义了一些主要类:

描述

PageSettings

页面设置

PaperSize

纸张尺寸。

PreviewPageInfo

单页的打印预览信息。

PrintController

控制文档打印

PrintDocument

将输出发送到打印机。

PrinterResolution

设置打印机的分辨率。

PrinterSettings

打印机设置

System.Drawing.Text 命名空间


虽然大多数字体功能都在 System.Drawing 命名空间中定义,但这里提供了高级排版功能,例如创建字体集合。目前,此类只有三个类:FontCollection、InstalledFontCollection 和 PrivateFontCollection。如您所见,所有这些类都是不言自明的。 

Graphics 类

Graphics 类是所有 GDI+ 类的中心。在讨论了 Graphics 类之后,我将讨论一些常用的 GDI+ 对象及其表示,然后我们将看到一些示例应用程序,将此理论应用到我们的应用程序中,并了解其工作原理。

Graphics 类在 GDI+ 中起着至关重要的作用。无论您去哪里,您都必须经过这个类;)。Graphics 类封装了 GDI+ 绘图图面。在绘制任何对象(例如圆或矩形)之前,我们必须使用 Graphics 类创建一个图面。

有几种方法可以在您的应用程序中获取 Graphics 对象。您可以在窗体的 Paint 事件中获取 Graphics 对象,或者通过重写窗体的 OnPaint() 方法来获取。这两种方法都有一个类型为 **System.Windows.Forms.PaintEventArgs** 的参数。您调用其 Graphics 成员来获取应用程序中的 Graphics 对象。例如:

protected overrides sub OnPaint(ByVal e As 
                          System.Windows.Forms.PaintEventArgs)
      Dim g As Graphics = e.Graphics
End Sub 

现在您已经有了 Graphics 对象。现在您可以做任何您想做的事情。Graphics 类有大量的绘图对象的方法,例如字体、画笔、线条、路径和多边形、图像和椭圆等。下表描述了 Graphics 类的一些成员:

DrawArc

此方法绘制一个弧。

DrawBezier, DrawBeziers, DrawCurve

这些方法绘制简单和贝塞尔曲线。这些曲线可以是闭合的、三次方的等等。

DrawEllipse

绘制一个椭圆或圆。

DrawImage

绘制图像。

DrawLine

绘制一条线。

DrawPath

绘制路径(使用 GraphicsPath 的线条)

DrawPie

绘制扇形段的轮廓。

DrawPolygon

绘制多边形的轮廓。

DrawRectangle

绘制矩形的轮廓。

DrawString

绘制一个字符串。

FillEllipse

填充由边界矩形定义的椭圆的内部。

FillPath

填充路径的内部。

FillPie

填充扇形段的内部。

FillPolygon

填充由点数组定义的多边形的内部。

FillRectangle

用 Brush 填充矩形的内部

FillRectangles

用 Brush 填充一系列矩形的内部

FillRegion

填充区域的内部。

现在,如果您想使用上面描述的相同方法绘制一个椭圆,您可以重写 OnPaint 方法并编写以下代码:

protected overrides sub OnPaint(ByVal e As 
                              System.Windows.Forms.PaintEventArgs)

Dim g As Graphics = e.Graphics
  Dim pn As Pen = New Pen(Color.Green, 10)
  g.DrawLine(pn, 100, 10, 30, 10)
  g.DrawEllipse(New Pen(Color.Red, 20), 20, 40, 20, 20)
  End Sub

这将绘制一个椭圆。在查看更多示例之前,让我们讨论一些 GDI+ 对象。

常用的图形对象

图形对象是您用于绘制 GDI+ 项目(如图像、线条、矩形和路径)的对象。例如,要用颜色填充矩形,您需要一个颜色对象以及要填充的样式类型(如实心、纹理等)。

您将在整个 GDI+ 生命周期中使用四种常用的 GDI+ 对象来填充 GDI+ 项目。主要对象是:

Brush

用于用图案、颜色或位图填充封闭表面。

画笔

用于绘制线条和多边形,包括矩形、弧形和扇形

字体

用于描述用于渲染文本的字体

Color

用于描述用于渲染特定对象的颜色。在 GDI+ 中,颜色可以进行 Alpha 混合

在 GDI+ 中,这些对象中的每一个都由一个类(也称为类型)表示。

Pen 类

画笔绘制指定宽度和样式的线条。您始终使用 Pen 构造函数来创建画笔。构造函数初始化 Pen 类的一个新实例。您可以使用颜色或画笔对其进行初始化。

使用指定的颜色初始化 Pen 类的一个新实例。

Public Sub New(Color)

使用指定的 Brush 初始化 Pen 类的一个新实例。

Public Sub New(Brush)

使用指定的 Brush 和宽度初始化 Pen 类的一个新实例。

Public Sub New(Brush, Single)

使用

Dim pn as Pen = new Pen( Color.Blue )
 or
Dim pn as Pen = new Pen( Color.Blue, 100 )

指定的颜色和宽度初始化 Pen 类的一个新实例。

Public Sub New(Color, Single)

这是一个例子

它一些最常用的属性是:

对齐

获取或设置使用此 **Pen** 绘制的对象的对齐方式。

Brush

获取或设置确定此 **Pen** 属性的 Brush。

Color

获取或设置此 **Pen** 的颜色。

宽度

获取或设置此 **Pen** 的宽度。

Color 结构

Color 结构表示 ARGB 颜色。以下是其 ARGB 属性:

A

获取此 **Color** 的 alpha 分量值。

B

获取此 **Color** 的蓝色分量值。

G
© . All rights reserved.