You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
7.0 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace HslCommunication.Controls
{
/// <summary>
/// 一个开关按钮类
/// </summary>
[DefaultEvent("Click")]
public partial class UserSwitch : UserControl
{
/// <summary>
/// 实例化一个开关按钮对象
/// </summary>
public UserSwitch()
{
InitializeComponent();
DoubleBuffered = true;
brush_switch_background = new SolidBrush(color_switch_background);
pen_switch_background = new Pen(color_switch_background, 2f);
brush_switch_foreground = new SolidBrush(color_switch_foreground);
centerFormat = new StringFormat();
centerFormat.Alignment = StringAlignment.Center;
centerFormat.LineAlignment = StringAlignment.Center;
}
private void UserSwitch_Load(object sender, EventArgs e)
{
}
private void UserSwitch_Paint(object sender, PaintEventArgs e)
{
if (!Authorization.nzugaydgwadawdibbas( )) return;
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
Point center = GetCenterPoint();
e.Graphics.TranslateTransform(center.X, center.Y);
int radius = 45 * (center.X * 2 - 30) / 130;
if (radius < 5) return;
Rectangle rectangle_larger = new Rectangle(-radius - 4, -radius - 4, 2 * radius + 8, 2 * radius + 8);
Rectangle rectangle = new Rectangle(-radius, -radius, 2 * radius, 2 * radius);
e.Graphics.DrawEllipse(pen_switch_background, rectangle_larger);
e.Graphics.FillEllipse(brush_switch_background, rectangle);
float angle = -36;
if (SwitchStatus) angle = 36;
e.Graphics.RotateTransform(angle);
int temp = 20 * (center.X * 2 - 30) / 130;
Rectangle rect_switch = new Rectangle(-center.X / 8, -radius - temp, center.X / 4, radius * 2 + temp * 2);
e.Graphics.FillRectangle(brush_switch_foreground, rect_switch);
Rectangle rect_mini = new Rectangle(-center.X / 16, -radius - 10, center.X / 8, center.X * 3 / 8);
e.Graphics.FillEllipse(SwitchStatus ? Brushes.LimeGreen:Brushes.Tomato, rect_mini);
Rectangle rect_text = new Rectangle(-50, -radius - temp - 15, 100, 15);
e.Graphics.DrawString(SwitchStatus? description[1] : description[0], Font, SwitchStatus ? Brushes.LimeGreen : Brushes.Tomato, rect_text, centerFormat);
e.Graphics.ResetTransform();
}
#region Private Member
private Color color_switch_background = Color.DimGray; // 按钮的背景颜色,包括边线颜色
private Brush brush_switch_background = null; // 按钮的背景画刷
private Pen pen_switch_background = null; // 按钮的背景画笔
private bool switch_status = false; // 按钮的开关状态
private Color color_switch_foreground = Color.FromArgb(36, 36, 36); // 按钮开关的前景色
private Brush brush_switch_foreground = null; // 按钮开关的前景色画刷
private StringFormat centerFormat = null; // 居中显示的格式化文本
private string[] description = new string[2] { "Off", "On" }; // 两种开关状态的文本描述
#endregion
#region Event Handle
/// <summary>
/// 开关按钮发生变化的事件
/// </summary>
[Category("操作")]
[Description("点击了按钮开发后触发")]
public event Action<object, bool> OnSwitchChanged;
#endregion
#region Private Method
private Point GetCenterPoint()
{
if (Height > Width)
{
return new Point(Width / 2, Width / 2);
}
else
{
return new Point(Height / 2, Height / 2);
}
}
#endregion
#region Public Member
/// <summary>
/// 获取或设置开关按钮的背景色
/// </summary>
[Browsable(true)]
[Description("获取或设置开关按钮的背景色")]
[Category("外观")]
[DefaultValue(typeof(Color), "DimGray")]
public Color SwitchBackground
{
get
{
return color_switch_background;
}
set
{
color_switch_background = value;
brush_switch_background?.Dispose();
pen_switch_background?.Dispose();
brush_switch_background = new SolidBrush(color_switch_background);
pen_switch_background = new Pen(color_switch_background, 2f);
Invalidate();
}
}
/// <summary>
/// 获取或设置开关按钮的前景色
/// </summary>
[Browsable(true)]
[Description("获取或设置开关按钮的前景色")]
[Category("外观")]
[DefaultValue(typeof(Color), "[36, 36, 36]")]
public Color SwitchForeground
{
get
{
return color_switch_foreground;
}
set
{
color_switch_foreground = value;
brush_switch_foreground = new SolidBrush(color_switch_foreground);
Invalidate();
}
}
/// <summary>
/// 获取或设置开关按钮的开合状态
/// </summary>
[Browsable(true)]
[Description("获取或设置开关按钮的开合状态")]
[Category("外观")]
[DefaultValue(false)]
public bool SwitchStatus
{
get
{
return switch_status;
}
set
{
if(value != switch_status)
{
switch_status = value;
Invalidate();
OnSwitchChanged?.Invoke(this, switch_status);
}
}
}
/// <summary>
/// 获取或设置两种开关状态的文本描述例如new string[]{"Off","On"}
/// </summary>
[Browsable(false)]
public string[] SwitchStatusDescription
{
get { return description; }
set
{
if (value?.Length == 2)
{
description = value;
}
}
}
#endregion
private void UserSwitch_Click(object sender, EventArgs e)
{
SwitchStatus = !SwitchStatus;
}
}
}