• winfrom LED时钟


        public sealed class Clock : PictureBox
        {
            public Clock()
            {
                SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                SetStyle(ControlStyles.DoubleBuffer, true);
                SetStyle(ControlStyles.ResizeRedraw, true);
                SetStyle(ControlStyles.Selectable, true);
                SetStyle(ControlStyles.SupportsTransparentBackColor, true);
                SetStyle(ControlStyles.UserPaint, true);
                BackColor = Color.Black;
                Timer = new Timer {Interval = Interval, Enabled = true};
                Timer.Tick += Timer_Tick;
                InitColors();
                InitNumber();
            }
    
            /// <summary>
            /// 
            /// </summary>
            private void Timer_Tick(object sender, EventArgs e)
            {
                var bmp = new Bitmap(Width, Height);
                var g = Graphics.FromImage(bmp);
                g.SmoothingMode = SmoothingMode.AntiAlias;
                if (Type != TimeType.时分秒)
                {
                    var year1 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[0].ToString(CultureInfo.InvariantCulture));
                    var year2 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[1].ToString(CultureInfo.InvariantCulture));
                    var year3 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[2].ToString(CultureInfo.InvariantCulture));
                    var year4 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[3].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, 0, year1);
                    DrawNumber(g, 1, year2);
                    DrawNumber(g, 2, year3);
                    DrawNumber(g, 3, year4);
                    DrawNumber(g, 4, -1);
    
                    var month1 = Convert.ToInt32(DateTime.Now.Month.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
                    var month2 = Convert.ToInt32(DateTime.Now.Month.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, 5, month1);
                    DrawNumber(g, 6, month2);
                    DrawNumber(g, 7, -1);
    
                    var day1 = Convert.ToInt32(DateTime.Now.Day.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
                    var day2 = Convert.ToInt32(DateTime.Now.Day.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, 8, day1);
                    DrawNumber(g, 9, day2);
                }
                if (Type != TimeType.年月日)
                {
                    var hour1 = Convert.ToInt32(DateTime.Now.Hour.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
                    var hour2 = Convert.ToInt32(DateTime.Now.Hour.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, Type == TimeType.时分秒 ? 0 : 10, hour1);
                    DrawNumber(g, Type == TimeType.时分秒 ? 1 : 11, hour2);
    
                    DrawColon(g, 0);
                    var minute1 =
                        Convert.ToInt32(DateTime.Now.Minute.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
                    var minute2 =
                        Convert.ToInt32(DateTime.Now.Minute.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, Type == TimeType.时分秒 ? 2 : 12, minute1);
                    DrawNumber(g, Type == TimeType.时分秒 ? 3 : 13, minute2);
    
                    DrawColon(g, 1);
                    var second1 =
                        Convert.ToInt32(DateTime.Now.Second.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
                    var second2 =
                        Convert.ToInt32(DateTime.Now.Second.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
                    DrawNumber(g, Type == TimeType.时分秒 ? 4 : 14, second1);
                    DrawNumber(g, Type == TimeType.时分秒 ? 5 : 15, second2);
                }
                BackgroundImage = bmp;
            }
    
            /// <summary>
            /// 绘制数字
            /// </summary>
            /// <param name="g">GDI</param>
            /// <param name="index">数字位置</param>
            /// <param name="value">数值</param>
            private void DrawNumber(Graphics g, int index,int value)
            {
                if (_numbers.Length > index && WordColor.ContainsKey(value))
                {
                    foreach (var key in _numbers[index].Keys)
                    {
                        var colors = WordColor[value].Where(s => s.Type == key).ToList();
                        if (colors.Any())
                        {
                            var c = colors[0].Color;
                            using (var brush = new SolidBrush(c))
                            {
                                g.FillPath(brush, _numbers[index][key]);
                            }
                        }
                    }
                }
            }
            /// <summary>
            /// 绘制冒号
            /// </summary>
            /// <param name="g">GDI</param>
            /// <param name="index">绘制第几个</param>
            private void DrawColon(Graphics g, int index)
            {
                if (_colons.Length > index)
                {
                    using (var brush = new SolidBrush(BrightColor))
                    {
                        g.FillRectangles(brush, _colons[index]);
                    }
                }
            }
    
            #region 属性
            private Timer Timer { set; get; }
            private TimeType _type = TimeType.时分秒;
            private int _interval = 1000;
            [Description("时钟显示的时间类型"), DefaultValue(typeof(TimeType)), Browsable(true)]
            public TimeType Type
            {
                set
                {
                    Stop();
                    _type = value;
                    InitNumber();
                    Start();
                    Invalidate();
                }
                get { return _type; }
            }
    
            /// <summary>
            /// 数字路径
            /// </summary>
            private Dictionary<WordType, GraphicsPath>[] _numbers = new Dictionary<WordType, GraphicsPath>[0];
            /// <summary>
            /// 冒号
            /// </summary>
            private readonly RectangleF[][] _colons = new RectangleF[2][];
    
            /// <summary>
            /// 时钟跳动间隔
            /// </summary>
            [Description("时钟的跳动间隔(毫秒)"),DefaultValue(typeof(Int32)),Browsable(true)]
            public int Interval
            {
                set
                {
                    _interval = value;
                    Invalidate();
                }
                get { return _interval; }
            }
    
            private readonly Color[] _colors = {Color.FromArgb(0, 255, 1), Color.FromArgb(0, 60, 0)};
    
            /// <summary>
            /// 亮色
            /// </summary>
            [Description("数字的颜色"), DefaultValue(typeof(Color)), Browsable(true)]
            public Color BrightColor
            {
                set
                {
                    _colors[0] = value;
                    InitColors();
                    Invalidate();
                }
                get { return _colors[0]; }
            }
    
            /// <summary>
            /// 暗色
            /// </summary>
            [Description("数字的背景颜色"), DefaultValue(typeof(Color)), Browsable(true)]
            public Color DarkColor
            {
                set
                {
                    _colors[1] = value;
                    InitColors();
                    Invalidate();
                }
                get { return _colors[1]; }
            }
            /// <summary>
            /// 绘制路径
            /// </summary>
            private Dictionary<WordType,GraphicsPath> Paths { set; get; } 
            /// <summary>
            /// 字体颜色设置
            /// </summary>
            private Dictionary<int, Word[]> WordColor { set; get; }
    
            /// <summary>
            /// 初始化字体颜色
            /// </summary>
            private void InitColors()
            {
                WordColor = new Dictionary<int, Word[]>
                {
                    {
                        -1, new[]
                        {
                            new Word(WordType.TopHor, DarkColor),
                            new Word(WordType.LeftTopVer, DarkColor),
                            new Word(WordType.RightTopVer, DarkColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, DarkColor),
                            new Word(WordType.BottomHor, DarkColor)
                        }
                    },
                    {
                        0, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, DarkColor),
                            new Word(WordType.LeftBottomVer, BrightColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        1, new[]
                        {
                            new Word(WordType.TopHor, DarkColor),
                            new Word(WordType.LeftTopVer, DarkColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, DarkColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, DarkColor)
                        }
                    },
                    {
                        2, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, DarkColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, BrightColor),
                            new Word(WordType.RightBottomVer, DarkColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        3, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, DarkColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        4, new[]
                        {
                            new Word(WordType.TopHor, DarkColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, DarkColor)
                        }
                    },
                    {
                        5, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, DarkColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        6, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, DarkColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, BrightColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        7, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, DarkColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, DarkColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, DarkColor)
                        }
                    },
                    {
                        8, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, BrightColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, BrightColor)
                        }
                    },
                    {
                        9, new[]
                        {
                            new Word(WordType.TopHor, BrightColor),
                            new Word(WordType.LeftTopVer, BrightColor),
                            new Word(WordType.RightTopVer, BrightColor),
                            new Word(WordType.MiddleHor, BrightColor),
                            new Word(WordType.LeftBottomVer, DarkColor),
                            new Word(WordType.RightBottomVer, BrightColor),
                            new Word(WordType.BottomHor, DarkColor)
                        }
                    }
                };
            }
    
            #endregion
    
            /// <summary>
            /// 启动时钟
            /// </summary>
            public void Start()
            {
                if (Timer != null)
                {
                    Timer.Start();
                }
            }
    
            /// <summary>
            /// 关闭时钟
            /// </summary>
            public void Stop()
            {
                if (Timer != null)
                {
                    Timer.Stop();
                }
            }
    
            /// <summary>
            /// 初始化数字路径
            /// </summary>
            private void InitNumber()
            {
                var length = 16;
                switch (Type)
                {
                    case TimeType.年月日:
                        _numbers = new Dictionary<WordType, GraphicsPath>[10];
                        length = 10;
                        break;
                    case TimeType.年月日时分秒:
                        _numbers = new Dictionary<WordType, GraphicsPath>[16];
                        length = 18;
                        break;
                    case TimeType.时分秒:
                        length = 8;
                        _numbers = new Dictionary<WordType, GraphicsPath>[6];
                        break;
                }
                var w = Height/2;
                int x = 5;
                int index = 0;
                for (int i = 0; i < length; i++)
                {
                    switch (Type)
                    {
                        case TimeType.时分秒:
                            if (i == 2 || i == 5)
                                _colons[i == 2 ? 0 : 1] = Colon(x, 5, Height - 10);
                            else
                            {
                                _numbers[index] = Number(x, 5, Height - 10);
                                index ++;
                            }
                            x = (i == 2 || i == 5) ? x + 15 : w + x + 5;
                            break;
                        case TimeType.年月日:
                            _numbers[i] = Number(x, 5, Height - 10);
                            x = w + x + 5;
                            break;
                        case TimeType.年月日时分秒:
                            if (i != 12 && i != 15)
                            {
                                _numbers[index] = Number(x, 5, Height - 10);
                                index++;
                            }
                            x = (i == 9) ? w*2 + x : (i == 12 || i == 15) ? x : w + x + 5;
                            if (i == 12 || i == 15)
                            {
                                _colons[i == 12 ? 0 : 1] = Colon(x, 5, Height - 10);
                                x = x + w/2;
                            }
                            break;
                        default:
                            x = w + x + 5;
                            _numbers[i] = Number(x, 5, Height - 10);
                            break;
                    }
                }
            }
    
            #region 绘制图像方法
    
            /// <summary>
            /// 绘制冒号 
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <param name="height"></param>
            /// <returns></returns>
            private RectangleF[] Colon(float x, float y, float height)
            {
                var h = height/20;
                var r1 = new RectangleF(x, y + h*6, h*2, h*2);
                var r2 = new RectangleF(x, y + h*12, h*2, h*2);
                return new[] {r1, r2};
            }
    
            /// <summary>
            /// 绘制数字
            /// </summary>
            /// <param name="x">左上角X轴坐标</param>
            /// <param name="y">左上角Y轴坐标</param>
            /// <param name="height">数字高度</param>
            private Dictionary<WordType, GraphicsPath> Number(float x, float y, float height)
            {
                Paths = new Dictionary<WordType, GraphicsPath>();
                var h = height/20;
                var w = h;
                var width = w*10;
                var x1 = x;
                var x2 = x + w;
                var x3 = x + w*2;
                var x4 = x + width - w*2;
                var x5 = x + width-w;
                var x6 = x + width;
                var y1 = y;
                var y2 = y + h;
                var y3 = y + h*2;
                var y4 = y + (height/2 - h);
                var y5 = y + (height/2);
                var y6 = y + (height/2 + h);
                var y7 = y + height - h*2;
                var y8 = y + height - h;
                var y9 = y + height;
                const float offset = 0.5f;
                var hor1 = new GraphicsPath();
                hor1.AddLines(new[]
                {
                    new PointF(x2 + offset, y2 - offset),
                    new PointF(x3 + offset, y1 + offset),
                    new PointF(x4 - offset, y1 + offset),
                    new PointF(x5 - offset, y2 - offset),
                    new PointF(x4 - offset, y3 - offset),
                    new PointF(x3 + offset, y3 - offset),
                    new PointF(x2 + offset, y2 - offset)
                });
                hor1.CloseFigure();
                Paths.Add(WordType.TopHor, hor1);
                var hor2 = new GraphicsPath();
                hor2.AddLines(new[]
                {
                    new PointF(x2 +offset, y5),
                    new PointF(x3 + offset, y4 + offset),
                    new PointF(x4 - offset, y4 + offset),
                    new PointF(x5 - offset, y5),
                    new PointF(x4 - offset, y6 - offset),
                    new PointF(x3 + offset, y6 - offset),
                    new PointF(x2 + offset, y5)
                });
                hor2.CloseFigure();
                Paths.Add(WordType.MiddleHor, hor2);
                var hor3 = new GraphicsPath();
                hor3.AddLines(new[]
                {
                    new PointF(x2 + offset, y8),
                    new PointF(x3 + offset, y7),
                    new PointF(x4 - offset, y7),
                    new PointF(x5 - offset, y8),
                    new PointF(x4 - offset, y9),
                    new PointF(x3 + offset, y9),
                    new PointF(x2 + offset, y8)
                });
                hor3.CloseFigure();
                Paths.Add(WordType.BottomHor, hor3);
                var ver1 = new GraphicsPath();
                ver1.AddLines(new[]
                {
                    new PointF(x1, y3 + offset),
                    new PointF(x2, y2 + offset),
                    new PointF(x3, y3 + offset),
                    new PointF(x3, y4 - offset),
                    new PointF(x2, y5 - offset),
                    new PointF(x1, y4 - offset)
                });
                ver1.CloseFigure();
                Paths.Add(WordType.LeftTopVer, ver1);
                var ver2 = new GraphicsPath();
                ver2.AddLines(new[]
                {
                    new PointF(x4, y3 + offset),
                    new PointF(x5, y2 + offset),
                    new PointF(x6, y3 + offset),
                    new PointF(x6, y4 - offset),
                    new PointF(x5, y5 - offset),
                    new PointF(x4, y4 - offset)
                });
                ver2.CloseFigure();
                Paths.Add(WordType.RightTopVer, ver2);
                var ver3 = new GraphicsPath();
                ver3.AddLines(new[]
                {
                    new PointF(x1, y6 + offset),
                    new PointF(x2, y5 + offset),
                    new PointF(x3, y6 + offset),
                    new PointF(x3, y7 - offset),
                    new PointF(x2, y8 - offset),
                    new PointF(x1, y7 - offset)
                });
                ver3.CloseFigure();
                Paths.Add(WordType.LeftBottomVer, ver3);
                var ver4 = new GraphicsPath();
                ver4.AddLines(new[]
                {
                    new PointF(x4, y6 + offset),
                    new PointF(x5, y5 + offset),
                    new PointF(x6, y6 + offset),
                    new PointF(x6, y7 - offset),
                    new PointF(x5, y8 - offset),
                    new PointF(x4, y7 - offset)
                });
                ver4.CloseFigure();
                Paths.Add(WordType.RightBottomVer, ver4);
                return Paths;
            }
    
            #endregion
    
            protected override void OnResize(EventArgs e)
            {
                InitNumber();
                base.OnResize(e);
            }
    
            /// <summary>
            /// 数字线条结构
            /// </summary>
            public struct Word
            {
                public Word(WordType type, Color color)
                    : this()
                {
                    Type = type;
                    Color = color;
                }
                /// <summary>
                /// 线条类型
                /// </summary>
                public WordType Type { set; get; }
                /// <summary>
                /// 线条颜色
                /// </summary>
                public Color Color { set; get; }
            }
            #region 隐藏的属性
            [Description("背景图像"),DefaultValue(null),Browsable(false)]
            public new Image BackgroundImage {get { return base.BackgroundImage; } set { base.BackgroundImage = value; } }
            [Description("背景图像布局"), DefaultValue(typeof(ImageLayout)), Browsable(false)]
            public new ImageLayout BackgroundImageLayout { get { return base.BackgroundImageLayout; } set { base.BackgroundImageLayout = value; } }
            [Description("显示的图像"), DefaultValue(null), Browsable(false)]
            public new Image Image{get { return base.Image; } set { base.Image = value; }}
            [Description("加载错误时显示的图像"), DefaultValue(null), Browsable(false)]
            public new Image ErrorImage{get { return base.ErrorImage; } set { base.ErrorImage = value; }}
            [Description("加初始化时显示的图像"), DefaultValue(null), Browsable(false)]
            public new Image InitialImage{set { base.InitialImage = value; } get { return base.InitialImage; }}
            [Description("只是如何显示图像"), DefaultValue(typeof(PictureBoxSizeMode)), Browsable(false)]
            public new PictureBoxSizeMode SizeMode {set { base.SizeMode = value; } get { return base.SizeMode; } }
            #endregion
        }
    
        /// <summary>
        /// 数字线条枚举
        /// </summary>
        public enum WordType
        {
            TopHor = 0,
            LeftTopVer = 1,
            RightTopVer = 2,
            MiddleHor = 3,
            LeftBottomVer = 4,
            RightBottomVer = 5,
            BottomHor = 6
        }
    
        public enum TimeType
        {
            年月日,
            时分秒,
            年月日时分秒
        }
  • 相关阅读:
    20200807日报
    20200806日报
    《大道至简》读书感悟
    20200805日报
    20200804日报
    20200803日报
    20200802日报
    vue中mounted内如何调完异步方法再渲染
    小程序画布识别iPhone11
    np.meshgrid() 生成网格坐标函数
  • 原文地址:https://www.cnblogs.com/rogation/p/3804479.html
Copyright © 2020-2023  润新知