yangyin
2025-02-28 baa80d650adebcce70f1113cc1020c6039c159a0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
 
namespace DPumpHydr.WinFrmUI.WenSkin.Controls
{
    public partial class WenCircleProgress : WenControl
    {
        public WenCircleProgress():base()
        {
        }
        #region 私有属性
        private int value = 0;
        #endregion
 
        #region 公有属性
        [Category("Wen")]
        [Description("圆点大小")]
        [DefaultValue(40)]
        [RefreshProperties(RefreshProperties.Repaint)]
        public int PSize { get; set; } = 40;
 
        [Category("Wen")]
        [Description("当前进度值")]
        [DefaultValue(0)]
        [RefreshProperties(RefreshProperties.Repaint)]
        public int Value
        {
            get => this.value;
            set
            {
                this.value = value > 100 ? 100 : value;
                this.Invalidate();
            }
        }
        #endregion
 
 
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            Width = Height;
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            CircleRe(e);
        }
 
        //绘制圆 分别分布点
        private void CircleRe(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            ControlHelper.SetGDIHigh(g);
 
            //改变绘制的圆点,便于计算  和数学方向一致
 
            g.TranslateTransform(0f, this.Height);
            g.ScaleTransform(1f, -1f);
 
 
            Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
 
            //时针球 大小
 
            int pr = PSize;
 
            //Brush b = Brushes.Gray;
 
            int r = (rec.Width - pr) / 2;
 
            int rc = rec.Width / 2;
 
            //计算 0 位置
 
            Rectangle val0 = new Rectangle(rec.Width / 2 - pr / 2, rec.Height - pr, pr, pr);
            Rectangle val25 = new Rectangle(rec.Width - pr, rec.Height / 2 - pr / 2, pr, pr);
            Rectangle val50 = new Rectangle(rec.Width / 2 - pr / 2, 0, pr, pr);
            Rectangle val75 = new Rectangle(0, rec.Height / 2 - pr / 2, pr, pr);
 
            //计算45度位置的值
 
            float l = (float)Math.Sqrt(r * r / 2);
 
            RectangleF val12_5 = new RectangleF(rc + l - pr / 2, rc + l - pr / 2, pr, pr);
            RectangleF val37_5 = new RectangleF(rc + l - pr / 2, rc - l - pr / 2, pr, pr);
            RectangleF val62_5 = new RectangleF(rc - l - pr / 2, rc - l - pr / 2, pr, pr);
            RectangleF val87_5 = new RectangleF(rc - l - pr / 2, rc + l - pr / 2, pr, pr);
 
            g.FillEllipse(GetBrush(0), val0);
            g.FillEllipse(GetBrush(25), val25);
            g.FillEllipse(GetBrush(50), val50);
            g.FillEllipse(GetBrush(75), val75);
            g.FillEllipse(GetBrush(12.5), val12_5);
            g.FillEllipse(GetBrush(37.5), val37_5);
            g.FillEllipse(GetBrush(62.5), val62_5);
            g.FillEllipse(GetBrush(87.5), val87_5);
        }
 
        private Brush GetBrush(double value)
        {
            if (value < Value)
                return Brushes.Gray;
            else
                return Brushes.LightGray;
        }
    }
}