-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGradientButton.cs
More file actions
100 lines (85 loc) · 4.4 KB
/
Copy pathGradientButton.cs
File metadata and controls
100 lines (85 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace ObsHelper
{
internal class GradientButton : Button
{
public Color ColorStart { get; set; } = Color.FromArgb(40, 40, 40);
public Color ColorEnd { get; set; } = Color.FromArgb(30, 30, 30);
public Color AccentColor { get; set; } = Color.White;
public int CornerRadius { get; set; } = 12;
public string IconText { get; set; } = "";
public Font IconFont { get; set; }
private bool _hovered;
private bool _pressed;
public GradientButton()
{
SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
FlatStyle = FlatStyle.Flat;
FlatAppearance.BorderSize = 0;
}
protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); _hovered = true; Invalidate(); }
protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); _hovered = false; _pressed = false; Invalidate(); }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); _pressed = true; Invalidate(); }
protected override void OnMouseUp (MouseEventArgs e) { base.OnMouseUp(e); _pressed = false; Invalidate(); }
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
var rect = new Rectangle(0, 0, Width - 1, Height - 1);
Color c1 = ColorStart;
Color c2 = ColorEnd;
if (_pressed && Enabled) { c1 = Darken(c1, 0.18f); c2 = Darken(c2, 0.18f); }
else if (_hovered && Enabled) { c1 = Lighten(c1, 0.10f); c2 = Lighten(c2, 0.10f); }
using (var path = RoundedRect(rect, CornerRadius))
{
using (var brush = new LinearGradientBrush(new Rectangle(0, 0, Width, Height), c1, c2, 135f))
g.FillPath(brush, path);
if (!Enabled)
using (var ov = new SolidBrush(Color.FromArgb(130, 14, 14, 14)))
g.FillPath(ov, path);
}
Color fg = Enabled ? ForeColor : Color.FromArgb(80, ForeColor);
Color accent = Enabled ? AccentColor : Color.FromArgb(80, AccentColor);
if (!string.IsNullOrEmpty(IconText) && IconFont != null)
{
int split = Height * 52 / 100;
var iconRect = new Rectangle(0, 2, Width, split);
var textRect = new Rectangle(4, split - 2, Width - 8, Height - split);
TextRenderer.DrawText(g, IconText, IconFont, iconRect, accent,
TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
TextRenderer.DrawText(g, Text, Font, textRect, fg,
TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
}
else
{
TextRenderer.DrawText(g, Text, Font, ClientRectangle, fg,
TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
}
}
private static Color Darken(Color c, float amount) => Color.FromArgb(
Math.Max(0, (int)(c.R * (1 - amount))),
Math.Max(0, (int)(c.G * (1 - amount))),
Math.Max(0, (int)(c.B * (1 - amount))));
private static Color Lighten(Color c, float amount) => Color.FromArgb(
Math.Min(255, (int)(c.R + (255 - c.R) * amount)),
Math.Min(255, (int)(c.G + (255 - c.G) * amount)),
Math.Min(255, (int)(c.B + (255 - c.B) * amount)));
internal static GraphicsPath RoundedRect(Rectangle bounds, int radius)
{
var path = new GraphicsPath();
int d = Math.Min(radius * 2, Math.Min(bounds.Width, bounds.Height));
path.AddArc(bounds.X, bounds.Y, d, d, 180, 90);
path.AddArc(bounds.Right - d, bounds.Y, d, d, 270, 90);
path.AddArc(bounds.Right - d, bounds.Bottom - d, d, d, 0, 90);
path.AddArc(bounds.X, bounds.Bottom - d, d, d, 90, 90);
path.CloseFigure();
return path;
}
}
}