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