Yassine_Abbani

Rounded Button

Sep 10th, 2020
812
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.ComponentModel;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Windows.Forms;
  6.  
  7. namespace BrbVideoManager.Controls
  8. {
  9.     class RoundedButton : Button
  10.     {
  11.         private int b_radius = 50;
  12.         private float b_width = 1.75f;
  13.         private Color b_color = Color.Blue;
  14.         private Color b_over_color,b_down_color;
  15.         private float b_over_width = 0;
  16.         private float b_down_width = 0;
  17.  
  18.         public bool IsMouseOver { get; private set; }
  19.         private bool IsMouseDown { get; set; }
  20.  
  21.         [Category("Border"),DisplayName("Border Width")]
  22.         public float BorderWidth
  23.         {
  24.             get {
  25.                 return b_width;
  26.             }
  27.             set {
  28.                 if (b_width == value) return;
  29.                 b_width = value;
  30.                 Invalidate();
  31.             }
  32.         }
  33.  
  34.         [Category("Border"), DisplayName("Border Over Width")]
  35.         public float BorderOverWidth
  36.         {
  37.             get
  38.             {
  39.                 return b_over_width;
  40.             }
  41.             set
  42.             {
  43.                 if (b_over_width == value) return;
  44.                 b_over_width = value;
  45.                 Invalidate();
  46.             }
  47.         }
  48.  
  49.         [Category("Border"), DisplayName("Border Down Width")]
  50.         public float BorderDownWidth
  51.         {
  52.             get
  53.             {
  54.                 return b_down_width;
  55.             }
  56.             set
  57.             {
  58.                 if (b_down_width == value) return;
  59.                 b_down_width = value;
  60.                 Invalidate();
  61.             }
  62.         }
  63.  
  64.         [Category("Border"), DisplayName("Border Color")]
  65.         public Color BorderColor
  66.         {
  67.             get { return b_color; }
  68.             set
  69.             {
  70.                 if (b_color == value) return;
  71.                 b_color = value;
  72.                 Invalidate();
  73.             }
  74.         }
  75.  
  76.         [Category("Border"), DisplayName("Border Over Color")]
  77.         public Color BorderOverColor
  78.         {
  79.             get { return b_over_color; }
  80.             set
  81.             {
  82.                 if (b_over_color == value) return;
  83.                 b_over_color = value;
  84.                 Invalidate();
  85.             }
  86.         }
  87.  
  88.         [Category("Border"), DisplayName("Border Down Color")]
  89.         public Color BorderDownColor
  90.         {
  91.             get { return b_down_color; }
  92.             set
  93.             {
  94.                 if (b_down_color == value) return;
  95.                 b_down_color = value;
  96.                 Invalidate();
  97.             }
  98.         }
  99.  
  100.         [Category("Border"), DisplayName("Border Radius")]
  101.         public int BorderRadius
  102.         {
  103.             get {
  104.                 //b_radius = Math.Min(Math.Min(Height, Width), b_radius);
  105.                 return b_radius;
  106.             }
  107.             set
  108.             {
  109.                 if (b_radius == value) return;
  110.                 //b_radius = Math.Min(Math.Min(Height, Width), value);
  111.                 b_radius = value;
  112.                 Invalidate();
  113.             }
  114.         }
  115.  
  116.         GraphicsPath GetRoundPath(RectangleF Rect, int radius, float width=0)
  117.         {
  118.             //Fix radius to rect size
  119.             radius = (int) Math.Max(( Math.Min(radius, Math.Min(Rect.Width, Rect.Height)) - width),1);
  120.             float r2 = radius / 2f;
  121.             float w2 = width / 2f;            
  122.             GraphicsPath GraphPath = new GraphicsPath();
  123.  
  124.             //Top-Left Arc
  125.             GraphPath.AddArc(Rect.X + w2, Rect.Y + w2, radius, radius, 180, 90);
  126.  
  127.             //Top-Right Arc
  128.             GraphPath.AddArc(Rect.X + Rect.Width - radius - w2, Rect.Y + w2, radius, radius, 270, 90);
  129.  
  130.             //Bottom-Right Arc
  131.             GraphPath.AddArc(Rect.X + Rect.Width - w2 - radius,
  132.                                Rect.Y + Rect.Height - w2 - radius, radius, radius, 0, 90);
  133.             //Bottom-Left Arc
  134.             GraphPath.AddArc(Rect.X + w2, Rect.Y - w2 + Rect.Height - radius, radius, radius, 90, 90);
  135.  
  136.             //Close line ( Left)          
  137.             GraphPath.AddLine(Rect.X + w2, Rect.Y + Rect.Height - r2 - w2, Rect.X + w2,Rect.Y + r2 + w2);
  138.                        
  139.             //GraphPath.CloseFigure();            
  140.            
  141.             return GraphPath;
  142.         }
  143.  
  144.         private void DrawText(Graphics g,RectangleF Rect)
  145.         {
  146.             float r2 = BorderRadius / 2f;
  147.             float w2 = BorderWidth / 2f;
  148.             Point point = new Point();
  149.             StringFormat format = new StringFormat();
  150.  
  151.             switch (TextAlign)
  152.             {
  153.                 case ContentAlignment.TopLeft:
  154.                     point.X = (int)(Rect.X + r2/2 + w2 + Padding.Left);
  155.                     point.Y = (int)(Rect.Y + r2/2 + w2 + Padding.Top);
  156.                     format.LineAlignment = StringAlignment.Center;                    
  157.                     break;
  158.                 case ContentAlignment.TopCenter:
  159.                     point.X = (int)(Rect.X + Rect.Width/2f);
  160.                     point.Y = (int)(Rect.Y + r2/2 + w2 + Padding.Top);
  161.                     format.LineAlignment = StringAlignment.Center;
  162.                     format.Alignment = StringAlignment.Center;
  163.                     break;
  164.                 case ContentAlignment.TopRight:
  165.                     point.X = (int)(Rect.X + Rect.Width - r2/2 - w2 - Padding.Right);
  166.                     point.Y = (int)(Rect.Y + r2 / 2 + w2 + Padding.Top);
  167.                     format.LineAlignment = StringAlignment.Center;
  168.                     format.Alignment = StringAlignment.Far;
  169.                     break;
  170.                 case ContentAlignment.MiddleLeft:
  171.                     point.X = (int)(Rect.X + r2 / 2 + w2 + Padding.Left);
  172.                     point.Y = (int)(Rect.Y + Rect.Height/2);
  173.                     format.LineAlignment = StringAlignment.Center;
  174.                     break;
  175.                 case ContentAlignment.MiddleCenter:
  176.                     point.X = (int)(Rect.X +Rect.Width / 2);
  177.                     point.Y = (int)(Rect.Y + Rect.Height / 2);
  178.                     format.LineAlignment = StringAlignment.Center;
  179.                     format.Alignment = StringAlignment.Center;
  180.                     break;
  181.                 case ContentAlignment.MiddleRight:
  182.                     point.X = (int)(Rect.X + Rect.Width - r2 / 2 - w2 - Padding.Right);
  183.                     point.Y = (int)(Rect.Y + Rect.Height / 2);
  184.                     format.LineAlignment = StringAlignment.Center;
  185.                     format.Alignment = StringAlignment.Far;
  186.                     break;
  187.                 case ContentAlignment.BottomLeft:
  188.                     point.X = (int)(Rect.X + r2 / 2 + w2 + Padding.Left);
  189.                     point.Y = (int)(Rect.Y + Rect.Height - r2 / 2 - w2 - Padding.Bottom);
  190.                     format.LineAlignment = StringAlignment.Center;
  191.                     break;
  192.                 case ContentAlignment.BottomCenter:
  193.                     point.X = (int)(Rect.X + Rect.Width/2);
  194.                     point.Y = (int)(Rect.Y + Rect.Height - r2 / 2 - w2 - Padding.Bottom);
  195.                     format.LineAlignment = StringAlignment.Center;
  196.                     format.Alignment = StringAlignment.Center;
  197.                     break;
  198.                 case ContentAlignment.BottomRight:
  199.                     point.X = (int)(Rect.X + Rect.Width - r2 / 2 - w2 - Padding.Right);
  200.                     point.Y = (int)(Rect.Y + Rect.Height - r2 / 2 - w2 - Padding.Bottom);
  201.                     format.LineAlignment = StringAlignment.Center;
  202.                     format.Alignment = StringAlignment.Far;
  203.                     break;
  204.                 default:
  205.                     break;
  206.             }
  207.            
  208.             /* Debug
  209.             using (Pen pen = new Pen(Color.Black, 1))
  210.             {
  211.                 g.DrawLine(pen, new Point(0, 0), point);
  212.                 g.DrawLine(pen, point.X, 0, point.X, point.Y);
  213.                 g.DrawLine(pen, 0, point.Y, point.X, point.Y);
  214.             }
  215.             */
  216.  
  217.             using (Brush brush = new SolidBrush(ForeColor))
  218.                 g.DrawString(Text, Font, brush, point, format);          
  219.         }
  220.        
  221.         protected override void OnPaint(PaintEventArgs e)
  222.         {
  223.             e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
  224.             RectangleF Rect = new RectangleF(0, 0, this.Width, this.Height);
  225.             Brush brush = new SolidBrush(this.BackColor);
  226.             //Pen pen = new Pen(BorderColor, BorderWidth);
  227.            
  228.             GraphicsPath GraphPath = GetRoundPath(Rect, BorderRadius);
  229.  
  230.             this.Region = new Region(GraphPath);
  231.            
  232.             //Draw Back Color
  233.             if(IsMouseDown && !FlatAppearance.MouseDownBackColor.IsEmpty)
  234.                 using (Brush mouseDownBrush = new SolidBrush(FlatAppearance.MouseDownBackColor))
  235.                     e.Graphics.FillPath(mouseDownBrush, GraphPath);
  236.             else if (IsMouseOver && !FlatAppearance.MouseOverBackColor.IsEmpty)
  237.                 using (Brush overBrush = new SolidBrush(FlatAppearance.MouseOverBackColor))
  238.                     e.Graphics.FillPath(overBrush, GraphPath);
  239.             else            
  240.                 e.Graphics.FillPath(brush, GraphPath);
  241.  
  242.             //Draw Border
  243.             #region DrawBorder
  244.  
  245.             GraphicsPath GraphInnerPath;
  246.             Pen pen;
  247.  
  248.             if (IsMouseDown && !BorderDownColor.IsEmpty)
  249.             {
  250.                 GraphInnerPath = GetRoundPath(Rect, BorderRadius, BorderDownWidth);
  251.                 pen = new Pen(BorderDownColor, BorderDownWidth);
  252.             }                
  253.             else if (IsMouseOver && !BorderOverColor.IsEmpty)
  254.             {
  255.                 GraphInnerPath = GetRoundPath(Rect, BorderRadius, BorderOverWidth);
  256.                 pen = new Pen(BorderOverColor, BorderOverWidth);
  257.             }                
  258.             else
  259.             {
  260.                 GraphInnerPath = GetRoundPath(Rect, BorderRadius, BorderWidth);
  261.                 pen = new Pen(BorderColor, BorderWidth);
  262.             }
  263.                
  264.  
  265.             pen.Alignment = PenAlignment.Inset;
  266.             if(pen.Width>0)
  267.                 e.Graphics.DrawPath(pen, GraphInnerPath);
  268.             #endregion
  269.  
  270.             //Draw Text
  271.             DrawText(e.Graphics,Rect);
  272.         }// End Paint Method
  273.  
  274.         protected override void OnMouseEnter(EventArgs e)
  275.         {
  276.             IsMouseOver = true;
  277.             Invalidate();
  278.             base.OnMouseEnter(e);
  279.         }
  280.  
  281.         protected override void OnMouseLeave(EventArgs e)
  282.         {
  283.             IsMouseOver = false;
  284.             IsMouseDown = false;
  285.             Invalidate();
  286.             base.OnMouseHover(e);
  287.         }
  288.  
  289.         protected override void OnMouseDown(MouseEventArgs mevent)
  290.         {
  291.             IsMouseDown = true;
  292.             Invalidate();
  293.             base.OnMouseDown(mevent);
  294.         }
  295.  
  296.         protected override void OnMouseUp(MouseEventArgs mevent)
  297.         {
  298.             IsMouseDown = false;
  299.             Invalidate();
  300.             base.OnMouseDown(mevent);
  301.         }
  302.  
  303.        
  304.     }
  305. }
  306.  
RAW Paste Data