(四十六)c#Winform自定义控件-水波进度条
2021-02-07 04:16
标签:最大 ram targe 编辑 art net tle raw isp 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492 麻烦博客下方点个【推荐】,谢谢 https://www.cnblogs.com/bfyx/p/11364884.html 这个用到GDI+画的,请先了解一下GDI+ 还有用到了基类控件UCControlBase来控制圆角和背景色,如果还不了解请移步查看 (一)c#Winform自定义控件-基类控件 另外用到了水波控件UCWave,如果不了解请移步查看 (四十四)c#Winform自定义控件-水波 添加一个用户控件UCProcessWave,继承UCControlBase 一些属性 构造函数一些设置 重绘 波形控件重绘时处理 不知道你们有没有注意这句话 因为设置原价导致了区域毛边,所有画个没有毛边的边框覆盖之 完整代码 如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧 (四十六)c#Winform自定义控件-水波进度条 标签:最大 ram targe 编辑 art net tle raw isp 原文地址:https://www.cnblogs.com/bfyx/p/11399183.html前提
NuGet
Install-Package HZH_Controls
目录
用处及效果
准备工作
开始
1 private bool m_isRectangle = false;
2 [Description("是否矩形"), Category("自定义")]
3 public bool IsRectangle
4 {
5 get { return m_isRectangle; }
6 set
7 {
8 m_isRectangle = value;
9 if (value)
10 {
11 base.ConerRadius = 10;
12 }
13 else
14 {
15 base.ConerRadius = Math.Min(this.Width, this.Height);
16 }
17 }
18 }
19 #region 不再使用的父类属性 English:Parent class attributes that are no longer used
20 [Browsable(false)]
21 public new int ConerRadius
22 {
23 get;
24 set;
25 }
26 [Browsable(false)]
27 public new bool IsRadius
28 {
29 get;
30 set;
31 }
32
33 [Browsable(false)]
34 public new Color FillColor
35 {
36 get;
37 set;
38 }
39 #endregion
40
41
42 [Description("值变更事件"), Category("自定义")]
43 public event EventHandler ValueChanged;
44 int m_value = 0;
45 [Description("当前属性"), Category("自定义")]
46 public int Value
47 {
48 set
49 {
50 if (value > m_maxValue)
51 m_value = m_maxValue;
52 else if (value 0)
53 m_value = 0;
54 else
55 m_value = value;
56 if (ValueChanged != null)
57 ValueChanged(this, null);
58 ucWave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + ucWave1.WaveHeight;
59 Refresh();
60 }
61 get
62 {
63 return m_value;
64 }
65 }
66
67 private int m_maxValue = 100;
68
69 [Description("最大值"), Category("自定义")]
70 public int MaxValue
71 {
72 get { return m_maxValue; }
73 set
74 {
75 if (value m_value)
76 m_maxValue = m_value;
77 else
78 m_maxValue = value;
79 Refresh();
80 }
81 }
82
83 public override Font Font
84 {
85 get
86 {
87 return base.Font;
88 }
89 set
90 {
91 base.Font = value;
92 }
93 }
94
95 public override Color ForeColor
96 {
97 get
98 {
99 return base.ForeColor;
100 }
101 set
102 {
103 base.ForeColor = value;
104 }
105 }
106
107 [Description("值颜色"), Category("自定义")]
108 public Color ValueColor
109 {
110 get { return this.ucWave1.WaveColor; }
111 set
112 {
113 this.ucWave1.WaveColor = value;
114 }
115 }
116
117 [Description("边框宽度"), Category("自定义")]
118 public override int RectWidth
119 {
120 get
121 {
122 return base.RectWidth;
123 }
124 set
125 {
126 if (value 4)
127 base.RectWidth = 4;
128 else
129 base.RectWidth = value;
130 }
131 }
1 public UCProcessWave()
2 {
3 InitializeComponent();
4 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
5 this.SetStyle(ControlStyles.DoubleBuffer, true);
6 this.SetStyle(ControlStyles.ResizeRedraw, true);
7 this.SetStyle(ControlStyles.Selectable, true);
8 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
9 this.SetStyle(ControlStyles.UserPaint, true);
10 base.IsRadius = true;
11 base.IsShowRect = false;
12 RectWidth = 4;
13 RectColor = Color.White;
14 ucWave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + ucWave1.WaveHeight;
15 this.SizeChanged += UCProcessWave_SizeChanged;
16 this.ucWave1.OnPainted += ucWave1_Painted;
17 base.ConerRadius = Math.Min(this.Width, this.Height);
18 }
1 protected override void OnPaint(PaintEventArgs e)
2 {
3 base.OnPaint(e);
4 e.Graphics.SetGDIHigh();
5 if (!m_isRectangle)
6 {
7 //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡
8 SolidBrush solidBrush = new SolidBrush(Color.White);
9 e.Graphics.DrawEllipse(new Pen(solidBrush, 2), new Rectangle(-1, -1, this.Width + 2, this.Height + 2));
10 }
11 string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%");
12 System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);
13 e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.Height - sizeF.Height) / 2 + 1));
14 }
1 void ucWave1_Painted(object sender, PaintEventArgs e)
2 {
3 e.Graphics.SetGDIHigh();
4 if (IsShowRect)
5 {
6 if (m_isRectangle)
7 {
8 Color rectColor = RectColor;
9 Pen pen = new Pen(rectColor, (float)RectWidth);
10 Rectangle clientRectangle = new Rectangle(0, this.ucWave1.Height - this.Height, this.Width, this.Height);
11 GraphicsPath graphicsPath = new GraphicsPath();
12 graphicsPath.AddArc(clientRectangle.X, clientRectangle.Y, 10, 10, 180f, 90f);
13 graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Y, 10, 10, 270f, 90f);
14 graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Bottom - 10 - 1, 10, 10, 0f, 90f);
15 graphicsPath.AddArc(clientRectangle.X, clientRectangle.Bottom - 10 - 1, 10, 10, 90f, 90f);
16 graphicsPath.CloseFigure();
17 e.Graphics.DrawPath(pen, graphicsPath);
18 }
19 else
20 {
21 SolidBrush solidBrush = new SolidBrush(RectColor);
22 e.Graphics.DrawEllipse(new Pen(solidBrush, RectWidth), new Rectangle(0, this.ucWave1.Height - this.Height, this.Width, this.Height));
23 }
24 }
25
26 if (!m_isRectangle)
27 {
28 //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡
29 SolidBrush solidBrush1 = new SolidBrush(Color.White);
30 e.Graphics.DrawEllipse(new Pen(solidBrush1, 2), new Rectangle(-1, this.ucWave1.Height - this.Height - 1, this.Width + 2, this.Height + 2));
31 }
32 string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%");
33 System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);
34 e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.ucWave1.Height - this.Height) + (this.Height - sizeF.Height) / 2));
35 }
//这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.Data;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Drawing.Drawing2D;
10
11 namespace HZH_Controls.Controls
12 {
13 public partial class UCProcessWave : UCControlBase
14 {
15 private bool m_isRectangle = false;
16 [Description("是否矩形"), Category("自定义")]
17 public bool IsRectangle
18 {
19 get { return m_isRectangle; }
20 set
21 {
22 m_isRectangle = value;
23 if (value)
24 {
25 base.ConerRadius = 10;
26 }
27 else
28 {
29 base.ConerRadius = Math.Min(this.Width, this.Height);
30 }
31 }
32 }
33 #region 不再使用的父类属性 English:Parent class attributes that are no longer used
34 [Browsable(false)]
35 public new int ConerRadius
36 {
37 get;
38 set;
39 }
40 [Browsable(false)]
41 public new bool IsRadius
42 {
43 get;
44 set;
45 }
46
47 [Browsable(false)]
48 public new Color FillColor
49 {
50 get;
51 set;
52 }
53 #endregion
54
55
56 [Description("值变更事件"), Category("自定义")]
57 public event EventHandler ValueChanged;
58 int m_value = 0;
59 [Description("当前属性"), Category("自定义")]
60 public int Value
61 {
62 set
63 {
64 if (value > m_maxValue)
65 m_value = m_maxValue;
66 else if (value 0)
67 m_value = 0;
68 else
69 m_value = value;
70 if (ValueChanged != null)
71 ValueChanged(this, null);
72 ucWave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + ucWave1.WaveHeight;
73 Refresh();
74 }
75 get
76 {
77 return m_value;
78 }
79 }
80
81 private int m_maxValue = 100;
82
83 [Description("最大值"), Category("自定义")]
84 public int MaxValue
85 {
86 get { return m_maxValue; }
87 set
88 {
89 if (value m_value)
90 m_maxValue = m_value;
91 else
92 m_maxValue = value;
93 Refresh();
94 }
95 }
96
97 public override Font Font
98 {
99 get
100 {
101 return base.Font;
102 }
103 set
104 {
105 base.Font = value;
106 }
107 }
108
109 public override Color ForeColor
110 {
111 get
112 {
113 return base.ForeColor;
114 }
115 set
116 {
117 base.ForeColor = value;
118 }
119 }
120
121 [Description("值颜色"), Category("自定义")]
122 public Color ValueColor
123 {
124 get { return this.ucWave1.WaveColor; }
125 set
126 {
127 this.ucWave1.WaveColor = value;
128 }
129 }
130
131 [Description("边框宽度"), Category("自定义")]
132 public override int RectWidth
133 {
134 get
135 {
136 return base.RectWidth;
137 }
138 set
139 {
140 if (value 4)
141 base.RectWidth = 4;
142 else
143 base.RectWidth = value;
144 }
145 }
146
147 public UCProcessWave()
148 {
149 InitializeComponent();
150 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
151 this.SetStyle(ControlStyles.DoubleBuffer, true);
152 this.SetStyle(ControlStyles.ResizeRedraw, true);
153 this.SetStyle(ControlStyles.Selectable, true);
154 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
155 this.SetStyle(ControlStyles.UserPaint, true);
156 base.IsRadius = true;
157 base.IsShowRect = false;
158 RectWidth = 4;
159 RectColor = Color.White;
160 ucWave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + ucWave1.WaveHeight;
161 this.SizeChanged += UCProcessWave_SizeChanged;
162 this.ucWave1.OnPainted += ucWave1_Painted;
163 base.ConerRadius = Math.Min(this.Width, this.Height);
164 }
165
166 void ucWave1_Painted(object sender, PaintEventArgs e)
167 {
168 e.Graphics.SetGDIHigh();
169 if (IsShowRect)
170 {
171 if (m_isRectangle)
172 {
173 Color rectColor = RectColor;
174 Pen pen = new Pen(rectColor, (float)RectWidth);
175 Rectangle clientRectangle = new Rectangle(0, this.ucWave1.Height - this.Height, this.Width, this.Height);
176 GraphicsPath graphicsPath = new GraphicsPath();
177 graphicsPath.AddArc(clientRectangle.X, clientRectangle.Y, 10, 10, 180f, 90f);
178 graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Y, 10, 10, 270f, 90f);
179 graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Bottom - 10 - 1, 10, 10, 0f, 90f);
180 graphicsPath.AddArc(clientRectangle.X, clientRectangle.Bottom - 10 - 1, 10, 10, 90f, 90f);
181 graphicsPath.CloseFigure();
182 e.Graphics.DrawPath(pen, graphicsPath);
183 }
184 else
185 {
186 SolidBrush solidBrush = new SolidBrush(RectColor);
187 e.Graphics.DrawEllipse(new Pen(solidBrush, RectWidth), new Rectangle(0, this.ucWave1.Height - this.Height, this.Width, this.Height));
188 }
189 }
190
191 if (!m_isRectangle)
192 {
193 //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡
194 SolidBrush solidBrush1 = new SolidBrush(Color.White);
195 e.Graphics.DrawEllipse(new Pen(solidBrush1, 2), new Rectangle(-1, this.ucWave1.Height - this.Height - 1, this.Width + 2, this.Height + 2));
196 }
197 string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%");
198 System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);
199 e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.ucWave1.Height - this.Height) + (this.Height - sizeF.Height) / 2));
200 }
201
202 void UCProcessWave_SizeChanged(object sender, EventArgs e)
203 {
204 if (!m_isRectangle)
205 {
206 base.ConerRadius = Math.Min(this.Width, this.Height);
207 if (this.Width != this.Height)
208 {
209 this.Size = new Size(Math.Min(this.Width, this.Height), Math.Min(this.Width, this.Height));
210 }
211 }
212 }
213
214 protected override void OnPaint(PaintEventArgs e)
215 {
216 base.OnPaint(e);
217 e.Graphics.SetGDIHigh();
218 if (!m_isRectangle)
219 {
220 //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡
221 SolidBrush solidBrush = new SolidBrush(Color.White);
222 e.Graphics.DrawEllipse(new Pen(solidBrush, 2), new Rectangle(-1, -1, this.Width + 2, this.Height + 2));
223 }
224 string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%");
225 System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);
226 e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.Height - sizeF.Height) / 2 + 1));
227 }
228 }
229 }
1 namespace HZH_Controls.Controls
2 {
3 partial class UCProcessWave
4 {
5 ///
最后的话
文章标题:(四十六)c#Winform自定义控件-水波进度条
文章链接:http://soscw.com/index.php/essay/52021.html