文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#如何实现图形界面的时钟

2023-07-02 08:47

关注

今天小编给大家分享一下C#如何实现图形界面的时钟的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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

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

C#如何实现图形界面的时钟

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);                                    }                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#如何实现图形界面的时钟”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯