C#实现图形界面的时钟

本文实例为大家分享了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;
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现漂亮的数字时钟效果

    本文实例讲述了用C#做了一个漂亮的数字时钟.分享给大家供大家参考. 程序运行后界面如下: 实现技术:主要是通过Graphics类的DrawImage方法来绘制数字时钟中所有的数字,这些数字是从网上找的一些图片文件.时钟使用DateTime中Now属性来获得不同的,时,分,秒,最后通过定时器来实现时钟的运行状态. 主要代码如下: 复制代码 代码如下: //将0~9数字图片保存在Image数组中  private Image[] image = new Bitmap[10];  public For

  • C#绘制时钟的方法

    本文实例为大家分享了使用C#写一个时钟,供大家参考,具体内容如下 时钟是这样的 一共使用四个控件即可: WinFrom窗体应用程序代码: using SpeechLib; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.L

  • c# winform时钟的实现代码

    代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Simpclock {     public partial class Form1 : Form     {   

  • C# GDI+实现时钟表盘

    本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下 一.设计如下图界面 按键“打开时钟”按下后会出现表盘,按键“退出”按下后会关闭页面. 二.多线程初始化和函数初始化 public Form1()         {             InitializeComponent();             generateBtn();             Control.CheckForIllegalCrossThreadCalls = false;  

  • C#实现动态数字时钟和日历

    本文实例为大家分享了C#实现动态数字时钟和日历的具体代码,供大家参考,具体内容如下 实现如下图所示的简易时钟和日历,要求显示公历日期.时间.星期.农历日期. 首先新建一个ChineseCanlendar类用于实现和农历相关的操作: [ChineseCanlendar.cs] /*  * 作者:JeronZhou  * 时间:2021-11-01  * 功能:动态数字时钟和日历  */ using System; using System.Linq; using System.Globalizat

  • C#实现图形界面的时钟

    本文实例为大家分享了C#实现图形界面的时钟的具体代码,供大家参考,具体内容如下 秒针有跳跃两个格子问题,主要是算法耗时没考虑在TimeTicker的触发事件内,导致程序运行有延迟. 时间运行正确(获取的系统时间). using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using

  • C++实现图形界面时钟表盘代码

    本文实例讲述了C++实现图形界面时钟表盘代码,分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: //POINT的数组可以这么用      POINT pt[]={          0, 450,          225,390,          390,225,          450,0,          390,-225,          225,-390,          0,-450,          -225,-390,          -390,-2

  • C语言基于EasyX库实现有图形界面时钟

    本文实例为大家分享了C语言基于EasyX库实现有图形界面时钟的具体代码,供大家参考,具体内容如下 1.目标要求: 1.实现一个显示图像的时钟2.时间与本地时间一致 2.C语言代码: #include<graphics.h> //需要提前安装库函数EasyX,网上官网下载 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #include<ma

  • C语言基于EasyX库实现有图形界面钟表

    本文实例为大家分享了C语言基于EasyX库实现有图形界面钟表的具体代码,供大家参考,具体内容如下 1.目标要求: 实现一个显示图像的时钟 2.C语言代码: #include<graphics.h> //需要提前下载EasyX库哦 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #include<math.h> #define High

  • 第一次编写Java流布局图形界面

    本文实例为大家分享了Java流布局图形界面编写代码,供大家参考,具体内容如下 package jisuanqi; import java.awt.*; public class MyFrame extends Frame{ //继承Frame类 public MyFrame() { super("第一个图形界面"); //设置框架窗口标题 this.setSize(200, 130); //设置组件尺寸(宽,高) this.setLocation(300, 240); //设置组件的显

  • 利用aardio给python编写图形界面

    前阵子在用python写一些小程序,写完后就开始思考怎么给python程序配一个图形界面,毕竟控制台实在太丑陋了. 于是百度了下python的图形界面库,眼花缭乱的一整页,拣了几件有"特色"有"噱头"的下载下来做了个demo,仍旧不是很满意,不是下载安装繁琐,就是界面丑陋或者难写难用,文档不齐全. 后来那天,整理电脑文件发现了6年前下载的aatuo(现已更名aardio),顿时一阵惊喜. 先说说aardio,2011年7月的时候,它还叫aauto,那时的自己还醉心于

  • WEB泡泡堂2.0(图形界面+电脑对玩)(javascript)

    Hxyman Popo Ver 1.0 "+str+""); } this.InitBulb = function(n){ for (var i=0; i●"); } } this.ReDrawBox = function(x, y, str){ document.getElementById("box"+x+"_"+y).innerHTML = str; } this.InitMap = function(){ for (v

  • 利用vnc远程图形界面控制Linux

    Windows下面的远程图形界面的控制大家都已经驾轻就熟了. Linux下面利用vnc来图形界面的控制也是非常简单的.VNC是由两部分组成:一部分是客户端的应用程序(vncviewer):另外一部分是服务器端的应用程序(vncserver). 以redhat linux 8.0下面的安装和使用为例 一 .安装vnc的rpm包 1 安装linux 1.1 图形界面下的安装要是在KDE或者GNOME下,直接点击rpm包,系统会自动开始安装.中间还会提示你设置密码,端口等. 1.2 命令行下的安装.

  • java图形界面AWT编写计算器

    一.前言 1)这个计算器是基于java语言下图形界面AWT编写的.其实我认为写这个计算器,实现什么功能不重要,市场也不缺这个计算器,而是在于对AWT中三大布局的及画板的使用简单控件的操作使用.通过联系熟悉掌握AWT基础为深入学习打下基础.这个计算器功能也十分简单,空有其表.不过有兴趣的话可以继续添加功能完善操作等. 2)使用平台:主要使用Myeclipse2014 3)主要知识点:java 基础; awt+swing 二.功能实现及代码展示 1)主要是layout布局的练习,对画板文本框的使用,

  • PyQt5图形界面播放音乐的实例

    安装Pygame pip install pygame import time import pygame pygame.init() print("播放音乐1") track = pygame.mixer.music.load(r"此处为音频文件的路径") pygame.mixer.music.play() time.sleep(10) pygame.mixer.music.stop() 另一种方法, 两种都亲测可行 pygame.init() sound = p

随机推荐