1.首先先给大家看一下最终效果图。

2.动态时钟首先我们就需要一个时间线程来对齐进行动态管理。在窗体的加载事件中添加时间线程,时间间隔设置为1秒执行一次,并且将触发事件添加给Elapsed,线程的声明放在事件之外。

       System.Timers.Timer Time = new System.Timers.Timer();private void Form1_Load(object sender, EventArgs e){        Time.Enabled = true;Time.Interval = 1000; //执行间隔时间,单位为毫秒; 这里实际间隔为1秒种             Time.Start();Time.Elapsed += new ElapsedEventHandler(ClockRun);}

3.开始在窗体上画出时钟。

按照顺序,先画出表盘表心,然后在表盘上添加刻度和数字,最后画出时针分针秒针。此处最难的地方在于坐标的确定,尤其是指针为动态,按照表盘的刻度有60个秒针跟分针的位置。此处先写坐标的获取思路。

获取坐标的三角函数

(1)此处的点B就是我们的表心也就是我们所画圆的圆心,BC为指针。用GDI画一个箭头,箭头的起点坐标为圆心坐标(圆心X,圆心Y),终点坐标就等于(圆心X+AB,圆心Y+AC),三角函数部分就不细说了,大家都会。有了思路就开始写代码。

        /// <summary>/// 通过三角函数换算对边和斜边/// </summary>/// <param name="intPut">夹角倍数</param>/// <param name="intPutP"> 单倍夹角角度=Math.PI/intPutP(eg:秒针为6度)</param>/// <param name="BC">斜边的长度</param>/// <returns></returns>private int[] Trigonometric(int intPut, int intPutP, int BC){            double J = 0, AB = 0, AC = 0;//夹角,对边,临边int[] outPut = new int[2] { 0, 0 };J = Math.PI / intPutP * intPut;AB = Math.Sin(J) * BC;AC = Math.Cos(J) * BC;outPut[0] = Convert.ToInt32(AB);outPut[1] = Convert.ToInt32(AC);         return outPut;}

(2)有了坐标就开始画时钟;

按照上面说的顺序将每一个部分都画出来,代码如下;

                Graphics gra = this.picClock.CreateGraphics();gra.Clear(this.BackColor);//清除gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;Pen pen = new Pen(Color.Black);//画笔颜色                                gra.DrawEllipse(pen, InitialX, InitialY, Radius * 2, Radius * 2);//表盘Brush bush = new SolidBrush(Color.Black);//填充的颜色gra.FillEllipse(bush, Radius + InitialX - 4, Radius + InitialY - 4, 8, 8);//表心Pen p = new Pen(Color.Black, 3);int[] intKdS, intKdE, intKdZ;//12个刻度for (int i = 0; i < 12; i++){//画刻度intKdS = Trigonometric(i, 6, Radius);//刻度的终点坐标intKdE = Trigonometric(i, 6, Radius - 8);//刻度的起点坐标intKdZ = Trigonometric(i, 6, Radius - 20);gra.DrawLine(p, Radius + InitialX + intKdE[0], Radius + InitialY - intKdE[1], Radius + InitialX + intKdS[0], Radius + InitialY - intKdS[1]);////写刻度上的数字Label lab = new Label();//初始化一个控件lab.Name = "lab" + i;lab.Size = i > 0 && i < 7 ? new Size(8, 12) : new Size(18, 12);//设置大小lab.Location = new Point(Radius + intKdZ[0] + 8, Radius - intKdZ[1] + 8);//设置坐标lab.Text = i == 0 ? "12" : i.ToString();this.picClock.Controls.Add(lab);}//用一个int数组存放时分秒针的终点坐标labNowTime.Text = "实时时间:" + DateTime.Now.ToString();//数字式实时时间日期intH = DateTime.Now.Hour; //实时时间的小时             intH = intH > 12 ? intH - 12 : intH;// 将24小时制转换成12小时制int[] intSecond = Trigonometric(DateTime.Now.Second, 30, Radius - zhizD), intMinute = Trigonometric(DateTime.Now.Minute, 30, Radius - zhizD), intHour = Trigonometric(intH, 6, Radius - zhizD);//Graphics gra = this.picClock.CreateGraphics();//箭头AdjustableArrowCap lineCap = new AdjustableArrowCap(4, 4, true);//秒针Pen redArrowPenS = new Pen(Color.Black, 1);redArrowPenS.CustomEndCap = lineCap;gra.DrawLine(redArrowPenS, Radius + InitialX, Radius + InitialY, Radius + InitialX + intSecond[0], Radius + InitialY - intSecond[1]);//分针Pen redArrowPenM = new Pen(Color.Black, 2);redArrowPenM.CustomEndCap = lineCap;gra.DrawLine(redArrowPenM, Radius + InitialX, Radius + InitialY, Radius + InitialX + intMinute[0], Radius + InitialY - intMinute[1]);//时针Pen redArrowPenH = new Pen(Color.Black, 3);redArrowPenH.CustomEndCap = lineCap;gra.DrawLine(redArrowPenH, Radius + InitialX, Radius + InitialY, Radius + InitialX + intHour[0], Radius + InitialY - intHour[1]);

4.总结

(1)总的来说都是画图的函数调用,难点在于坐标的确定,只要思路清晰就都不是问题(只针对新手,大神玩家可以随意指出不足的地方,虚心接受)

(2)存在的问题是时钟只有12个位置,只指向整点,只能等后期有时间再优化了。

完整代码已经在下面给出链接,谢谢大家,支持原创。

C# 编写一个动态模拟时钟相关推荐

  1. 用前端代码编写一个动态的罗盘时钟

    用前端代码编写一个动态的罗盘时钟 前言 一.代码如下 1.index 2.js 3.css 页面效果 前言 今天给大家分享一个罗盘时钟的前端代码,喜欢的小伙伴帮忙点赞一下噢! 一.代码如下 1.ind ...

  2. 【Java】动态模拟时钟

    应用名称:java动态模拟时钟 用到的知识:javaGUI,java 绘图 开发环境:win10+eclipse+jdk1.8 功能说明:通过java绘图画出一个虚拟的动态时钟 效果图: 源代码: i ...

  3. java时钟时针绘制代码,Java实现动态模拟时钟

    搜索热词 本文实例为大家分享了java动态模拟时钟的具体代码,供大家参考,具体内容如下 应用名称:java动态模拟时钟 用到的知识:javaGUI,java 绘图 开发环境:win10+eclipse ...

  4. 如何编写一个程序模拟扔硬币的结果

    编写一个程序模拟扔硬币的结果 package test;import java.util.Random;public class CoinTossing {public static void mai ...

  5. C++ 第一章 NO.11 编写一个程序模拟支票输出。程序要求用户输入日期,姓名和支票的数量,然后模拟支票的形式输出以下信息,

    //******************************************************************************************** //*程序 ...

  6. 用C++编写一个程序模拟患者在医院等待就诊的情况

    用C++编写一个程序模拟患者在医院等待就诊的情况 [实验题目内容] [实验环境](使用的软件):VS - 2010 [项目设计源代码] [项目测试运行结果截图] [实验题目内容] 队列的实现与应用.编 ...

  7. php动态模拟时钟,使用canvas制作简易实时动态时钟

    动态时钟 这几天的工作学习对Canvas产生了很高的兴趣,拿回JS红宝书认真又学了一遍Canvas,恰巧书中例子是画一个小钟,但这个例子非常简易而且没有动画效果,由此产生了制作动态时钟的想法. 如果你 ...

  8. Android自定义view实现动态模拟时钟。

    效果: 一,自定义一个view的大致步骤: 1.自定义View,首先定义一个MyView类继承View类. 2. 重写View的两个构造器.View是包含四个构造器的,我们必须重写MyWidgetVi ...

  9. 狗是人类最忠诚的伙伴,当狗遇到不同的人会有不同的反应,下面要求编写一个案例模拟狗遇到不同的人时的反应。

    首先需要有一只狗,不同的人去喂,狗会有不同的反应,具体如下: (1)主人喂狗时,狗会很开心的欢跳. (2)主人的家人喂狗时,狗会很平常的吃东西. (3)陌生人喂狗时,狗会很有警惕,并发出叫声. 创建D ...

最新文章

  1. vs合并项目_线性混合效应模型 VS 方差分析
  2. 3D神经接口系统可以感知和操纵“微型脑“
  3. html点击后按钮本身文字变化,javascript实现点击后变换按钮显示文字的方法
  4. 360极速浏览器无法正确getHours
  5. 在mac OSX中安装启动zookeeper
  6. SpringCloud Gateway 快速入门_01
  7. 经典算法(61~90)
  8. 过程中存根的作用有_[马哲54]人民群众在创造历史过程中的决定作用
  9. matlab dicom图像异常,用Matlab处理Dicom图像
  10. html文件执行php语句
  11. 安卓运行linux命令mux,都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行用法...
  12. 格式工厂视频格式转换器下载
  13. 一维连续傅里叶变换和逆变换公式的一种推导
  14. nods中mysql时间相差8小时
  15. paypal如何支付欧元_涨姿势!Paypal怎么用?
  16. pycharm无法创建虚拟环境Virtualenv(Directory ...\python not found)
  17. 案例|工业物联网解决方案•智慧水务云平台
  18. [JavaWeb开发中]HTTP 协议的基本格式和Fiddler抓包工具
  19. Cisco设备的启动以及交换机的介绍
  20. 听声变位测试软件,刺激战场:听声辩位其实有很大的学问,想了解的朋友请进来...

热门文章

  1. Maya2018快速统一UV大小
  2. 【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程
  3. 深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别
  4. 关于串口编程的(一)
  5. Centos8 中如何使用journalctl分析日志
  6. day03 Docker基本使用
  7. 安装STK-CS61A 2011使用的Scheme解释器
  8. 人脸识别学生考勤系统【1】
  9. 分享:avhttp简介
  10. JAVA毕业生就业信息管理系统计算机毕业设计Mybatis+系统+数据库+调试部署