Нашёл очень удобный класс в виде контрола, который позволяет легко создавать кнопки с округлением Вставляем этот класс в свой проект public class RoundButton : Control { public Color BackColor2 { get; set; } public Color ButtonBorderColor { get; set; } public int ButtonRoundRadius { get; set; } public Color ButtonHighlightColor { get; set; } public Color ButtonHighlightColor2 { get; set; } public Color ButtonHighlightForeColor { get; set; } public Color ButtonPressedColor { get; set; } public Color ButtonPressedColor2 { get; set; } public Color ButtonPressedForeColor { get; set; } private bool IsHighlighted; private bool IsPressed; public RoundButton() { Size = new Size(100, 40); ButtonRoundRadius = 30; BackColor = Color.Gainsboro; BackColor2 = Color.Silver; ButtonBorderColor = Color.Black; ButtonHighlightColor = Color.Orange; ButtonHighlightColor2 = Color.OrangeRed; ButtonHighlightForeColor = Color.Black; ButtonPressedColor = Color.Red; ButtonPressedColor2 = Color.Maroon; ButtonPressedForeColor = Color.White; } protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return createParams; } } protected override void OnPaint(PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.HighQuality; var foreColor = IsPressed ? ButtonPressedForeColor : IsHighlighted ? ButtonHighlightForeColor : ForeColor; var backColor = IsPressed ? ButtonPressedColor : IsHighlighted ? ButtonHighlightColor : BackColor; var backColor2 = IsPressed ? ButtonPressedColor2 : IsHighlighted ? ButtonHighlightColor2 : BackColor2; using (var pen = new Pen(ButtonBorderColor, 1)) e.Graphics.DrawPath(pen, Path); using (var brush = new LinearGradientBrush(ClientRectangle, backColor, backColor2, LinearGradientMode.Vertical)) e.Graphics.FillPath(brush, Path); using (var brush = new SolidBrush(foreColor)) { var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; var rect = ClientRectangle; rect.Inflate(-4, -4); e.Graphics.DrawString(Text, Font, brush, rect, sf); } base.OnPaint(e); } protected override void OnPaintBackground(PaintEventArgs e) { } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); IsHighlighted = true; Parent.Invalidate(Bounds, false); Invalidate(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); IsHighlighted = false; IsPressed = false; Parent.Invalidate(Bounds, false); Invalidate(); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); Parent.Invalidate(Bounds, false); Invalidate(); IsPressed = true; } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); Parent.Invalidate(Bounds, false); Invalidate(); IsPressed = false; } protected GraphicsPath Path { get { var rect = ClientRectangle; rect.Inflate(-5, -5); return GetRoundedRectangle(rect, ButtonRoundRadius); } } public static GraphicsPath GetRoundedRectangle(Rectangle rect, int d) { var gp = new GraphicsPath(); gp.AddArc(rect.X, rect.Y, d, d, 180, 90); gp.AddArc(rect.X + rect.Width - d, rect.Y, d, d, 270, 90); gp.AddArc(rect.X + rect.Width - d, rect.Y + rect.Height - d, d, d, 0, 90); gp.AddArc(rect.X, rect.Y + rect.Height - d, d, d, 90, 90); gp.CloseFigure(); return gp; } } CSHARP public class RoundButton : Control { public Color BackColor2 { get; set; } public Color ButtonBorderColor { get; set; } public int ButtonRoundRadius { get; set; } public Color ButtonHighlightColor { get; set; } public Color ButtonHighlightColor2 { get; set; } public Color ButtonHighlightForeColor { get; set; } public Color ButtonPressedColor { get; set; } public Color ButtonPressedColor2 { get; set; } public Color ButtonPressedForeColor { get; set; } private bool IsHighlighted; private bool IsPressed; public RoundButton() { Size = new Size(100, 40); ButtonRoundRadius = 30; BackColor = Color.Gainsboro; BackColor2 = Color.Silver; ButtonBorderColor = Color.Black; ButtonHighlightColor = Color.Orange; ButtonHighlightColor2 = Color.OrangeRed; ButtonHighlightForeColor = Color.Black; ButtonPressedColor = Color.Red; ButtonPressedColor2 = Color.Maroon; ButtonPressedForeColor = Color.White; } protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return createParams; } } protected override void OnPaint(PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.HighQuality; var foreColor = IsPressed ? ButtonPressedForeColor : IsHighlighted ? ButtonHighlightForeColor : ForeColor; var backColor = IsPressed ? ButtonPressedColor : IsHighlighted ? ButtonHighlightColor : BackColor; var backColor2 = IsPressed ? ButtonPressedColor2 : IsHighlighted ? ButtonHighlightColor2 : BackColor2; using (var pen = new Pen(ButtonBorderColor, 1)) e.Graphics.DrawPath(pen, Path); using (var brush = new LinearGradientBrush(ClientRectangle, backColor, backColor2, LinearGradientMode.Vertical)) e.Graphics.FillPath(brush, Path); using (var brush = new SolidBrush(foreColor)) { var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; var rect = ClientRectangle; rect.Inflate(-4, -4); e.Graphics.DrawString(Text, Font, brush, rect, sf); } base.OnPaint(e); } protected override void OnPaintBackground(PaintEventArgs e) { } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); IsHighlighted = true; Parent.Invalidate(Bounds, false); Invalidate(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); IsHighlighted = false; IsPressed = false; Parent.Invalidate(Bounds, false); Invalidate(); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); Parent.Invalidate(Bounds, false); Invalidate(); IsPressed = true; } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); Parent.Invalidate(Bounds, false); Invalidate(); IsPressed = false; } protected GraphicsPath Path { get { var rect = ClientRectangle; rect.Inflate(-5, -5); return GetRoundedRectangle(rect, ButtonRoundRadius); } } public static GraphicsPath GetRoundedRectangle(Rectangle rect, int d) { var gp = new GraphicsPath(); gp.AddArc(rect.X, rect.Y, d, d, 180, 90); gp.AddArc(rect.X + rect.Width - d, rect.Y, d, d, 270, 90); gp.AddArc(rect.X + rect.Width - d, rect.Y + rect.Height - d, d, d, 0, 90); gp.AddArc(rect.X, rect.Y + rect.Height - d, d, d, 90, 90); gp.CloseFigure(); return gp; } } Далее нажимаем "Сборка -- Собрать решение" Появится контрол RoundButton в панели инструментов Перетаскиваем его и используем на здоровье! BackColor и BackColor2 - цвета фона кнопки, если поставить разные значения, то получится фон в виде градиента ButtonRoundRadius - радиус округления кнопки, на скриншоте кнопка с радиусом 15.
Scraby_inactive56786, тебе сама студия может подсказать, что нужно подключить. Для этого кликни на код с ошибкой (подсвечивается красным) и нажми Ctrl + ю, появится окно с предложением добавить новый using
RaysMorgan, полезный трюк, не так давно о нем узнал, но не всегда подсказывает верные библиотеки, а если они еще и не стандартные...
Scraby_inactive56786, using System.Windows.Forms; Код using System.Windows.Forms; Он должен по дефолту идти.
Обязательно доберитесь) там закругленная кнопка делается установкой проперти у бордера кнопки в виде CornerRadius="4". И все..... Я в свое время как познакомился с WPF все проекты на нем делаю теперь. В общем очень рекомендую, если к UI есть требования по красоте - то сильно упростит вам жизнь.
dreamteam_inactive, эти using'и добавлены в начале? System.Drawing System.Drawing.2D Код System.Drawing System.Drawing.2D
Добавляли вручную или через QuickActions (такая менюшка с лампочкой)? Если вручную, то возможно добавили не совсем то, что нужно.
Я добавил только эти неймспейсы, собрал солюшн и все заработало using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; Код using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D;