diff --git a/SunnyUI/Controls/UITurnSwitch.cs b/SunnyUI/Controls/UITurnSwitch.cs index 3cc9f360..d213403a 100644 --- a/SunnyUI/Controls/UITurnSwitch.cs +++ b/SunnyUI/Controls/UITurnSwitch.cs @@ -17,12 +17,14 @@ * 创建日期: 2023-07-05 * * 2023-07-05: V3.3.9 增加文件说明 + * 2023-07-06: V3.3.9 调整配色,增加自定义角度 ******************************************************************************/ using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; +using System.Windows.Forms; namespace Sunny.UI { @@ -41,18 +43,10 @@ namespace Sunny.UI public UITurnSwitch() { SetStyleFlags(); - Height = 150; - Width = 150; + Height = 160; + Width = 160; ShowText = false; ShowRect = false; - - inActiveColor = Color.Gray; - fillColor = Color.White; - - rectColor = UIStyles.Blue.SwitchActiveColor; - fillColor = UIStyles.Blue.SwitchFillColor; - inActiveColor = UIStyles.Blue.SwitchInActiveColor; - rectDisableColor = UIStyles.Blue.SwitchRectDisableColor; } [DefaultValue(false)] @@ -121,9 +115,9 @@ namespace Sunny.UI } } - private Color inActiveColor; + private Color inActiveColor = Color.Red; - [DefaultValue(typeof(Color), "Gray")] + [DefaultValue(typeof(Color), "Red")] [Description("关闭颜色"), Category("SunnyUI")] public Color InActiveColor { @@ -135,26 +129,84 @@ namespace Sunny.UI } } - /// - /// 填充颜色,当值为背景色或透明色或空值则不填充 - /// - [Description("填充颜色"), Category("SunnyUI")] - [DefaultValue(typeof(Color), "White")] - public Color ButtonColor - { - get => fillColor; - set => SetFillColor(value); - } - + private Color activeColor = Color.Lime; /// /// 边框颜色 /// [Description("打开颜色"), Category("SunnyUI")] - [DefaultValue(typeof(Color), "80, 160, 255")] + [DefaultValue(typeof(Color), "Lime")] public Color ActiveColor { - get => rectColor; - set => SetRectColor(value); + get => activeColor; + set + { + activeColor = value; + Invalidate(); + } + } + + private int inActiveAngle = 315; + + [DefaultValue(315)] + [Description("开关关闭角度"), Category("SunnyUI")] + public int InActiveAngle + { + get => inActiveAngle; + set + { + inActiveAngle = value; + Invalidate(); + } + } + + private int activeAngle = 45; + /// + /// 边框颜色 + /// + [Description("开关打开角度"), Category("SunnyUI")] + [DefaultValue(45)] + public int ActiveAngle + { + get => activeAngle; + set + { + activeAngle = value; + Invalidate(); + } + } + + private Color backColor = Color.Silver; + + /// + /// 填充颜色 + /// + [Description("填充颜色"), Category("SunnyUI")] + [DefaultValue(typeof(Color), "Silver")] + public Color FillColor + { + get => backColor; + set + { + backColor = value; + Invalidate(); + } + } + + private Color handleColor = Color.DarkGray; + + /// + /// 按钮把手颜色 + /// + [Description("按钮把手颜色"), Category("SunnyUI")] + [DefaultValue(typeof(Color), "DarkGray")] + public Color HandleColor + { + get => handleColor; + set + { + handleColor = value; + Invalidate(); + } } /// @@ -196,35 +248,10 @@ namespace Sunny.UI } } - /// - /// 设置主题样式 - /// - /// 主题样式 - public override void SetStyleColor(UIBaseStyle uiColor) - { - base.SetStyleColor(uiColor); - - rectColor = uiColor.SwitchActiveColor; - fillColor = uiColor.SwitchFillColor; - inActiveColor = uiColor.SwitchInActiveColor; - rectDisableColor = uiColor.SwitchRectDisableColor; - } - - [Description("不可用颜色"), Category("SunnyUI")] - [DefaultValue(typeof(Color), "173, 178, 181")] - public Color DisabledColor - { - get => rectDisableColor; - set => SetRectDisableColor(value); - } - - protected override void OnEnabledChanged(EventArgs e) - { - base.OnEnabledChanged(e); - Invalidate(); - } - private int backSize = 100; + + [Description("开关尺寸"), Category("SunnyUI")] + [DefaultValue(100)] public int BackSize { get => backSize; @@ -236,6 +263,9 @@ namespace Sunny.UI } private int backInnerSize = 80; + + [Description("开关内圈尺寸"), Category("SunnyUI")] + [DefaultValue(80)] public int BackInnerSize { get => backInnerSize; @@ -260,38 +290,57 @@ namespace Sunny.UI g.FillEllipse(rectColor, new Rectangle(center.X - BackSize / 2, center.Y - BackSize / 2, BackSize, BackSize)); int size = backSize - 10; g.FillEllipse(Color.White, new Rectangle(center.X - size / 2, center.Y - size / 2, size, size)); - g.FillEllipse(rectColor, new Rectangle(center.X - backInnerSize / 2, center.Y - backInnerSize / 2, backInnerSize, backInnerSize)); + g.FillEllipse(FillColor, new Rectangle(center.X - backInnerSize / 2, center.Y - backInnerSize / 2, backInnerSize, backInnerSize)); + int size2 = 6; + using Pen pn = rectColor.Pen(2); + PointF pt; if (Active) { - int size1 = 10; - int size2 = 6; - PointF pt1 = center.CalcAzRangePoint(size1, 45); - PointF pt2 = center.CalcAzRangePoint(size1, 225); - PointF pt3 = pt1.CalcAzRangePoint(BackSize / 2 + size2, 315); - PointF pt4 = pt2.CalcAzRangePoint(BackSize / 2 + size2, 315); - PointF pt5 = pt1.CalcAzRangePoint(BackSize / 2 + size2, 135); - PointF pt6 = pt2.CalcAzRangePoint(BackSize / 2 + size2, 135); - g.FillPolygon(Color.Silver, new PointF[] { pt3, pt4, pt6, pt5 }); - - pt1 = center.CalcAzRangePoint(BackSize / 2 - size2, 315); - g.FillEllipse(Color.Lime, pt1.X - size2, pt1.Y - size2, size2 * 2, size2 * 2); + PointF[] points = GetHandles(ActiveAngle); + g.FillPolygon(HandleColor, points); + g.DrawPolygon(pn, points); + pt = center.CalcAzRangePoint(BackSize / 2 - size2, ActiveAngle); } else { - int size1 = 10; - int size2 = 6; - PointF pt1 = center.CalcAzRangePoint(size1, 135); - PointF pt2 = center.CalcAzRangePoint(size1, 315); - PointF pt3 = pt1.CalcAzRangePoint(BackSize / 2 + size2, 45); - PointF pt4 = pt2.CalcAzRangePoint(BackSize / 2 + size2, 45); - PointF pt5 = pt1.CalcAzRangePoint(BackSize / 2 + size2, 225); - PointF pt6 = pt2.CalcAzRangePoint(BackSize / 2 + size2, 225); - g.FillPolygon(Color.Silver, new PointF[] { pt3, pt4, pt6, pt5 }); - - pt1 = center.CalcAzRangePoint(BackSize / 2 - size2, 45); - g.FillEllipse(Color.Red, pt1.X - size2, pt1.Y - size2, size2 * 2, size2 * 2); + PointF[] points = GetHandles(InActiveAngle); + g.FillPolygon(HandleColor, points); + g.DrawPolygon(pn, points); + pt = center.CalcAzRangePoint(BackSize / 2 - size2, InActiveAngle); } + + g.FillEllipse(color, pt.X - size2, pt.Y - size2, size2 * 2, size2 * 2); + Size sz = TextRenderer.MeasureText(ActiveText, Font); + pt = center.CalcAzRangePoint(BackSize / 2 + size2 + 4 + sz.Width / 2, ActiveAngle); + g.DrawString(ActiveText, Font, ActiveColor, new Rectangle((int)(pt.X - sz.Width / 2), (int)(pt.Y - sz.Height / 2), sz.Width, sz.Height), ContentAlignment.MiddleCenter); + + sz = TextRenderer.MeasureText(InActiveText, Font); + pt = center.CalcAzRangePoint(BackSize / 2 + size2 + 4 + sz.Width / 2, InActiveAngle); + g.DrawString(InActiveText, Font, InActiveColor, new Rectangle((int)(pt.X - sz.Width / 2), (int)(pt.Y - sz.Height / 2), sz.Width, sz.Height), ContentAlignment.MiddleCenter); + + } + + private PointF[] GetHandles(int angle) + { + int size1 = 10; + int size2 = 4; + Point center = new Point(Width / 2, Height / 2); + PointF pt1 = center.CalcAzRangePoint(size1, angle - 90); + PointF pt2 = center.CalcAzRangePoint(size1, angle + 90); + PointF pt3 = pt1.CalcAzRangePoint(BackSize / 2 + size2, angle); + PointF pt4 = pt2.CalcAzRangePoint(BackSize / 2 + size2, angle); + PointF pt5 = pt1.CalcAzRangePoint(BackSize / 2 + size2, angle + 180); + PointF pt6 = pt2.CalcAzRangePoint(BackSize / 2 + size2, angle + 180); + + PointF pt11 = center.CalcAzRangePoint(size1 - 2, angle - 90); + PointF pt12 = center.CalcAzRangePoint(size1 - 2, angle + 90); + PointF pt13 = pt11.CalcAzRangePoint(BackSize / 2 + size2 + 2, angle); + PointF pt14 = pt12.CalcAzRangePoint(BackSize / 2 + size2 + 2, angle); + PointF pt15 = pt11.CalcAzRangePoint(BackSize / 2 + size2 + 2, angle + 180); + PointF pt16 = pt12.CalcAzRangePoint(BackSize / 2 + size2 + 2, angle + 180); + + return new PointF[] { pt3, pt13, pt14, pt4, pt6, pt16, pt15, pt5 }; } } }