目录
预览
1,使用Graphics绘制Toggle。
效果:
测试代码:
private void toggle3_Click(object sender, EventArgs e)
{
toggle3.Checked = !toggle3.Checked;
}
private void toggle2_Click(object sender, EventArgs e)
{
toggle2.Checked = !toggle2.Checked;
}
private void toggle1_Click(object sender, EventArgs e)
{
toggle1.Checked = !toggle1.Checked;
}
Toggle控件代码:
[DefaultEvent("Click")]//指定默认事件
public partial class Toggle : UserControl
{
public Toggle()
{
InitializeComponent();
设置控件样式
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
string falseText = "关闭";
[Browsable(true), Category("自定义属性"), Description("false时文本")]
public string FalseText
{
get
{
return falseText;
}
set
{
falseText = value;
this.Invalidate();
}
}
string trueText = "打开";
[Browsable(true), Category("自定义属性"), Description("true时文本")]
public string TrueText
{
get
{
return trueText;
}
set
{
trueText = value;
this.Invalidate();
}
}
bool _checked = false;
[Browsable(true), Category("自定义属性"), Description("是否确认,Ture表示ON,False表示OFF")]
public bool Checked
{
get
{
return _checked;
}
set
{
_checked = value;
this.Invalidate();
}
}
bool isShowWord = false;
[Browsable(true), Category("自定义属性"), Description("是否显示文字,如果否则显示形状")]
public bool IsShowWord
{
get
{
return isShowWord;
}
set
{
isShowWord = value;
this.Invalidate();
}
}
Color falseColor = Color.LightGray;
[Browsable(true), Category("自定义属性"), Description("False状态时填充色")]
public Color FalseColor
{
get
{
return falseColor;
}
set
{
falseColor = value;
this.Invalidate();
}
}
Color trueColor = Color.CadetBlue;
[Browsable(true), Category("自定义属性"), Description("True状态时填充色")]
public Color TrueColor
{
get
{
return trueColor;
}
set
{
trueColor = value;
this.Invalidate();
}
}
[Browsable(true), Category("自定义属性"), Description("若为非文字模式时,圆点的半径")]
public int EmbellishRadius
{
get
{
return (int)(EmbellishRadiusFactor * Height);
}
}
float _embellishRadiusFactor = 0.15f;
[Browsable(true), Category("自定义属性"), Description("若为非文字模式时,圆点的比例因子")]
public float EmbellishRadiusFactor
{
set
{
if (value >= 1 || value <= 0)
{
_embellishRadiusFactor = 0.3f;
}
else
{
_embellishRadiusFactor = value;
}
this.Invalidate();
}
get
{
return _embellishRadiusFactor;
}
}
bool _embellishPointAuto = true;
[Browsable(true), Category("自定义属性"), Description("修饰文字或者图形的起点是否自动获取")]
public bool EmbellishPointAuto
{
get
{
return _embellishPointAuto;
}
set
{
_embellishPointAuto = value;
this.Invalidate();
}
}
PointF _embellishPoint;
[Browsable(true), Category("自定义属性"), Description("绘制修饰文字或者图形所需的起点")]
public PointF EmbellishPoint
{
get
{
return _embellishPoint;
}
set
{
_embellishPoint = value;
if (!EmbellishPointAuto)
{
this.Invalidate();
}
}
}
Color _embellishColor = Color.White;
[Browsable(true), Category("自定义属性"), Description("绘制修饰文字或者图形所需的颜色")]
public Color EmbellishColor
{
get
{
return _embellishColor;
}
set
{
_embellishColor = value;
this.Invalidate();
}
}
ToggleType _toggleType = ToggleType.Rectangle;
[Browsable(true), Category("自定义属性"), Description("Toggle的样式")]
public ToggleType ToggleStyle
{
get
{
return _toggleType;
}
set
{
_toggleType = value;
this.Invalidate();
}
}
Padding _borderRadius = new Padding(3);
[Browsable(true), Category("自定义属性"), Description("Rectangle风格时采用的倒角半径")]
public Padding BorderRadius
{
get
{
return _borderRadius;
}
set
{
_borderRadius = value;
if (ToggleStyle == ToggleType.Rectangle)
{
this.Invalidate();
}
}
}
int _innerGap = 3;
[Browsable(true), Category("自定义属性"), Description("内部间隙")]
public int InnerGap
{
get
{
return _innerGap;
}
set
{
_innerGap = value;
this.Invalidate();
}
}
Color _slidingColor = Color.White;
[Browsable(true), Category("自定义属性"), Description("滑动块颜色")]
public Color SlidingColor
{
get
{
return _slidingColor;
}
set
{
_slidingColor = value;
this.Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
GraphicsPath path = new GraphicsPath();
Padding drawingRadius;
if (ToggleStyle == ToggleType.Ellipse)
{
drawingRadius = new Padding(Height / 2);
}
else
{
drawingRadius = BorderRadius;
}
//绘制矩形
//左上角
path.AddArc(0, 0, drawingRadius.Left * 2, drawingRadius.Left * 2, 180, 90);
//右上角
path.AddArc(Width - drawingRadius.Top * 2, 0, drawingRadius.Top * 2, drawingRadius.Top * 2, 270, 90);
//右下角
path.AddArc(Width - drawingRadius.Right * 2, Height - drawingRadius.Right * 2, drawingRadius.Right * 2, drawingRadius.Right * 2, 0, 90);
//左下角
path.AddArc(0, Height - 2 * drawingRadius.Bottom, 2 * drawingRadius.Bottom, 2 * drawingRadius.Bottom, 90, 90);
//滑动块起点
Point slidingPoint;
if (Checked)
{
g.FillPath(new SolidBrush(TrueColor), path);
slidingPoint = new Point(Width - Height + InnerGap, InnerGap);
//如果是文字模式
if (IsShowWord && EmbellishPointAuto)
{
SizeF trueTextSize = g.MeasureString(TrueText, this.Font);
EmbellishPoint = new PointF(((Width - trueTextSize.Width - Height)) / 2, ((Height - trueTextSize.Height)) / 2);
}
//如果是非文字模式
if (!IsShowWord && EmbellishPointAuto)
{
EmbellishPoint = new PointF(Height / 2 - EmbellishRadius, Height / 2 - EmbellishRadius);
}
}
else
{
g.FillPath(new SolidBrush(FalseColor), path);
slidingPoint = new Point(InnerGap, InnerGap);
//如果是文字模式
if (IsShowWord && EmbellishPointAuto)
{
SizeF falseTextSize = g.MeasureString(FalseText, this.Font);
EmbellishPoint = new PointF(Height + (Width - Height - falseTextSize.Width) / 2, ((Height - falseTextSize.Height)) / 2);
}
//如果是非文字模式
if (!IsShowWord && EmbellishPointAuto)
{
EmbellishPoint = new Point(Width - (Height / 2 + EmbellishRadius / 2), Height / 2 - EmbellishRadius);
}
}
int slidingWidth = Height - 2 * InnerGap;
GraphicsPath path2 = new GraphicsPath(FillMode.Alternate);
int slidingHeight = slidingWidth;
float scale = slidingWidth * 1.0f / Width;
if (ToggleStyle == ToggleType.Rectangle)
{
//左上角
path2.AddArc(slidingPoint.X, slidingPoint.Y, drawingRadius.Left * 2, drawingRadius.Left * 2, 180, 90);
//右上角
path2.AddArc(slidingPoint.X + slidingWidth - drawingRadius.Top * 2, slidingPoint.Y, drawingRadius.Top * 2, drawingRadius.Top * 2, 270, 90);
//右下角
path2.AddArc(slidingPoint.X + slidingWidth - drawingRadius.Right * 2, slidingPoint.Y + slidingHeight - drawingRadius.Right * 2, drawingRadius.Right * 2, drawingRadius.Right * 2, 0, 90);
//左下角
path2.AddArc(slidingPoint.X, slidingPoint.Y + slidingHeight - 2 * drawingRadius.Bottom, 2 * drawingRadius.Bottom, 2 * drawingRadius.Bottom, 90, 90);
}
else
{
path2.AddEllipse(slidingPoint.X, slidingPoint.Y, Height - 2 * InnerGap, Height - 2 * InnerGap);
}
g.FillPath(new SolidBrush(SlidingColor), path2);
if (IsShowWord)
{
if (Checked)
{
g.DrawString(TrueText, this.Font, new SolidBrush(this.EmbellishColor), EmbellishPoint);
}
else
{
g.DrawString(FalseText, this.Font, new SolidBrush(this.EmbellishColor), EmbellishPoint);
}
}
else
{
g.DrawEllipse(new Pen(EmbellishColor, 2), new RectangleF(EmbellishPoint, new SizeF(EmbellishRadius * 2, EmbellishRadius * 2)));
}
}
}
public enum ToggleType
{
/// <summary>
/// 矩形形状
/// </summary>
Rectangle,
/// <summary>
/// 椭圆形状
/// </summary>
Ellipse
}
2,使用Graphics绘制Switch。
效果:
测试代码:
private void switchControl1_Click(object sender, EventArgs e)
{
switchControl1.SwitchStatus = !switchControl1.SwitchStatus;
}
Switch控件代码:
[DefaultEvent("Click")]
public partial class SwitchControl : UserControl
{
public SwitchControl()
{
InitializeComponent();
设置控件样式
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
int _outGap = 20;
/// <summary>
/// 外间隙
/// </summary>
[Browsable(true),Category("自定义属性"),Description("外间隙")]
public int OutCap
{
get
{
return _outGap;
}
set
{
if (_outGap < 0)
{
_outGap = 0;
}
else
{
_outGap = value;
}
this.Invalidate();
}
}
int _innerGap = 3;
/// <summary>
/// 内间隙
/// </summary>
[Browsable(true), Category("自定义属性"), Description("内间隙")]
public int InnerCap
{
get
{
return _innerGap;
}
set
{
if (_innerGap < 0)
{
_innerGap = 0;
}
else
{
_innerGap = value;
}
this.Invalidate();
}
}
bool _switchStatus = false;
/// <summary>
/// 开关状态
/// </summary>
[Browsable(true), Category("自定义属性"), Description("开关状态")]
public bool SwitchStatus
{
get
{
return _switchStatus;
}
set
{
_switchStatus = value;
this.Invalidate();
}
}
int _outCircleWidth = 4;
/// <summary>
/// 外圆宽度
/// </summary>
[Browsable(true), Category("自定义属性"), Description("外圆宽度")]
public int OutCircleWidth
{
get
{
return _outCircleWidth;
}
set
{
if (_outCircleWidth < 0)
{
_outCircleWidth = 2;
}
else
{
_outCircleWidth = value;
}
this.Invalidate();
}
}
Color _outCircleColor = Color.Gray;
/// <summary>
/// 外圆颜色
/// </summary>
[Browsable(true), Category("自定义属性"), Description("外圆颜色")]
public Color OutCircleColor
{
get
{
return _outCircleColor;
}
set
{
_outCircleColor = value;
this.Invalidate();
}
}
Color _innerCircleColor = Color.Gray;
/// <summary>
/// 外圆颜色
/// </summary>
[Browsable(true), Category("自定义属性"), Description("内圆颜色")]
public Color InnerCircleColor
{
get
{
return _innerCircleColor;
}
set
{
_innerCircleColor = value;
this.Invalidate();
}
}
/// <summary>
///旋转手柄宽度
/// </summary>
[Browsable(true), Category("自定义属性"), Description("旋转手柄宽度")]
public float HandleWidth
{
get
{
return Dimensions*HandleWidthFactor;
}
}
float _handleWidthFactor = 0.1f;
/// <summary>
///旋转手柄宽度比例因子
/// </summary>
[Browsable(true), Category("自定义属性"), Description("旋转手柄宽度比例因子")]
public float HandleWidthFactor
{
get
{
return _handleWidthFactor;
}
set
{
if (_handleWidthFactor < 0)
{
_handleWidthFactor = 0.15f;
}
else
{
_handleWidthFactor = value;
}
this.Invalidate();
}
}
Color _embellishColor = Color.Orange;
/// <summary>
/// 手柄标记颜色
/// </summary>
[Browsable(true), Category("自定义属性"), Description("手柄标记颜色")]
public Color EmbellishColor
{
get
{
return _embellishColor;
}
set
{
_embellishColor = value;
this.Invalidate();
}
}
Color _handleColor = Color.Black;
/// <summary>
/// 手柄颜色
/// </summary>
[Browsable(true), Category("自定义属性"), Description("手柄颜色")]
public Color HandleColor
{
get
{
return _handleColor;
}
set
{
_handleColor = value;
this.Invalidate();
}
}
/// <summary>
/// 绘图的标准尺寸
/// </summary>
private int Dimensions
{
get
{
if (Width > Height)
{
return Height;
}
else
{
return Width;
}
}
}
float _sweep = 36;
/// <summary>
/// 手柄旋转角度
/// </summary>
[Browsable(true), Category("自定义属性"), Description("手柄旋转角度")]
public float Sweep
{
get
{
return _sweep;
}
set
{
_sweep = value;
this.Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//绘制外圆
g.DrawEllipse(new Pen(OutCircleColor, OutCircleWidth), OutCap, OutCap, this.Dimensions - 2 * OutCap, Dimensions - 2 * OutCap);
//绘制内圆
Point innerPoint = new Point(OutCap + OutCircleWidth + InnerCap, OutCap + OutCircleWidth + InnerCap);
int innerWidth = Dimensions - 2 * innerPoint.X ;
g.FillEllipse(new SolidBrush(InnerCircleColor), innerPoint.X, innerPoint.Y, innerWidth, innerWidth);
//偏移原点
g.TranslateTransform(Dimensions / 2, Dimensions / 2);
//旋转角度
if (SwitchStatus)
{
g.RotateTransform(Sweep);
}
else
{
g.RotateTransform(-Sweep);
}
//绘制手柄
g.FillRectangle(new SolidBrush(HandleColor), -HandleWidth/2, (-Dimensions + OutCap)/2, HandleWidth, Dimensions - OutCap);
//绘制手柄标志
float embellishWidth = HandleWidth / 2;
float embellishHeight = HandleWidth * 1.5f;
g.FillEllipse(new SolidBrush(EmbellishColor), -embellishWidth / 2, (-Dimensions + OutCap) / 2 + embellishWidth / 2, embellishWidth, embellishHeight);
}
}
3,使用Graphics绘制PanelHead。
效果
可设置边框颜色,有无,Header文字,Header高度,背景色等,以及Dock类型
PanelHead控件代码:
public partial class PanelHead : Panel
{
public PanelHead()
{
InitializeComponent();
// 设置控