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();
}
}
}
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();
}
}
}