Загрузка...

Рисуем кнопку с округленными краями Win Forms C#

Тема в разделе C# создана пользователем RaysMorgan 1 фев 2017. 9781 просмотр

Загрузка...
  1. RaysMorgan
    RaysMorgan Автор темы 1 фев 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    Нашёл очень удобный класс в виде контрола, который позволяет легко создавать кнопки с округлением

    [IMG]


    Вставляем этот класс в свой проект

    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;
    }
    }

    Далее нажимаем "Сборка -- Собрать решение"
    [IMG]

    Появится контрол RoundButton в панели инструментов

    [IMG]

    Перетаскиваем его и используем на здоровье!

    BackColor и BackColor2 - цвета фона кнопки, если поставить разные значения, то получится фон в виде градиента
    ButtonRoundRadius - радиус округления кнопки, на скриншоте кнопка с радиусом 15.
     
    1 фев 2017 Изменено
  2. Scraby_inactive56786
    Внимание! Тупой вопрос:
    Какие библиотеки нужно подключить, чтобы этот класс работал? :)
     
  3. RaysMorgan
    RaysMorgan Автор темы 20 фев 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    Scraby_inactive56786, тебе сама студия может подсказать, что нужно подключить. Для этого кликни на код с ошибкой (подсвечивается красным) и нажми Ctrl + ю, появится окно с предложением добавить новый using
     
    1. rootmode
      RaysMorgan, полезный трюк, не так давно о нем узнал, но не всегда подсказывает верные библиотеки, а если они еще и не стандартные...
  4. Scraby_inactive56786
    Огромное спасибо, разобрался :)
    Сорян за тупые вопросы, только встаю на путь програмера :D
     
  5. RaysMorgan
    RaysMorgan Автор темы 20 фев 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
  6. DiCaprio_inactive32652
    DiCaprio_inactive32652 21 фев 2017 Заблокирован(а) 121 22 янв 2016
    Scraby_inactive56786,
    Код
    using System.Windows.Forms;
    Он должен по дефолту идти.
     
  7. RaysMorgan
    RaysMorgan Автор темы 21 фев 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    DiCaprio_inactive32652, это понятно, ещё нужно System.Drawing, возможно еще System.Drawing.2D
     
  8. Sofrano_inactive91153

    Почему не юзаете WPF? Очень круто красоту можно наводить
     
  9. RaysMorgan
    RaysMorgan Автор темы 6 мар 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
  10. Sofrano_inactive91153

    Обязательно доберитесь) там закругленная кнопка делается установкой проперти у бордера кнопки в виде CornerRadius="4". И все..... Я в свое время как познакомился с WPF все проекты на нем делаю теперь. В общем очень рекомендую, если к UI есть требования по красоте - то сильно упростит вам жизнь.
     
  11. dreamteam_inactive
    dreamteam_inactive 11 мар 2017 Заблокирован(а) 8 18 авг 2016
    Ошибок много в class`e
     
  12. RaysMorgan
    RaysMorgan Автор темы 11 мар 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
  13. dreamteam_inactive
    dreamteam_inactive 11 мар 2017 Заблокирован(а) 8 18 авг 2016
    Вот.Добавляем класс [IMG]
    А далее пошло-поехало [IMG]
     
  14. RaysMorgan
    RaysMorgan Автор темы 11 мар 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    dreamteam_inactive, эти using'и добавлены в начале?
    Код
    System.Drawing
    System.Drawing.2D
     
  15. dreamteam_inactive
    dreamteam_inactive 11 мар 2017 Заблокирован(а) 8 18 авг 2016
    Нет.Щас дописал,тоже ошибки
     
  16. SpPro
    SpPro 11 мар 2017 71 10 янв 2017
    Ну так наведите на ошибку и студия сама подскажет какое пространство имен подключить
    [IMG]
     
  17. dreamteam_inactive
    dreamteam_inactive 11 мар 2017 Заблокирован(а) 8 18 авг 2016
    Там не найден using эти переменные,но я их добавил что мне еррор скинул,ну все равно
     
  18. SpPro
    SpPro 11 мар 2017 71 10 янв 2017
    Добавляли вручную или через QuickActions (такая менюшка с лампочкой)? Если вручную, то возможно добавили не совсем то, что нужно.
     
  19. SpPro
    SpPro 11 мар 2017 71 10 янв 2017
    Я добавил только эти неймспейсы, собрал солюшн и все заработало
    Код

    using System.Windows.Forms;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    [IMG]
     
  20. dreamteam_inactive
    dreamteam_inactive 11 мар 2017 Заблокирован(а) 8 18 авг 2016
    кинь исход в лс если не сложно
     
Top