GDI+ 是 Windows XP 操作系统中提供二维矢量图形、图像处理和版式的部分。GDI+ 在 GDI(较早版本的 Windows 中提供的 Graphics Device Interface)的基础上进行了改进,添加了新功能并优化了现有功能。
利用GDI+可以很方面的画图绘图,并且也能很方便地操作图形数据。下面本人以一个简单的例子来展示如果用C#和GDI+来制作一个时钟。
运行结果如下:
程序代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Drawing.Imaging;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespaceClock
{
publicpartialclassMainForm:Form
{
privatePointFcenter;
privatefloatr;
privatePenhourPen;
privatePenminutePen;
privatePensecondPen;
privateThreadtimeThread;
publicMainForm()
{
InitializeComponent();
ShowInTaskbar=false;//不在任务栏中显示
SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.UserPaint,true);
SetStyle(ControlStyles.AllPaintingInWmPaint,true);
center=newPointF(ClientSize.Width/2.0f,ClientSize.Height/2.0f);
r=Math.Min(ClientSize.Width/2.0f,ClientSize.Height/2.0f);
hourPen=newPen(Color.Black,2.5f);
minutePen=newPen(Color.Black,1.5f);
secondPen=newPen(Color.Black,0.5f);
timeThread=newThread(newThreadStart(DrawTime));
timeThread.Start();
}
protectedoverridevoidOnPaint(PaintEventArgse)
{
Graphicsg=e.Graphics;
g.Clear(BackColor);
//g.SmoothingMode=SmoothingMode.AntiAlias;
g.SmoothingMode=SmoothingMode.HighQuality;
g.DrawArc(secondPen,newRectangleF(center.X-r,center.Y-r,2*r-3,2*r-3),0,360);
GraphicsPathround=newGraphicsPath();
round.AddArc(newRectangleF(center.X-r,center.Y-r,2*r-3,2*r-3),0,360);
Region=newRegion(round);
Penpen=newPen(Color.Blue,3.0f);
for(inti=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);
}
}
floathour,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);
}
privatevoidDrawTime()
{
while(true)
{
Invalidate();
Thread.Sleep(900);//为避免某些延时影响,900ms画一次时钟指针
}
}
protectedvoidDispose(objectsender,EventArgse)
{
Dispose();
base.Dispose(Disposing);
Application.Exit();
}
privatevoidtsmExit_Click(objectsender,EventArgse)
{
Close();
Dispose();
base.Dispose(Disposing);
Application.Exit();
}
}
}
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Drawing.Imaging;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespaceClock
{
publicpartialclassMainForm:Form
{
privatePointFcenter;
privatefloatr;
privatePenhourPen;
privatePenminutePen;
privatePensecondPen;
privateThreadtimeThread;
publicMainForm()
{
InitializeComponent();
ShowInTaskbar=false;//不在任务栏中显示
SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.UserPaint,true);
SetStyle(ControlStyles.AllPaintingInWmPaint,true);
center=newPointF(ClientSize.Width/2.0f,ClientSize.Height/2.0f);
r=Math.Min(ClientSize.Width/2.0f,ClientSize.Height/2.0f);
hourPen=newPen(Color.Black,2.5f);
minutePen=newPen(Color.Black,1.5f);
secondPen=newPen(Color.Black,0.5f);
timeThread=newThread(newThreadStart(DrawTime));
timeThread.Start();
}
protectedoverridevoidOnPaint(PaintEventArgse)
{
Graphicsg=e.Graphics;
g.Clear(BackColor);
//g.SmoothingMode=SmoothingMode.AntiAlias;
g.SmoothingMode=SmoothingMode.HighQuality;
g.DrawArc(secondPen,newRectangleF(center.X-r,center.Y-r,2*r-3,2*r-3),0,360);
GraphicsPathround=newGraphicsPath();
round.AddArc(newRectangleF(center.X-r,center.Y-r,2*r-3,2*r-3),0,360);
Region=newRegion(round);
Penpen=newPen(Color.Blue,3.0f);
for(inti=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);
}
}
floathour,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);
}
privatevoidDrawTime()
{
while(true)
{
Invalidate();
Thread.Sleep(900);//为避免某些延时影响,900ms画一次时钟指针
}
}
protectedvoidDispose(objectsender,EventArgse)
{
Dispose();
base.Dispose(Disposing);
Application.Exit();
}
privatevoidtsmExit_Click(objectsender,EventArgse)
{
Close();
Dispose();
base.Dispose(Disposing);
Application.Exit();
}
}
}