GDI绘图之指针时钟
来源:互联网 发布:寒冷队长 知乎 编辑:程序博客网 时间:2024/05/22 12:35
利用类的封装将MyClock封装到一个类中,以后想要绘制时钟时直接调用这个类就行了。
MyClock代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace Clock
{
public class MyClock
{
public DateTime datetime;
public Point Center;
public Form form;
public double Radius;
public void Draw(Graphics g)
{
DrawDial(g);
DrawSecond(g);
DrawMinute(g);
DrawHour(g);
}
void DrawDial(Graphics g)
{
Center = new Point((int)(form.Width / 2), (int)(form.Height / 2));
Radius = (form.Height - 100) / 2;
Pen pen = new Pen(Color.Black, 2f);
g.DrawEllipse(pen, new Rectangle((int)(Center.X - Radius), (int)(Center.Y - Radius), (int)(2 * Radius), (int)(2 * Radius)));
g.DrawEllipse(pen, new Rectangle((int)(Center.X - Radius - 4), (int)(Center.Y - Radius - 4), (int)(2 * Radius + 8), (int)(2 * Radius + 8)));
pen = new Pen(Color.Black, 2);
Point pt1, pt2;
Font font = new Font("Times New Roman", 10, FontStyle.Regular);
for (int i = 0; i < 60; i++)
{
if (i % 5 == 0)
{
pt1 = new Point((int)(Center.X + Radius * Math.Cos(Math.PI / 30 * i)), (int)(Center.Y + Radius * Math.Sin(Math.PI / 30 * i)));
pt2 = new Point((int)(Center.X + (Radius - 20) * Math.Cos(Math.PI / 30 * i)), (int)(Center.Y + (Radius - 20) * Math.Sin(Math.PI / 30 * i)));
g.DrawLine(pen, pt1, pt2);
}
}
for (int i = 0; i < 300; i++)
{
if (i % 5 == 0)
{
pt1 = new Point((int)(Center.X + Radius * Math.Cos(Math.PI / 150 * i)), (int)(Center.Y + Radius * Math.Sin(Math.PI / 150 * i)));
pt2 = new Point((int)(Center.X + (Radius - 10) * Math.Cos(Math.PI / 150 * i)), (int)(Center.Y + (Radius - 10) * Math.Sin(Math.PI / 150 * i)));
g.DrawLine(pen, pt1, pt2);
}
}
for (int i = 1; i <= 12; i++)
{
g.DrawString(i.ToString(), font, new SolidBrush(Color.Black), new PointF((float)(Center.X-10 + (Radius - 30) * Math.Cos(Math.PI / 6 * i-0.5*Math.PI)),
(float)(Center.Y -5+ (Radius - 30) * Math.Sin(Math.PI / 6 * i - 0.5 * Math.PI))));
}
g.FillEllipse(new SolidBrush(Color.AliceBlue), Center.X-2, Center.Y-2,10, 10);
}
void DrawSecond(Graphics g)
{
Pen pen;
Point pt1, pt2,pt3;
int second = datetime.Second;
pen = new Pen(Color.Red);
pen.EndCap = LineCap.ArrowAnchor;
pt1 = new Point((int)(Center.X ), (int)(Center.Y ));
pt2 = new Point((int)(Center.X + (Radius - 20) * Math.Sin(Math.PI / 30 * second)), (int)(Center.Y - (Radius - 20) * Math.Cos(Math.PI / 30 * second)));
pt3 = new Point((int)(Center.X + (30) * Math.Sin(Math.PI / 30 * second - Math.PI)), (int)(Center.Y - (30) * Math.Cos(Math.PI / 30 * second - Math.PI)));
g.DrawLine(pen, pt3, pt2);
//g.DrawLine(pen, pt1, pt3);
}
void DrawMinute(Graphics g)
{
Pen pen;
Point pt1, pt2;
int minute = datetime.Minute;
pen = new Pen(Color.Blue, 3f);
pen.EndCap = LineCap.ArrowAnchor;
pt1 = new Point((int)(Center.X + (20) * Math.Sin(Math.PI / 30 * minute - Math.PI)), (int)(Center.Y - (20) * Math.Cos(Math.PI / 30 * minute - Math.PI))); ;
pt2 = new Point((int)(Center.X + (Radius - 30) * Math.Sin(Math.PI / 30 * minute)), (int)(Center.Y - (Radius - 30) * Math.Cos(Math.PI / 30 * minute)));
g.DrawLine(pen, pt1, pt2);
}
void DrawHour(Graphics g)
{
Pen pen;
Point pt1, pt2;
int second = datetime.Second;
int minute = datetime.Minute;
int hour = datetime.Hour;
pen = new Pen(Color.Black, 5f);
//pen.DashCap = DashCap.Flat;
//pen.DashStyle = DashStyle.Solid;
pen.EndCap = LineCap.ArrowAnchor;
pt1 = new Point((int)(Center.X + (10) * Math.Sin((hour + (double)(minute) / 60) * Math.PI / 6 - Math.PI)), (int)(Center.Y - (10) * Math.Cos((hour + (double)(minute) / 60) * Math.PI / 6 - Math.PI)));
pt2 = new Point((int)(Center.X + (Radius - 60) * Math.Sin((hour + (double)(minute)/60 ) * Math.PI / 6)), (int)(Center.Y - (Radius - 60) * Math.Cos((hour + (double)(minute)/60 ) * Math.PI / 6)));
g.DrawLine(pen, pt1, pt2);
}
}
}
调用过程主程序中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace Clock
{
public partial class FrmClock : Form
{
DateTime datetime = DateTime.Now;
public FrmClock()
{
InitializeComponent();
timer1.Enabled = true;
}
private void OnPaint(object sender, PaintEventArgs e)
{
Graphics g ;
g = e.Graphics;
Rectangle rect = e.ClipRectangle;
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);
g = myBuffer.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.Half;
g.Clear(this.BackColor);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
MyClock clock = new MyClock();
clock.datetime = datetime;
clock.form = this;
clock.Draw(g);
myBuffer.Render(e.Graphics);
g.Dispose();
myBuffer.Dispose();//释放资源
}
private void OnTick(object sender, EventArgs e)
{
datetime = DateTime.Now;
Invalidate();
}
private void FrmClock_Resize(object sender, EventArgs e)
{
Invalidate();
}
本程序在VS2010 C#编译器中运行成功
- GDI绘图之指针时钟
- GDI绘图之画图
- 初学GDI绘图之心得
- GDI 绘图之 BitBlt 用法
- GDI绘图之画刷
- GDI绘图之缩放成像
- GDI绘图入门实例——数字时钟
- GDI基础介绍之几何绘图
- C++/MFC-GDI绘图之CBrush画刷
- C++/MFC-GDI绘图之CBitmap位图
- GDI绘图
- gdi 绘图
- GDI绘图
- VB之旅-指针时钟
- 采用GDI绘图和消息机制编写的小时钟(SDK)
- windows程序设计之绘图基础之GDI原理
- windows程序设计之绘图基础之GDI函数调用
- windows程序设计之绘图基础之GDI映射模式
- 1/3-3/5+5/7-7/9...+19/21的运算
- 请求分页式系统地址转换
- OCP 042全真试题讲解-视频分享
- c++模版类学习
- Java IO--打印流PrintStream
- GDI绘图之指针时钟
- Php与Android socket通信
- 如何更改eclipse SDK的workspace的位置
- httpd的loadbalance在linux上的设置
- 猴子吃桃--------两个猴子吃桃问题解决的详细描述
- Looper类和Handler类原理 !
- 李开复对台湾提出七项建议
- 开源分布式文件系统的对比
- js验证大全