using System.Windows.Forms; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; /// <summary> /// Represent a Glowing Button /// re code by wgscd /// date: 2010 02-10 /// mail:wgscd@126.com /// http://blog.youkuaiyun.com/wgsnet /// </summary> /// <remarks></remarks> /// namespace GlowingButton { [Description("Represent a Glowing Button")] public class GlowButton : Control { public enum LayerStatus { None = 0, Self = 1, TopLeft = 2, Top = 3, TopRight = 4, Left = 5, Right = 6, BottomLeft = 7, Bottom = 8, BottomRight = 9 } private LayerStatus _Layer = LayerStatus.None; private Color _LayerColor = Color.Transparent; private bool _Highlighted = false; private int _GlowLength = 8; private GlassColorTable _ColorTable = new GlassColorTable(); [Browsable(false)] public LayerStatus Layer { get { return _Layer; } set { _Layer = value; this.Invalidate(); } } [Browsable(false)] public Color LayerColor { get { return _ColorTable.GlowCenter; } set { _LayerColor = value; } } [Browsable(false)] public ColorSet Renderer { get { return _ColorTable.Renderer; } set { _ColorTable.Renderer = value; _ColorTable.State = wgscd.States.Normal; this.Refresh(); } } private void Initialize() { this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true); this.Size = new Size(34, 34); this.BackColor = Color.Transparent; this.Text = ""; this.Font = new System.Drawing.Font("Segoe UI", 20.25f, FontStyle.Regular, GraphicsUnit.Point, (byte)0); } public GlowButton() { this.Initialize(); this._ColorTable.Renderer = new CalmCyan(); this._ColorTable.State = wgscd.States.Normal; } public GlowButton(ColorSet Renderer) { this.Initialize(); this._ColorTable.Renderer = Renderer; this._ColorTable.State = wgscd.States.Normal; } protected override void OnClick(System.EventArgs e) { base.OnClick(e); this.Select(); } protected override void OnGotFocus(System.EventArgs e) { base.OnGotFocus(e); } protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e) { base.OnKeyUp(e); this.Text = "wgscd"; this.Refresh(); } protected override void OnLostFocus(System.EventArgs e) { base.OnLostFocus(e); } protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { base.OnMouseDown(e); this._ColorTable.State = wgscd.States.Pressed; this.Refresh(); } protected override void OnMouseEnter(System.EventArgs e) { base.OnMouseEnter(e); this._ColorTable.State = wgscd.States.Highlighted; _Highlighted = true; this.BringToFront(); this.Refresh(); } protected override void OnMouseLeave(System.EventArgs e) { base.OnMouseLeave(e); this._ColorTable.State = wgscd.States.Normal; _Highlighted = false; this.Refresh(); } protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e) { base.OnMouseUp(e); this._ColorTable.State = wgscd.States.Highlighted; this.Refresh(); } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { Rectangle BackRect = new Rectangle(1, this.Height / 2, this.Width - 2, this.Height / 2 - 1); Rectangle ShineRect = new Rectangle(1, 1, this.Width - 2, this.Height / 2 - 1); using (LinearGradientBrush lgb = new LinearGradientBrush(BackRect, _ColorTable.BackgroundHigh, _ColorTable.BackgroundLow,LinearGradientMode.Vertical)) { e.Graphics.FillRectangle(lgb, BackRect); } using (LinearGradientBrush lgb2 = new LinearGradientBrush(ShineRect, _ColorTable.ShineHigh, _ColorTable.ShineLow, LinearGradientMode.Vertical)) { e.Graphics.FillRectangle(lgb2, ShineRect); } e.Graphics.DrawLine(new Pen(_ColorTable.BorderTop), 1, 1, this.Width - 2, 1); e.Graphics.DrawLine(new Pen(_ColorTable.BorderBottom), 1, this.Height - 2, this.Width - 2, this.Height - 2); e.Graphics.DrawLine(new Pen(_ColorTable.BorderLeft), 1, 1, 1, this.Height - 2); e.Graphics.DrawLine(new Pen(_ColorTable.BorderRight), this.Width - 2, 1, this.Width - 2, this.Height - 3); e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(_ColorTable.TextColor), ((this.Width - e.Graphics.MeasureString(this.Text, this.Font).Width) / 2), ((this.Height - e.Graphics.MeasureString(this.Text, this.Font).Height) / 2) + 1); if (_Highlighted) { e.Graphics.DrawRectangle(new Pen(_ColorTable.GlowCenter), 0, 0, this.Width - 1, this.Height - 1); } //Here is the layer if (_Layer != LayerStatus.None) { int x = 0; int y = 0; switch (_Layer) { case LayerStatus.Bottom: y += 34; break; case LayerStatus.BottomLeft: x -= 34; y += 34; break; case LayerStatus.BottomRight: x += 34; y += 34; break; case LayerStatus.Left: x -= 34; break; case LayerStatus.Right: x += 34; break; case LayerStatus.Top: y -= 34; break; case LayerStatus.TopLeft: x -= 34; y -= 34; break; case LayerStatus.TopRight: x += 34; y -= 34; break; } Point StartPoint = new Point(x - _GlowLength, y - _GlowLength); using (GraphicsPath pth = new GraphicsPath()) { pth.AddRectangle(new Rectangle(StartPoint, new Size(34 + _GlowLength * 2, 34 + _GlowLength * 2))); using (PathGradientBrush pgb = new PathGradientBrush(pth)) { //Normal pgb.CenterColor = _LayerColor; //This is the real one pgb.SurroundColors = new Color[] { Color.Transparent }; pgb.FocusScales = new PointF(0.7f, 0.7f); //Color Blend //Dim cb As New Drawing2D.ColorBlend(2) //cb.Positions(0) = 0.0F //cb.Positions(1) = 1.0F //cb.Colors = New Color() {Color.Transparent, Color.FromArgb(150, 93, 198, 241)} //pgb.InterpolationColors = cb //pgb.FocusScales = New PointF(0.7F, 0.7F) e.Graphics.FillPath(pgb, pth); } } } } } //___________________wgscd____________________________________________________ public interface IGlassColor { void NormalState(); void HighlightState(); void PressedState(); void DisabledState(); } //___________________wgscd____________________________________________________ public class wgscd { public enum States { Normal = 0, Highlighted = 1, Pressed = 2, Disabled = 3 } } //___________________wgscd____________________________________________________ public class GlassColorTable : IGlassColor { protected Color _BackgroundHigh; protected Color _BackgroundLow; protected Color _ShineHigh; protected Color _ShineLow; protected Color _BorderLeft; protected Color _BorderRight; protected Color _BorderTop; protected Color _BorderBottom; protected Color _TextColor; protected Color _GlowCenter; private wgscd.States _State; private ColorSet _cSet; public virtual Color BackgroundLow { get { return _BackgroundHigh; } } public virtual Color BackgroundHigh { get { return _BackgroundLow; } } public virtual Color ShineHigh { get { return _ShineHigh; } } public virtual Color ShineLow { get { return _ShineLow; } } public virtual Color BorderTop { get { return _BorderTop; } } public virtual Color BorderLeft { get { return _BorderLeft; } } public virtual Color BorderRight { get { return _BorderRight; } } public virtual Color BorderBottom { get { return _BorderBottom; } } public virtual Color TextColor { get { return _TextColor; } } public virtual Color GlowCenter { get { return _GlowCenter; } } public ColorSet Renderer { get { return _cSet; } set { _cSet = value; //Set Glow that can't affect from State _GlowCenter = _cSet.GlowCenter; } } public wgscd.States State { get { return _State; } set { _State = value; switch (_State) { case wgscd.States.Disabled: this.DisabledState(); break; case wgscd.States.Highlighted: this.HighlightState(); break; case wgscd.States.Normal: this.NormalState(); break; case wgscd.States.Pressed: this.PressedState(); break; } } } public void DisabledState() { } public void HighlightState() { _BackgroundHigh = _cSet.BackgroundHighFocus; _BackgroundLow = _cSet.BackgroundLowFocus; _ShineHigh = _cSet.ShineHighFocus; _ShineLow = _cSet.ShineLowFocus; _BorderLeft = _cSet.BorderLeftFocus; _BorderRight = _cSet.BorderRightFocus; _BorderTop = _cSet.BorderTopFocus; _BorderBottom = _cSet.BorderBottomFocus; _TextColor = _cSet.TextColorFocus; } public void NormalState() { _BackgroundHigh = _cSet.BackgroundHigh; _BackgroundLow = _cSet.BackgroundLow; _ShineHigh = _cSet.ShineHigh; _ShineLow = _cSet.ShineLow; _BorderLeft = _cSet.BorderLeft; _BorderRight = _cSet.BorderRight; _BorderTop = _cSet.BorderTop; _BorderBottom = _cSet.BorderBottom; _TextColor = _cSet.TextColor; } public void PressedState() { _BackgroundHigh = _cSet.BackgroundHighPressed; _BackgroundLow = _cSet.BackgroundLowPressed; _ShineHigh = _cSet.ShineHighPressed; _ShineLow = _cSet.ShineLowPressed; _BorderLeft = _cSet.BorderLeftPressed; _BorderRight = _cSet.BorderRightPressed; _BorderTop = _cSet.BorderTopPressed; _BorderBottom = _cSet.BorderBottomPressed; _TextColor = _cSet.TextColorPressed; } } //___________________wgscd____________________________________________________ public class ColorSet { //Normal State public Color BackgroundHigh; public Color BackgroundLow; public Color ShineHigh; public Color ShineLow; public Color BorderLeft; public Color BorderRight; public Color BorderTop; public Color BorderBottom; public Color TextColor; //Highlight State public Color BackgroundHighFocus; public Color BackgroundLowFocus; public Color ShineHighFocus; public Color ShineLowFocus; public Color BorderLeftFocus; public Color BorderRightFocus; public Color BorderTopFocus; public Color BorderBottomFocus; public Color TextColorFocus; //Pressed State public Color BackgroundHighPressed; public Color BackgroundLowPressed; public Color ShineHighPressed; public Color ShineLowPressed; public Color BorderLeftPressed; public Color BorderRightPressed; public Color BorderTopPressed; public Color BorderBottomPressed; public Color TextColorPressed; //Disabled State //Protected Shared _BackgroundHighDisabled As Color //Protected Shared _BackgroundLowDisabled As Color //Protected Shared _ShineHighDisabled As Color //Protected Shared _ShineLowDisabled As Color //Protected Shared _BorderLeftDisabled As Color //Protected Shared _BorderRightDisabled As Color //Protected Shared _BorderTopDisabled As Color //Protected Shared _BorderBottomDisabled As Color //Protected Shared _TextColorDisabled As Color //Glow Set public Color GlowCenter; } #region "Cyan Colorset" public class CalmCyan : ColorSet { public CalmCyan() { BackgroundHigh = Color.FromArgb(115, 163, 183); BackgroundLow = Color.FromArgb(94, 146, 159); ShineHigh = Color.FromArgb(184, 212, 220); ShineLow = Color.FromArgb(143, 181, 192); BorderLeft = Color.FromArgb(125, Color.White); BorderRight = Color.FromArgb(100, Color.White); BorderTop = Color.White; BorderBottom = Color.FromArgb(180, 209, 219); TextColor = Color.White; BackgroundHighFocus = Color.FromArgb(47, 216, 229); BackgroundLowFocus = Color.FromArgb(14, 102, 159); ShineHighFocus = Color.FromArgb(166, 204, 229); ShineLowFocus = Color.FromArgb(116, 170, 206); BorderLeftFocus = Color.FromArgb(125, Color.White); BorderRightFocus = Color.FromArgb(100, Color.White); BorderTopFocus = Color.White; BorderBottomFocus = Color.FromArgb(180, 209, 219); TextColorFocus = Color.White; BackgroundHighPressed = Color.FromArgb(23, 214, 198); BackgroundLowPressed = Color.FromArgb(7, 36, 67); ShineHighPressed = Color.FromArgb(145, 174, 194); ShineLowPressed = Color.FromArgb(80, 115, 145); BorderLeftPressed = Color.FromArgb(125, Color.White); BorderRightPressed = Color.FromArgb(100, Color.White); BorderTopPressed = Color.White; BorderBottomPressed = Color.FromArgb(180, 209, 219); TextColorPressed = Color.White; GlowCenter = Color.FromArgb(150, 93, 198, 241); } } #endregion #region "Red Colorset" public class DiamondRed : ColorSet { public DiamondRed() { BackgroundHigh = Color.FromArgb(171, 115, 106); BackgroundLow = Color.FromArgb(185, 63, 42); ShineHigh = Color.FromArgb(203, 167, 163); ShineLow = Color.FromArgb(174, 115, 109); BorderLeft = Color.FromArgb(125, Color.White); BorderRight = Color.FromArgb(100, Color.White); BorderTop = Color.White; BorderBottom = Color.FromArgb(217, 178, 166); TextColor = Color.White; BackgroundHighFocus = Color.FromArgb(230, 149, 48); BackgroundLowFocus = Color.FromArgb(170, 38, 19); ShineHighFocus = Color.FromArgb(230, 154, 142); ShineLowFocus = Color.FromArgb(208, 101, 84); BorderLeftFocus = Color.FromArgb(125, Color.White); BorderRightFocus = Color.FromArgb(100, Color.White); BorderTopFocus = Color.White; BorderBottomFocus = Color.FromArgb(245, 232, 120); TextColorFocus = Color.White; BackgroundHighPressed = Color.FromArgb(144, 109, 33); BackgroundLowPressed = Color.FromArgb(71, 13, 2); ShineHighPressed = Color.FromArgb(205, 166, 144); ShineLowPressed = Color.FromArgb(164, 100, 75); BorderLeftPressed = Color.FromArgb(125, Color.White); BorderRightPressed = Color.FromArgb(100, Color.White); BorderTopPressed = Color.White; BorderBottomPressed = Color.FromArgb(204, 203, 30); TextColorPressed = Color.White; GlowCenter = Color.FromArgb(150, 217, 116, 90); } } #endregion //___________________wgscd____________________________________________________ }