📄 glassbutton.cs
字号:
/// <param name="e">An <see cref="T:System.EventArgs" /> that contains the event data.</param>
protected override void OnSizeChanged(EventArgs e)
{
CreateFrames();
base.OnSizeChanged(e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.Click" /> event.
/// </summary>
/// <param name="e">The <see cref="System.EventArgs" /> instance containing the event data.</param>
protected override void OnClick(EventArgs e)
{
_isKeyDown = _isMouseDown = false;
base.OnClick(e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.Enter" /> event.
/// </summary>
/// <param name="e">An <see cref="T:System.EventArgs" /> that contains the event data.</param>
protected override void OnEnter(EventArgs e)
{
_isFocused = _isFocusedByKey = true;
base.OnEnter(e);
if (_fadeOnFocus)
{
FadeIn();
}
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.Leave" /> event.
/// </summary>
/// <param name="e">An <see cref="T:System.EventArgs" /> that contains the event data.</param>
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
_isFocused = _isFocusedByKey = _isKeyDown = _isMouseDown = false;
Invalidate();
if (_fadeOnFocus)
{
FadeOut();
}
}
/// <summary>
/// Raises the <see cref="M:System.Windows.Forms.ButtonBase.OnKeyUp(System.Windows.Forms.KeyEventArgs)" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.KeyEventArgs" /> that contains the event data.</param>
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
_isKeyDown = true;
Invalidate();
}
base.OnKeyDown(e);
}
/// <summary>
/// Raises the <see cref="M:System.Windows.Forms.ButtonBase.OnKeyUp(System.Windows.Forms.KeyEventArgs)" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.KeyEventArgs" /> that contains the event data.</param>
protected override void OnKeyUp(KeyEventArgs e)
{
if (_isKeyDown && e.KeyCode == Keys.Space)
{
_isKeyDown = false;
Invalidate();
}
base.OnKeyUp(e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseDown" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
protected override void OnMouseDown(MouseEventArgs e)
{
if (!_isMouseDown && e.Button == MouseButtons.Left)
{
_isMouseDown = true;
_isFocusedByKey = false;
Invalidate();
}
base.OnMouseDown(e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseUp" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
protected override void OnMouseUp(MouseEventArgs e)
{
if (_isMouseDown)
{
_isMouseDown = false;
Invalidate();
}
base.OnMouseUp(e);
}
/// <summary>
/// Raises the <see cref="M:System.Windows.Forms.Control.OnMouseMove(System.Windows.Forms.MouseEventArgs)" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.</param>
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button != MouseButtons.None)
{
if (!ClientRectangle.Contains(e.X, e.Y))
{
if (_isHovered)
{
_isHovered = false;
Invalidate();
}
}
else if (!_isHovered)
{
_isHovered = true;
Invalidate();
}
}
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseEnter" /> event.
/// </summary>
/// <param name="e">The <see cref="System.EventArgs" /> instance containing the event data.</param>
protected override void OnMouseEnter(EventArgs e)
{
_isHovered = true;
FadeIn();
Invalidate();
base.OnMouseEnter(e);
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseLeave" /> event.
/// </summary>
/// <param name="e">The <see cref="System.EventArgs" /> instance containing the event data.</param>
protected override void OnMouseLeave(EventArgs e)
{
_isHovered = false;
if (!(FadeOnFocus && _isFocusedByKey)) FadeOut();
Invalidate();
base.OnMouseLeave(e);
}
#endregion
#region " Painting "
/// <summary>
/// Raises the <see cref="M:System.Windows.Forms.ButtonBase.OnPaint(System.Windows.Forms.PaintEventArgs)" /> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.PaintEventArgs" /> that contains the event data.</param>
protected override void OnPaint(PaintEventArgs e)
{
DrawButtonBackgroundFromBuffer(e.Graphics);
DrawForegroundFromButton(e);
DrawButtonForeground(e.Graphics);
if (Paint != null)
{
Paint(this, e);
}
}
/// <summary>
/// Occurs when the control is redrawn.
/// </summary>
public new event PaintEventHandler Paint;
private void DrawButtonBackgroundFromBuffer(Graphics graphics)
{
int frame;
if (!Enabled)
{
frame = FRAME_DISABLED;
}
else if (IsPressed)
{
frame = FRAME_PRESSED;
}
else if (!IsAnimating && _currentFrame == 0)
{
frame = FRAME_NORMAL;
}
else
{
if (!HasAnimationFrames)
{
CreateFrames(true);
}
frame = FRAME_ANIMATED + _currentFrame;
}
if (_frames == null || _frames.Count == 0)
{
CreateFrames();
}
graphics.DrawImage(_frames[frame], Point.Empty);
}
private Image CreateBackgroundFrame(bool pressed, bool hovered,
bool animating, bool enabled, float glowOpacity)
{
Rectangle rect = ClientRectangle;
if (rect.Width <= 0)
{
rect.Width = 1;
}
if (rect.Height <= 0)
{
rect.Height = 1;
}
Image img = new Bitmap(rect.Width, rect.Height);
using (Graphics g = Graphics.FromImage(img))
{
g.Clear(Color.Transparent);
DrawButtonBackground(g, rect, pressed, hovered, animating, enabled,
_outerBorderColor, _backColor, _glowColor, _shineColor, _innerBorderColor,
glowOpacity);
}
return img;
}
private static void DrawButtonBackground(Graphics g, Rectangle rectangle,
bool pressed, bool hovered, bool animating, bool enabled,
Color outerBorderColor, Color backColor, Color glowColor, Color shineColor,
Color innerBorderColor, float glowOpacity)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
#region " white border "
Rectangle rect = rectangle;
rect.Width--;
rect.Height--;
using (GraphicsPath bw = CreateRoundRectangle(rect, 4))
{
using (Pen p = new Pen(outerBorderColor))
{
g.DrawPath(p, bw);
}
}
#endregion
rect.X++;
rect.Y++;
rect.Width -= 2;
rect.Height -= 2;
Rectangle rect2 = rect;
rect2.Height >>= 1;
#region " content "
using (GraphicsPath bb = CreateRoundRectangle(rect, 2))
{
int opacity = pressed ? 0xcc : 0x7f;
using (Brush br = new SolidBrush(Color.FromArgb(opacity, backColor)))
{
g.FillPath(br, bb);
}
}
#endregion
#region " glow "
if ((hovered || animating) && !pressed)
{
using (GraphicsPath clip = CreateRoundRectangle(rect, 2))
{
g.SetClip(clip, CombineMode.Intersect);
using (GraphicsPath brad = CreateBottomRadialPath(rect))
{
using (PathGradientBrush pgr = new PathGradientBrush(brad))
{
int opacity = (int)(0xB2 * glowOpacity + .5f);
RectangleF bounds = brad.GetBounds();
pgr.CenterPoint = new PointF((bounds.Left + bounds.Right) / 2f, (bounds.Top + bounds.Bottom) / 2f);
pgr.CenterColor = Color.FromArgb(opacity, glowColor);
pgr.SurroundColors = new Color[] { Color.FromArgb(0, glowColor) };
g.FillPath(pgr, brad);
}
}
g.ResetClip();
}
}
#endregion
#region " shine "
if (rect2.Width > 0 && rect2.Height > 0)
{
rect2.Height++;
using (GraphicsPath bh = CreateTopRoundRectangle(rect2, 2))
{
rect2.Height++;
int opacity = 0x99;
if (pressed | !enabled)
{
opacity = (int)(.4f * opacity + .5f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -