C#实现图形界面的时钟

Winola ·
更新时间:2024-09-20
· 1359 次阅读

本文实例为大家分享了C#实现图形界面的时钟的具体代码,供大家参考,具体内容如下

秒针有跳跃两个格子问题,主要是算法耗时没考虑在TimeTicker的触发事件内,导致程序运行有延迟。

时间运行正确(获取的系统时间)。

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; namespace Cool_Graphics {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         Point center;         private void Form1_Load(object sender, EventArgs e)         {             lastFormSize = this.Size;             initPicBox();             timer1.Interval = welcomeTime / welcomeSplits;             timer1.Enabled = true;         }         private void initPicBox()         {             //清空面板,找中心点             center = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);             pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);             Graphics g = Graphics.FromImage(pictureBox1.Image);             g.FillRectangle(Brushes.White, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));             //按窗口大小,自动设置表盘适宜半径             r = pictureBox1.Width < pictureBox1.Height ? (pictureBox1.Width / 2 - margin) : (pictureBox1.Height / 2 - margin);             //默认相对r比例设置 其他值             circle_width = GetRelativeValue(r, 100);             pFlag1_length = GetRelativeValue(r, 25);             pFlag1_width = GetRelativeValue(r, 80);             pFlag2_length = GetRelativeValue(r, 50);             pFlag2_width = GetRelativeValue(r, 250);             second_length = GetRelativeValue(r, 1.15);             second_tailLen = GetRelativeValue(r, 5);             second_width = GetRelativeValue(r, 250);             minute_length = GetRelativeValue(r, 250.0 / 190.0);//分针长度             minute_width = GetRelativeValue(r, 250.0 / 2.0);//分针宽度             hour_length = GetRelativeValue(r, 250.0 / 160.0);//时针长度             hour_width = GetRelativeValue(r, 250.0 / 3.0);//时针宽度             center_r = GetRelativeValue(r, 250.0 / 4.0);//表盘中心点半径         }         int shanxinNum = 0;         private void timer1_Tick(object sender, EventArgs e)         {             Graphics g = Graphics.FromImage(pictureBox1.Image);             g.FillPie(new SolidBrush(Color.FromArgb(shanxinNum + 90, shanxinNum * 2 + 10, shanxinNum * 3 + 50)), center.X - r, center.Y - r, r * 2, r * 2, shanxinNum * 360 / welcomeSplits, 360 / welcomeSplits);             if (shanxinNum++ > welcomeSplits / 2)             {                 timer2.Interval = 1000;                 timer2.Enabled = true;             }             if (shanxinNum > welcomeSplits - 1)             {                 shanxinNum = 0;                 timer1.Enabled = false;             }             pictureBox1.Refresh();         }         int welcomeTime = 1000;//欢迎界面时间 ms         int welcomeSplits = 60;//欢迎界面的切割个数         int margin = 10;//表盘外边距          int r = 250;//表盘半径         Color bg_color = Color.White;//背景色         Color circle_bg_color = Color.LightBlue;//圆盘背景色         float circle_width = 2;//外表盘圆宽度         Color circle_color = Color.Black;//外表盘圆颜色         float pFlag1_length = 10;//圆盘外部格标志1长度         float pFlag1_width = 3;//圆盘外部格标志1宽度         Color pFlag1_color = Color.Black;//圆盘外部格标志1颜色         float pFlag2_length = 5;//圆盘外部格标志2长度         float pFlag2_width = 1; //圆盘外部格标志2宽度         Color pFlag2_color = Color.Black;//圆盘外部格标志2颜色         float pSLine_length = 20;//下吊坠线长度         float pSLine_width = 1;//下吊坠线长度         Color pSLine_color = Color.Red;//下吊坠线长度         float second_length = 200;//秒针长度         float second_tailLen = 50;//秒针尾巴长度         float second_width = 1;//秒针宽度         Color second_color = Color.Red;//秒针颜色         float minute_length = 190;//分针长度         float minute_width = 2;//分针宽度         Color minute_color = Color.DarkGreen;//分针颜色         float hour_length = 160;//时针长度         float hour_width = 3;//时针宽度         Color hour_color = Color.DarkBlue;//时针颜色         float center_r = 4;//表盘中心点半径         Color center_color = Color.Black;//圆心点颜色         private void timer2_Tick(object sender, EventArgs e)         {             //Console.WriteLine(DateTime.Now.Millisecond);             // timer2.Enabled = false;             Graphics g = Graphics.FromImage(pictureBox1.Image);             //面板清空             g.FillRectangle(new SolidBrush(bg_color), new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));             //画圆盘背景             g.FillEllipse(new SolidBrush(circle_bg_color), center.X - r, center.Y - r, r * 2, r * 2);             //画表盘外框圆             g.DrawEllipse(new Pen(circle_color, circle_width), center.X - r, center.Y - r, r * 2, r * 2);             //话表盘格             double span = Math.PI / 30;//每个格子间隔弧度值             for (float i = 0; i < 60; i++)             {                 PointF p1 = new PointF(center.X + r * (float)Math.Sin(i * span), center.Y - r * (float)Math.Cos(i * span));                 PointF p2;                 PointF ps2;                 if (i % 5 == 0)                 {                     p2 = new PointF(center.X + (r - pFlag1_length) * (float)Math.Sin(i * span), center.Y - (r - pFlag1_length) * (float)Math.Cos(i * span));                     g.DrawLine(new Pen(pFlag1_color, pFlag1_width), p1, p2);                     /* ps2 = new PointF(p1.X,p1.Y+pSLine_length);                      g.DrawLine(new Pen(pSLine_color, pSLine_width), p1, ps2);*/                 }                 else                 {                     p2 = new PointF(center.X + (r - pFlag2_length) * (float)Math.Sin(i * span), center.Y - (r - pFlag2_length) * (float)Math.Cos(i * span));                     g.DrawLine(new Pen(pFlag2_color, pFlag2_width), p1, p2);                 }             }             //获取当前时间             DateTime time = DateTime.Now;             float millisecond = (float)time.Millisecond;             float second = time.Second + millisecond / 1000;             float minute = time.Minute + second / 60;             float hour = time.Hour + minute / 60;             PointF tempPF;             //画时针             tempPF = new PointF(center.X + hour_length * (float)Math.Sin(hour * 5 * span), center.Y - hour_length * (float)Math.Cos(hour * 5 * span));             g.DrawLine(new Pen(hour_color, hour_width), center, tempPF);             //画分针             tempPF = new PointF(center.X + minute_length * (float)Math.Sin(minute * span), center.Y - minute_length * (float)Math.Cos(minute * span));             g.DrawLine(new Pen(minute_color, minute_width), center, tempPF);             //画秒针             if (timer2.Interval == 1000)             {                 second = time.Second;             }             tempPF = new PointF(center.X + second_length * (float)Math.Sin(second * span), center.Y - second_length * (float)Math.Cos(second * span));             PointF tailP = new PointF(center.X - second_tailLen * (float)Math.Sin(second * span), center.Y + second_tailLen * (float)Math.Cos(second * span));             g.DrawLine(new Pen(second_color, second_width), tailP, tempPF);             画秒针附加效果             //for (int i = 1; i < 256; i++)             //{             //    tempPF = new PointF(center.X + second_length * (float)Math.Sin((second - i * 0.02) * span), center.Y - second_length * (float)Math.Cos((second - i * 0.02) * span));             //    tailP = new PointF(center.X - second_tailLen * (float)Math.Sin((second - i * 0.02) * span), center.Y + second_tailLen * (float)Math.Cos((second - i * 0.02) * span));             //    g.DrawLine(new Pen(Color.FromArgb(255,i,i), second_width), tailP, tempPF);             //}             画毫秒针             //tempPF = new PointF(center.X + second_length * (float)Math.Sin(millisecond * span * 60 / 1000), center.Y - second_length * (float)Math.Cos(millisecond * span * 60 / 1000));             //tailP = new PointF(center.X - second_tailLen * (float)Math.Sin(millisecond * span * 60 / 1000), center.Y + second_tailLen * (float)Math.Cos(millisecond * span * 60 / 1000));             //g.DrawLine(new Pen(second_color, second_width), tailP, tempPF);             //画中心点             g.FillEllipse(new SolidBrush(center_color), center.X - center_r, center.Y - center_r, center_r * 2, center_r * 2);             pictureBox1.Refresh();             //timer2.Enabled = true;         }         private float GetRelativeValue(float src, double ratio)         {             return src / (float)ratio > 1 ? src / (float)ratio : 1;         }         Size lastFormSize;         private void Form1_ResizeEnd(object sender, EventArgs e)         {             if (this.Size == lastFormSize)                 return;             timer2.Enabled = false;             shanxinNum = 0;             initPicBox();             timer1.Interval = 17;             timer1.Enabled = true;         }         FormWindowState lastState = FormWindowState.Normal;         private void Form1_SizeChanged(object sender, EventArgs e)         {             if (this.WindowState != lastState)             {                 lastState = this.WindowState;                 timer2.Enabled = false;                 shanxinNum = 0;                 initPicBox();                 timer1.Interval = 17;                 timer1.Enabled = true;             }         }     } }



C# 界面 图形界面

需要 登录 后方可回复, 如果你还没有账号请 注册新账号