|
|
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;
|
|
|
}
|
|
|
}
|
|
|
}
|