C#實現(xiàn)圖形界面的時鐘
本文實例為大家分享了C#實現(xiàn)圖形界面的時鐘的具體代碼,供大家參考,具體內(nèi)容如下
秒針有跳躍兩個格子問題,主要是算法耗時沒考慮在TimeTicker的觸發(fā)事件內(nèi),導(dǎo)致程序運行有延遲。
時間運行正確(獲取的系統(tǒng)時間)。
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)); ? ? ? ? ? ? ? //按窗口大小,自動設(shè)置表盤適宜半徑 ? ? ? ? ? ? r = pictureBox1.Width < pictureBox1.Height ? (pictureBox1.Width / 2 - margin) : (pictureBox1.Height / 2 - margin); ? ? ? ? ? ? //默認相對r比例設(shè)置 其他值 ? ? ? ? ? ? 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;//歡迎界面的切割個數(shù) ? ? ? ? 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; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)創(chuàng)建標簽PDF文件的示例代碼
標簽PDF文件包含描述文檔結(jié)構(gòu)和各種文檔元素順序的元數(shù)據(jù),是一種包含后端提供的可訪問標記,管理閱讀順序和文檔內(nèi)容表示的邏輯結(jié)構(gòu)的PDF文件。本文將用C#實現(xiàn)創(chuàng)建標簽PDF文件,需要的可以參考一下2022-08-08C#實現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說明
這篇文章主要介紹了C#實現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說明的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12C# 4.0 大數(shù)的運算--BigInteger的應(yīng)用詳解
本篇文章是對C# 4.0 大數(shù)的運算 BigInteger的應(yīng)用進行了詳細的分析介紹,需要的朋友參考下2013-05-05c#使用nsoup解析html亂碼解決方法分享 nsoup教程
NSoup是JSoup的Net移植版本。使用方法基本一致。如果項目涉及HTML的處理,強烈推薦NSoup。但是遺憾的是NSoup默認的編碼是UTF-8,處理中文有亂碼,下面給出二種解決方法2014-01-01使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))
本文主要介紹了Java中使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改的方法與步驟。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01C#獲取變更過的DataTable記錄的實現(xiàn)方法
這篇文章主要介紹了C#獲取變更過的DataTable記錄的實現(xiàn)方法,對初學者很有學習借鑒價值,需要的朋友可以參考下2014-08-08