C# GDI+ 时钟表盘
一、设计如下图界面
按键“打开时钟”按下后会出现表盘,按键“退出”按下后会关闭页面。
二、多线程初始化和函数初始化
public Form1(){InitializeComponent();generateBtn();Control.CheckForIllegalCrossThreadCalls = false;}
对按键 重命名
void generateBtn(){Button bt1 = button1;bt1.Text = "打开时钟";Button bt2 = button2;bt2.Text = "退出";}
三、按键“打开时钟”按下
打开多线程,运行时钟相关程序。
private void button1_Click(object sender, EventArgs e){ThreadStart thStart = new ThreadStart(Start);Thread thread = new Thread(thStart);thread.Priority = ThreadPriority.Highest;thread.IsBackground = true; //关闭窗体继续执行thread.Start();}
四、时钟主函数
给定表盘圆心坐标和半径,初始化一些画笔颜色和画刷大小以及一些变量,通过半径和圆心计算表盘上各点的坐标,读取并记录电脑上的时间戳,计算时针分针秒针的角度,通过之前计算结果绘制表盘。
每隔一秒(检测读取到的时、分、秒发生变化)擦除一遍页面,重新计算坐标点,重新绘制新的表盘。
private void Start(){var graph = this.pictureBox1.CreateGraphics();double[] Sin = new double[60];double[] Cos = new double[60];float[] x = new float[60];float[] y = new float[60];float[] x1 = new float[60];float[] y1 = new float[60];float[] x2 = new float[60];float[] y2 = new float[60];float[] x3 = new float[60];float[] y3 = new float[60];float[] x4 = new float[60];float[] y4 = new float[60];float x5 =0;float y5 =0;float r0 = 0;string tradeTime = DateTime.Now.ToString("hhmmss",System.Globalization.DateTimeFormatInfo.InvariantInfo);var pencoler1 = new Pen(Color.Red);var pencoler2 = new Pen(Color.Yellow);var pencoler3 = new Pen(Color.Black);var pensize = new Pen(Color.Black, 3);var pensize1 = new Pen(Color.Red, 2);var pensize2 = new Pen(Color.Black, 4);int i;int z = 0;int x0 = 500;int y0 = 300;int r = 300;int sec, min, hour;int secn = 0, minn = 0, hourn = 0;int Time;for (i = 0; i < 60; i++){//if (i == 0 || i == 30 || i == 15 || i == 45) { continue; }double d = (((i * 6) - 90) * 3.1415) / 180;Sin[i] = Math.Sin(d);Cos[i] = Math.Cos(d);y[i] = (float)(Sin[i] * r) + y0;x[i] = (float)(Cos[i] * r) + x0;x1[i] = x[i] - (x[i] - x0) / 10;y1[i] = y[i] - (y[i] - y0) / 10;x2[i] = x[i] - (x[i] - x0) / 7 - r / 20;y2[i] = y[i] - (y[i] - y0) / 7 - r / 20;x3[i] = x[i] - (x[i] - x0) / 20;y3[i] = y[i] - (y[i] - y0) / 20;x4[i] = x[i] - (x[i] - x0) / 2;y4[i] = y[i] - (y[i] - y0) / 2;x5 = x0 - r / 40;y5 = y0 - r / 40;r0 = r / 20;}Brush penbrush = new SolidBrush(Color.Black);Font penfont = new Font("华文行楷", r / 20);for (; ; ){tradeTime = DateTime.Now.ToString("hhmmss", System.Globalization.DateTimeFormatInfo.InvariantInfo);Time = int.Parse(tradeTime);sec = Time % 100;min = Time / 100 % 100;hour = Time / 10000;if (hour == 12) { hour = 0; }if (secn != sec || minn != min || hourn != hour){//MessageBox.Show(sec.ToString());graph.Clear(this.BackColor);//graph.DrawEllipse(pencoler2, x0 - r, y0 - r, 2*r, 2*r);for (i = 0; i < 60; i++){if (i % 5 == 0){z = i / 5;if (z == 0) z = 12;graph.DrawLine(pensize, x[i], y[i],x1[i],y1[i]);graph.DrawString(z.ToString(), penfont, penbrush, x2[i], y2[i]);}else{graph.DrawLine(pencoler3, x[i], y[i], x3[i], y3[i]);}}graph.DrawLine(pensize1, x0, y0, x[sec], y[sec]);graph.DrawLine(pensize2, x0, y0, x[min], y[min]);graph.DrawLine(pensize2, x0, y0, x4[hour*5], y4[hour*5]);//graph.DrawPie(pencoler2, x0-r, y0-r, 2*r, 2*r, sec * 6-90, 1);//graph.DrawPie(pencoler3, x0-r , y0-r , r*2, r*2, min * 6-90, 1);//graph.DrawPie(pencoler3, x0-r/2 , y0-r/2 , r, r, hour*30-90, 2);secn = sec;minn = min;hourn = hour;graph.FillEllipse(new SolidBrush(Color.Yellow), x5 , y5 , r0, r0);continue;}}}
五、“退出”按键按下后
得益于多线程的使用,在表盘一直处于死循环监测时间变化的同时,依然能检测到Button的按下。
“退出”按下后,退出页面。
private void button2_Click(object sender, EventArgs e){Application.Exit();}
六、表盘上各点的计算
C# GDI+ 时钟表盘相关推荐
- java实现时钟表盘教程方法
本文实例为大家分享了java实现时钟表盘的具体代码,供大家参考,具体内容如下 设计并实现一个模拟时钟功能的应用程序.程序中应显示时针.分针和秒针,并同时以数字形式显示当前时间. 实现结果: 源代码如下 ...
- LVGL库实现的简单实时时钟表盘示例代码
LVGL库实现的简单实时时钟表盘示例代码: #include "lvgl.h" #include <time.h>static lv_obj_t * screen; s ...
- 【Labplus 3】Scratch时钟表盘角度解析
Scratch实现时钟的案例也不少,这里就具体设计时针,分针,秒针的细节点进行解析下,方便小朋友们理解. 首先看下绿旗执行后的效果,没有放背景表盘,避免干扰: 角色-针会转动,是因为&面向&a ...
- android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...
前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...
- C# WPF时钟表盘 及设置闹钟
不足之处请大佬修改 表盘设计界面 <Window x:Class="动画表.MainWindow"xmlns="http://schemas.microsoft.c ...
- canvas绘制时钟表盘
关于canvas的API操作详情请阅读文档https://www.runoob.com/html/html5-canvas.html 先来看下效果图: 首先,需要绘制两个圆形作为表盘 var draw ...
- Android自定义实现绘制时钟表盘
效果图: 实现步骤: 绘制表盘[刻度,数字] 绘制指针 让指针走起来~ 具体如下: 绘制表盘: 首先需要计算出刻度的起点和终点坐标值,这里我们通过构建两个半径不同的同心圆,大圆半径减小圆半径,就可以得 ...
- Qt实现动态时钟表盘的设计
目录 头文件 源代码 运行结果 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>#include <QPaint ...
- 前端例程20210731:圆形表盘时钟布局实现
文章目录 目的 布局说明 基础准备 数字定位 指针定位 指针运转 完整代码 总结 目的 圆形表盘时钟是界面应用中偶尔会涉及到的东西,圆形表盘时钟实现过程中相对复杂的是其布局,这篇文章将对相关实现做个说 ...
- c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc
C语言图形时钟课程设计实验报告.doc 目录 1.系统功能要求 . 2. 数据结构设计及 说明 . 3.程序结构(画流程图) . 4.各模块的功能 . 5.试验结果(包括输入数据和输出结果) . 6. ...
最新文章
- [征询意见]北京.NET俱乐部11月份活动内容
- 关注这些技术号,你将拥有半个互联网圈
- c++ vector 存放指针_STL-C++ vector部分
- Windows下启动各服务命令
- 深入剖析Redis RDB持久化机制
- POJ-2186 Popular Cows (Tarjan缩点) 文末有测试数据
- ImageView的scaleType理解
- centos系统在Visual Studio Code 中使用超级管理员权限保存文件
- 提示gtk错误,无法打开便器器(sudo gedit filename失败)
- centos安装思源黑体
- 计算机c盘用户名中文改英文,Win10电脑将中文登录用户名更改为英文名的方法
- 别把职场当官斗,聪明人都在自我成长
- 【激光SLAM, ROS】激光畸变的校正
- 【web前端开发】HTML知识点超详细总结
- JS实现动画特效2(缓动函数封装、导航栏筋斗云效果)
- 激活windows系列地址
- 点云中的Chamfer distance
- (转)旅游拍照必读:10个经典人像摄影案例@『国家地理』
- 《第一堂棒球课》:职业棒球
- STM32配置W5500