• 数字时钟DigClock


    首先建立数字显示类:

    using System;
    using System.Drawing;
    
    namespace CsDev
    {
        class SevenSegmentDispay
        {
            Graphics grph;
            //0,1,2,3,4,5,6,7,8,9
            static byte[,] bySegment = { { 1, 1, 1, 0, 1, 1,1 }, { 0, 0, 1, 0, 0,1, 0 }, 
                                         {1,0,1,1,1,0,1},{1,0,1,1,0,1,1},
                                         {0,1,1,1,0,1,0},{1,1,0,1,0,1,1},
                                         {1,1,0,1,1,1,1},{1,0,1,0,0,1,0},
                                         {1,1,1,1,1,1,1},{1,1,1,1,0,1,1}};
            readonly Point[][] apt = new Point[7][];
    
            public SevenSegmentDispay(Graphics grph)
            {
                this.grph = grph;
                apt[0] = new Point[] { new Point(3, 2), new Point(39, 2), new Point(31, 10), new Point(11, 10) };
                apt[1] = new Point[] { new Point(2, 3), new Point(10, 11), new Point(10, 31), new Point(2, 35) };
                apt[2] = new Point[] { new Point(40, 3), new Point(40, 35), new Point(32, 31), new Point(32, 11) };
                apt[3] = new Point[] { new Point(3, 36), new Point(11, 32), new Point(31, 32), new Point(39, 36),
                                        new Point(31, 40),new Point(11, 40)};
                apt[4] = new Point[] { new Point(2, 37), new Point(10, 41), new Point(10, 61), new Point(2, 69) };
                apt[5] = new Point[] { new Point(40, 37), new Point(40, 69), new Point(32, 61), new Point(32, 41) };
                apt[6] = new Point[] { new Point(11, 62), new Point(31, 62), new Point(39, 70), new Point(3, 70) };
            }
    
            public SizeF MeasureString(string str, Font font)
            {
                SizeF sizef = new SizeF(0, grph.DpiX * font.SizeInPoints / 72);
    
                for (int i = 0; i < str.Length; i++)
                {
                    if (Char.IsDigit(str[i]))
                        sizef.Width += 42 * grph.DpiX * font.SizeInPoints / 72 / 72;
                    else if (str[i] == ':')
                        sizef.Width += 12 * grph.DpiX * font.SizeInPoints / 72 / 72;
                }
                return sizef;
            }
            void Fill(Point[] apt, Font font, Brush brush, float x, float y)
            {
                PointF[] aptf = new PointF[apt.Length];
                for (int i = 0; i < apt.Length; i++)
                {
                    aptf[i].X = x + apt[i].X * grph.DpiX * font.SizeInPoints / 72 / 72;
                    aptf[i].Y = y + apt[i].Y * grph.DpiY * font.SizeInPoints / 72 / 72;
                }
                grph.FillPolygon(brush, aptf);
            }
            float Number(int num, Font font, Brush brush, float x, float y)
            {
                for (int i = 0; i < apt.Length; i++)
                    if (bySegment[num, i] == 1)
                        Fill(apt[i], font, brush, x, y);
                return x + 42 * grph.DpiX * font.SizeInPoints / 72 / 72;
            }
            float Colon(Font font, Brush brush, float x, float y)//画冒号
            {
                Point[][] apt = new Point[2][];
                apt[0] = new Point[] { new Point(2, 21), new Point(6, 17), new Point(10, 21), new Point(6, 25) };
                apt[1] = new Point[] { new Point(2, 51), new Point(6, 47), new Point(10, 51), new Point(6, 55) };
                for (int i = 0; i < apt.Length; i++)
                    Fill(apt[i], font, brush, x, y);
                return x + 12 * grph.DpiX * font.SizeInPoints / 72 / 72;
            }
            public void DrawString(string str, Font font, Brush brush, float x, float y)
            {
                for (int i = 0; i < str.Length; i++)
                {
                    if (Char.IsDigit(str[i]))
                        x = Number(str[i] - '0', font, brush, x, y);
                    else if (str[i] == ':')
                        x = Colon(font, brush, x, y);
                }
            }
        }
    }


    实现类:

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Globalization;
    
    namespace CsDev
    {
        class DigClock:Form
        {
            DateTime dt;
            public static void Main()
            {
                Application.Run(new DigClock());
            }
            public DigClock()
            {
                Text = "数字时钟";
                ResizeRedraw = true;
                MinimumSize = SystemInformation.MinimumWindowSize + new Size(0, 1);
    
                dt = DateTime.Now;
                Timer timer = new Timer();
                timer.Tick+=new EventHandler(timer_Tick);
                timer.Interval = 100;
                timer.Enabled = true;
            }
            void timer_Tick(object obj, EventArgs e)
            {
                DateTime dtNow = DateTime.Now;
                dtNow = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, dtNow.Minute, dtNow.Second);
                if (dt != dtNow)
                {
                    dt = dtNow;
                    Invalidate();
                }
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                SevenSegmentDispay ssd = new SevenSegmentDispay(e.Graphics);
                string strTime = dt.ToString("T",DateTimeFormatInfo.InvariantInfo);
                SizeF sizef = ssd.MeasureString(strTime, Font);
                float fScale = Math.Min(ClientSize.Width/sizef.Width,ClientSize.Height/sizef.Height);
                Font font = new Font(Font.FontFamily, fScale * Font.SizeInPoints);
                sizef = ssd.MeasureString(strTime, font);//注意font是自定义
    
                ssd.DrawString(strTime, font, Brushes.Red, (ClientSize.Width-sizef.Width)/2,(ClientSize.Height-sizef.Height)/2);
                base.OnPaint(e);
            }
        }
    }


    效果图:



  • 相关阅读:
    Linux Socket函数close() 与 shutdown()区别
    Android Performance Patterns S01E03
    Android Performance Patterns S01E02
    Android Performance Patterns S01E01
    Java类初始化顺序
    原子性,可见性,有序性
    UML类图
    Linux 五种IO模型
    Linux学习笔记(一)
    线程的生命周期-java
  • 原文地址:https://www.cnblogs.com/riasky/p/3508620.html
Copyright © 2020-2023  润新知