Link to home
Start Free TrialLog in
Avatar of milani_lucie
milani_lucieFlag for United States of America

asked on

C# - How to Add Round Corner to Button ?

Hi,

I have the following code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace WindowsFormsApplication1
{
    public static class Class1
    {
        public static void DrawRoundedRectangle(this Graphics g, Color color, Rectangle rec, int radius, RoundedCorners corners)
        {
            using (var b = new SolidBrush(color))
            {
                int x = rec.X;
                int y = rec.Y;
                int diameter = radius * 2;
                var horiz = new Rectangle(x, y + radius, rec.Width, rec.Height - diameter);
                var vert = new Rectangle(x + radius, y, rec.Width - diameter, rec.Height);

                g.FillRectangle(b, horiz);
                g.FillRectangle(b, vert);

                if ((corners & RoundedCorners.TopLeft) == RoundedCorners.TopLeft)
                    g.FillEllipse(b, x, y, diameter, diameter);
                else
                    g.FillRectangle(b, x, y, diameter, diameter);

                if ((corners & RoundedCorners.TopRight) == RoundedCorners.TopRight)
                    g.FillEllipse(b, x + rec.Width - (diameter + 1), y, diameter, diameter);
                else
                    g.FillRectangle(b, x + rec.Width - (diameter + 1), y, diameter, diameter);

                if ((corners & RoundedCorners.BottomLeft) == RoundedCorners.BottomLeft)
                    g.FillEllipse(b, x, y + rec.Height - (diameter + 1), diameter, diameter);
                else
                    g.FillRectangle(b, x, y + rec.Height - (diameter + 1), diameter, diameter);

                if ((corners & RoundedCorners.BottomRight) == RoundedCorners.BottomRight)
                    g.FillEllipse(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter, diameter);
                else
                    g.FillRectangle(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter, diameter);
            }
        }

        public enum RoundedCorners
        {
            None = 0x00,
            TopLeft = 0x02,
            TopRight = 0x04,
            BottomLeft = 0x08,
            BottomRight = 0x10,
            All = 0x1F
        }

        public static void DrawRoundedBorder(this Graphics g, Color color, Rectangle rec, int radius, int borderWidth, RoundedCorners corners)
        {
            using (Bitmap b = new Bitmap(rec.Width, rec.Height))
            {
                using (Graphics gb = Graphics.FromImage(b))
                {
                    var gfRec = new Rectangle(0, 0, rec.Width, rec.Height);
                    gb.Clear(Color.Green);

                    gb.DrawRoundedRectangle(color, gfRec, radius, corners);

                    gfRec.Height -= borderWidth << 1;
                    gfRec.Width -= borderWidth << 1;
                    gfRec.X += borderWidth;
                    gfRec.Y += borderWidth;
                    gb.DrawRoundedRectangle(Color.Green, gfRec, radius - borderWidth, corners);

                    var maskAttr = new ImageAttributes();
                    maskAttr.SetColorKey(Color.Green, Color.Green);

                    g.DrawImage(b, rec, 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, maskAttr);
                }
            }
        }
    }
}

Open in new window



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1.DrawRoundedRectangle(Color.Blue, button1, 10, RoundedCorners.All);
        }
    }
}

Open in new window


I have "button1" on the form. Now i want Round Corner for this. Can you please FIX the above program and make it working ?

Thanks
Avatar of wdosanjos
wdosanjos
Flag of United States of America image

Is using WPF instead of WinForms an option?  Round corners is a piece of cake in WPF.
Avatar of milani_lucie

ASKER

I am using Windows Forms using C# - Thanks
ASKER CERTIFIED SOLUTION
Avatar of jagssidurala
jagssidurala
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
No exactly what i want ....
  public static void DrawRoundedRectangle(this Graphics g, Color color, Rectangle rec, int radius,
                                            RoundedCorners corners)
    {
        using (var b = new SolidBrush(color))
        {
            int x = rec.X;
            int y = rec.Y;
            int diameter = radius * 2;
            var horiz = new Rectangle(x, y + radius, rec.Width, rec.Height - diameter);
            var vert = new Rectangle(x + radius, y, rec.Width - diameter, rec.Height);

            g.FillRectangle(b, horiz);
            g.FillRectangle(b, vert);

            if ((corners & RoundedCorners.TopLeft) == RoundedCorners.TopLeft)
                g.FillEllipse(b, x, y, diameter, diameter);
            else
                g.FillRectangle(b, x, y, diameter, diameter);

            if ((corners & RoundedCorners.TopRight) == RoundedCorners.TopRight)
                g.FillEllipse(b, x + rec.Width - (diameter + 1), y, diameter, diameter);
            else
                g.FillRectangle(b, x + rec.Width - (diameter + 1), y, diameter, diameter);

            if ((corners & RoundedCorners.BottomLeft) == RoundedCorners.BottomLeft)
                g.FillEllipse(b, x, y + rec.Height - (diameter + 1), diameter, diameter);
            else
                g.FillRectangle(b, x, y + rec.Height - (diameter + 1), diameter, diameter);

            if ((corners & RoundedCorners.BottomRight) == RoundedCorners.BottomRight)
                g.FillEllipse(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter, diameter);
            else
                g.FillRectangle(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter,
                                diameter);
        }
    }

    public enum RoundedCorners
    {
        None = 0x00,
        TopLeft = 0x02,
        TopRight = 0x04,
        BottomLeft = 0x08,
        BottomRight = 0x10,
        All = 0x1F
    }

Open in new window

That way you can specify which corners you want rounded.

And if you want to have a border around it, use this method:
public static void DrawRoundedBorder(this Graphics g, Color color, Rectangle rec,
                                         int radius, int borderWidth, RoundedCorners corners)
    {
        using (Bitmap b = new Bitmap(rec.Width, rec.Height))
        using (Graphics gb = Graphics.FromImage(b))
        {
            var gfRec = new Rectangle(0, 0, rec.Width, rec.Height);
            gb.Clear(Color.Green);

            gb.DrawRoundedRectangle(color, gfRec, radius, corners);

            gfRec.Height -= borderWidth << 1;
            gfRec.Width -= borderWidth << 1;
            gfRec.X += borderWidth;
            gfRec.Y += borderWidth;
            gb.DrawRoundedRectangle(Color.Green, gfRec, radius - borderWidth, corners);

            var maskAttr = new ImageAttributes();
            maskAttr.SetColorKey(Color.Green, Color.Green);

            g.DrawImage(b, rec, 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, maskAttr);
        }
    }

Open in new window