GDI+ 是 Windows XP 操作系统中提供二维矢量图形、图像处理和版式的部分。GDI+ 在 GDI(较早版本的 Windows 中提供的 Graphics Device Interface)的基础上进行了改进,添加了新功能并优化了现有功能。
利用GDI+可以很方面的画图绘图,并且也能很方便地操作图形数据。下面本人以一个简单的例子来展示如果用C#和GDI+来制作一个时钟。
运行结果如下:

程序代码如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Drawing.Drawing2D;
using
System.Drawing.Imaging;
using
System.Text;
using
System.Threading;
using
System.Windows.Forms;
namespace
Clock
{
public
partial
class
MainForm : Form
{
private
PointF center;
private
float
r;
private
Pen hourPen;
private
Pen minutePen;
private
Pen secondPen;
private
Thread timeThread;
public
MainForm()
{
InitializeComponent();
ShowInTaskbar
=
false
;
//
不在任务栏中显示
SetStyle(ControlStyles.DoubleBuffer,
true
);
SetStyle(ControlStyles.UserPaint,
true
);
SetStyle(ControlStyles.AllPaintingInWmPaint,
true
);
center
=
new
PointF(ClientSize.Width
/
2.0f
, ClientSize.Height
/
2.0f
);
r
=
Math.Min(ClientSize.Width
/
2.0f
, ClientSize.Height
/
2.0f
);
hourPen
=
new
Pen(Color.Black,
2.5f
);
minutePen
=
new
Pen(Color.Black,
1.5f
);
secondPen
=
new
Pen(Color.Black,
0.5f
);
timeThread
=
new
Thread(
new
ThreadStart(DrawTime));
timeThread.Start();
}
protected
override
void
OnPaint(PaintEventArgs e)
{
Graphics g
=
e.Graphics;
g.Clear(BackColor);
//
g.SmoothingMode = SmoothingMode.AntiAlias;
g.SmoothingMode
=
SmoothingMode.HighQuality;
g.DrawArc(secondPen,
new
RectangleF(center.X
-
r, center.Y
-
r,
2
*
r
-
3
,
2
*
r
-
3
),
0
,
360
);
GraphicsPath round
=
new
GraphicsPath();
round.AddArc(
new
RectangleF(center.X
-
r, center.Y
-
r,
2
*
r
-
3
,
2
*
r
-
3
),
0
,
360
);
Region
=
new
Region(round);
Pen pen
=
new
Pen(Color.Blue,
3.0f
);
for
(
int
i
=
0
; i
<
59
; i
++
)
{
g.ResetTransform();
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(i
*
6
);
if
((i
==
0
)
||
(i
%
5
==
4
))
{
g.DrawLine(hourPen, r
-
12
,
0
, r
-
5
,
0
);
}
else
{
g.DrawLine(secondPen, r
-
6
,
0
, r
-
5
,
0
);
}
}
float
hour,minute,second;
hour
=
DateTime.Now.Hour;
minute
=
DateTime.Now.Minute;
second
=
DateTime.Now.Second;
hour
=
hour
+
minute
/
60f
+
second
/
3600f;
minute
=
minute
+
second
/
60f;
//
画时针
g.ResetTransform();
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(hour
*
30
+
270
-
6
);
g.DrawLine(hourPen,
0
,
0
, r
*
0.5f
, 0f);
//
画分针
g.ResetTransform();
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(minute
*
6
+
270
-
6
);
g.DrawLine(minutePen,
0
,
0
, r
*
0.6f
, 0f);
//
画秒针
g.ResetTransform();
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(second
*
6
+
270
-
6
);
g.DrawLine(secondPen,
0
,
0
, r
*
0.7f
, 0f);
base
.OnPaint(e);
}
private
void
DrawTime()
{
while
(
true
)
{
Invalidate();
Thread.Sleep(
900
);
//
为避免某些延时影响,900ms画一次时钟指针
}
}
protected
void
Dispose(
object
sender,EventArgs e)
{
Dispose();
base
.Dispose(Disposing);
Application.Exit();
}
private
void
tsmExit_Click(
object
sender, EventArgs e)
{
Close();
Dispose();
base
.Dispose(Disposing);
Application.Exit();
}
}
}
程序代码比较简单,而且也做了注释,估计大家都看得懂,我就不罗唆了。以后有时间再做难度稍大一点的例子。