
What are Custom Controls
Well Custom Controls are nothing but just graphics. It is used to improve performance of your created application. Look Visual Studio, you can see MenuStrip different from basic controls in system. It looks better than just simple controls in .NET or any language.
So how to create custom controls
It is simple, just call graphics method and draw shapes correspond to the controls.
Consider I want to create a custom button, you know button is a rectangle in system,so just fill rectangle using that buttons co-ordinates (x,y,width,height) with LinearGradientBrush or SolidBrush in Paint() method in C#. C# provides ClientRectangle method to get all co-ordinates of the controls in which rectangle is used. There are many components in which rectangle is used like Button, Panel, CheckBox, TabControl, etc.
In this article I created sub classes with super classes of Button, Labels etc, so that I can drag and drop created custom controls into my form.
Requirements
- Visual Studio Professional 2013
- .NET Framework 4.5 or higher
Download the source code.
Start
Step 1: Start Visual Studio and create new Windows Forms Application in C#.
Step 2: Now go to Project, then Add Class
In opened dialog enter class name ButtonZ if you are creating a custom button or enter class name as you wish, just change class name in codes.
Step 3:
Copy and paste the following defined custom controls code into your created class code. If you created a class ButtonZ then copy and paste the following ButtonZ code.
Step 4: Now run your form and exit.
In ToolBox, you can see created ButtonZ controls as shown in above image 3. Drag and Drop ButtonZ into your form like basic controls and change values in Properties as shown in above image 2 like StartColor, EndColor, TextLocation_X, TextLocation_Y, Transparent1, Trnsparent2, etc.
In ToolBox, you can see created ButtonZ controls as shown in above image 3. Drag and Drop ButtonZ into your form like basic controls and change values in Properties as shown in above image 2 like StartColor, EndColor, TextLocation_X, TextLocation_Y, Transparent1, Trnsparent2, etc.
Step 5: Run your form.
Download the source code to view all custom controls.
Also to see Cutom Windows Form.
Dont know how to customize windows form in C# ?
Watch video for how to create custom controls in C# using following codes
C# Custom Controls Codes:
Custom Button:
A different shaped buttons like Rectangular,RoundRectangular,Circular etc.

Class Name: ButtonZ
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Drawing;
- using System.Data;
- using System.Windows.Forms;
- using System.Drawing.Drawing2D;
- namespace Custom_Controls_in_CS
- {
- public class ButtonZ : System.Windows.Forms.Button
- {
- Color clr1, clr2;
- private Color color1 = Color.DodgerBlue;
- private Color color2 = Color.MidnightBlue;
- private Color m_hovercolor1 = Color.Turquoise;
- private Color m_hovercolor2 = Color.DarkSlateGray;
- private int color1Transparent = 250;
- private int color2Transparent = 250;
- private Color clickcolor1 = Color.Yellow;
- private Color clickcolor2 = Color.Red;
- private int angle = 90;
- private int textX = 100;
- private int textY = 25;
- private String text = "";
- public Color buttonborder_1 = Color.FromArgb(220, 220, 220);
- public Color buttonborder_2 = Color.FromArgb(150, 150, 150);
- public Boolean showButtonText = true;
- public int borderWidth = 2;
- public Color borderColor = Color.Transparent;
- public enum ButtonsShapes
- {
- Rect,
- RoundRect,
- Circle
- }
- ButtonsShapes buttonShape;
- public ButtonsShapes ButtonShape
- {
- get { return buttonShape; }
- set
- {
- buttonShape = value; Invalidate();
- }
- }
- public String ButtonText
- {
- get { return text; }
- set { text = value; Invalidate(); }
- }
- public int BorderWidth
- {
- get { return borderWidth; }
- set { borderWidth = value; Invalidate(); }
- }
- void SetBorderColor(Color bdrColor)
- {
- int red = bdrColor.R - 40;
- int green = bdrColor.G - 40;
- int blue = bdrColor.B - 40;
- if (red < 0)
- red = 0;
- if (green < 0)
- green = 0;
- if (blue < 0)
- blue = 0;
- buttonborder_1 = Color.FromArgb(red, green, blue);
- buttonborder_2 = bdrColor;
- }
- public Color BorderColor
- {
- get { return borderColor; }
- set
- {
- borderColor = value;
- if (borderColor == Color.Transparent)
- {
- buttonborder_1 = Color.FromArgb(220, 220, 220);
- buttonborder_2 = Color.FromArgb(150, 150, 150);
- }
- else
- {
- SetBorderColor(borderColor);
- }
- }
- }
- public Color StartColor
- {
- get { return color1; }
- set { color1 = value; Invalidate(); }
- }
- public Color EndColor
- {
- get { return color2; }
- set { color2 = value; Invalidate(); }
- }
- public Color MouseHoverColor1
- {
- get { return m_hovercolor1; }
- set { m_hovercolor1 = value; Invalidate(); }
- }
- public Color MouseHoverColor2
- {
- get { return m_hovercolor2; }
- set { m_hovercolor2 = value; Invalidate(); }
- }
- public Color MouseClickColor1
- {
- get { return clickcolor1; }
- set { clickcolor1 = value; Invalidate(); }
- }
- public Color MouseClickColor2
- {
- get { return clickcolor2; }
- set { clickcolor2 = value; Invalidate(); }
- }
- public int Transparent1
- {
- get { return color1Transparent; }
- set
- {
- color1Transparent = value;
- if (color1Transparent > 255)
- {
- color1Transparent = 255;
- Invalidate();
- }
- else
- Invalidate();
- }
- }
- public int Transparent2
- {
- get { return color2Transparent; }
- set
- {
- color2Transparent = value;
- if (color2Transparent > 255)
- {
- color2Transparent = 255;
- Invalidate();
- }
- else
- Invalidate();
- }
- }
- public int GradientAngle
- {
- get { return angle; }
- set { angle = value; Invalidate(); }
- }
- public int TextLocation_X
- {
- get { return textX; }
- set { textX = value; Invalidate(); }
- }
- public int TextLocation_Y
- {
- get { return textY; }
- set { textY = value; Invalidate(); }
- }
- public Boolean ShowButtontext
- {
- get { return showButtonText; }
- set { showButtonText = value; Invalidate(); }
- }
- public ButtonZ()
- {
- this.Size = new Size(100, 40);
- this.BackColor = Color.Transparent;
- this.FlatStyle = FlatStyle.Flat;
- this.FlatAppearance.BorderSize = 0;
- this.FlatAppearance.MouseOverBackColor = Color.Transparent;
- this.FlatAppearance.MouseDownBackColor = Color.Transparent;
- text = this.Text;
- }
- //method mouse enter
- protected override void OnMouseEnter(EventArgs e)
- {
- base.OnMouseEnter(e);
- clr1 = color1;
- clr2 = color2;
- color1 = m_hovercolor1;
- color2 = m_hovercolor2;
- }
- //method mouse leave
- protected override void OnMouseLeave(EventArgs e)
- {
- base.OnMouseLeave(e);
- color1 = clr1;
- color2 = clr2;
- SetBorderColor(borderColor);
- }
- protected override void OnMouseDown(MouseEventArgs mevent)
- {
- base.OnMouseDown(mevent);
- color1 = clickcolor1;
- color2 = clickcolor2;
- int red = borderColor.R - 40;
- int green = borderColor.G - 40;
- int blue = borderColor.B - 40;
- if (red < 0)
- red = 0;
- if (green < 0)
- green = 0;
- if (blue < 0)
- blue = 0;
- buttonborder_2 = Color.FromArgb(red, green, blue);
- buttonborder_1 = borderColor;
- this.Invalidate();
- }
- protected override void OnMouseUp(MouseEventArgs mevent)
- {
- base.OnMouseUp(mevent);
- OnMouseLeave(mevent);
- color1 = clr1;
- color2 = clr2;
- SetBorderColor(borderColor);
- this.Invalidate();
- }
- protected override void OnLostFocus(EventArgs e)
- {
- base.OnLostFocus(e);
- color1 = clr1;
- color2 = clr2;
- this.Invalidate();
- }
- protected override void OnResize(EventArgs e)
- {
- base.OnResize(e);
- textX = (int)((this.Width / 3) - 1);
- textY = (int)((this.Height / 3) + 5);
- }
- //draw circular button function
- void DrawCircularButton(Graphics g)
- {
- Color c1 = Color.FromArgb(color1Transparent, color1);
- Color c2 = Color.FromArgb(color2Transparent, color2);
- Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle);
- g.FillEllipse(b, 5, 5, this.Width - 10, this.Height - 10);
- for (int i = 0; i < borderWidth; i++)
- {
- g.DrawArc(new Pen(new SolidBrush(buttonborder_1)), 5 + i, 5, this.Width - 10, this.Height - 10, 120, 180);
- g.DrawArc(new Pen(new SolidBrush(buttonborder_2)), 5, 5, this.Width - (10 + i), this.Height - 10, 300, 180);
- }
- if (showButtonText)
- {
- Point p = new Point(textX, textY);
- SolidBrush frcolor = new SolidBrush(this.ForeColor);
- g.DrawString(text, this.Font, frcolor, p);
- }
- b.Dispose();
- }
- //draw rectangular button function
- void DrawRectangularButton(Graphics g)
- {
- Color c1 = Color.FromArgb(color1Transparent, color1);
- Color c2 = Color.FromArgb(color2Transparent, color2);
- Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle);
- g.FillRectangle(b, 0, 0, this.Width, this.Height);
- for (int i = 0; i < borderWidth; i++)
- {
- g.DrawLine(new Pen(new SolidBrush(buttonborder_1)), this.Width - i, 0, this.Width - i, this.Height);
- g.DrawLine(new Pen(new SolidBrush(buttonborder_1)), 0, this.Height - i, this.Width, this.Height - i);
- g.DrawLine(new Pen(new SolidBrush(buttonborder_2)), 0 + i, 0, 0 + i, this.Height);
- g.DrawLine(new Pen(new SolidBrush(buttonborder_2)), 0, 0 + i, this.Width, i);
- }
- if (showButtonText)
- {
- Point p = new Point(textX, textY);
- SolidBrush frcolor = new SolidBrush(this.ForeColor);
- g.DrawString(text, this.Font, frcolor, p);
- }
- b.Dispose();
- }
- //draw round rectangular button function
- void DrawRoundRectangularButton(Graphics g)
- {
- Color c1 = Color.FromArgb(color1Transparent, color1);
- Color c2 = Color.FromArgb(color2Transparent, color2);
- Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle);
- Region region = new System.Drawing.Region(new Rectangle(5, 5, this.Width, this.Height));
- GraphicsPath grp = new GraphicsPath();
- grp.AddArc(5, 5, 40, 40, 180, 90);
- grp.AddLine(25, 5, this.Width - 25, 5);
- grp.AddArc(this.Width - 45, 5, 40, 40, 270, 90);
- grp.AddLine(this.Width - 5, 25, this.Width - 5, this.Height - 25);
- grp.AddArc(this.Width - 45, this.Height - 45, 40, 40, 0, 90);
- grp.AddLine(25, this.Height - 5, this.Width - 25, this.Height - 5);
- grp.AddArc(5, this.Height - 45, 40, 40, 90, 90);
- grp.AddLine(5, 25, 5, this.Height - 25);
- region.Intersect(grp);
- g.FillRegion(b, region);
- for (int i = 0; i < borderWidth; i++)
- {
- g.DrawArc(new Pen(buttonborder_1), 5 + i, 5 + i, 40, 40, 180, 90);
- g.DrawLine(new Pen(buttonborder_1), 25, 5 + i, this.Width - 25, 5 + i);
- g.DrawArc(new Pen(buttonborder_1), this.Width - 45 - i, 5 + i, 40, 40, 270, 90);
- g.DrawLine(new Pen(buttonborder_1), 5 + i, 25, 5 + i, this.Height - 25);
- g.DrawLine(new Pen(buttonborder_2), this.Width - 5 - i, 25, this.Width - 5 - i, this.Height - 25);
- g.DrawArc(new Pen(buttonborder_2), this.Width - 45 - i, this.Height - 45 - i, 40, 40, 0, 90);
- g.DrawLine(new Pen(buttonborder_2), 25, this.Height - 5 - i, this.Width - 25, this.Height - 5 - i);
- g.DrawArc(new Pen(buttonborder_2), 5 + i, this.Height - 45 - i, 40, 40, 90, 90);
- }
- if (showButtonText)
- {
- Point p = new Point(textX, textY);
- SolidBrush frcolor = new SolidBrush(this.ForeColor);
- g.DrawString(text, this.Font, frcolor, p);
- }
- b.Dispose();
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- switch (buttonShape)
- {
- case ButtonsShapes.Circle:
- this.DrawCircularButton(e.Graphics);
- break;
- case ButtonsShapes.Rect:
- this.DrawRectangularButton(e.Graphics);
- break;
- case ButtonsShapes.RoundRect:
- this.DrawRoundRectangularButton(e.Graphics);
- break;
- }
- }
- }
- }




Fawaz ChughtaiPosted Feb 26, 2021, 3:33 AM
"Well Custom Controls are nothing but just graphics" now thats the worst definition i found on internet for custom controls. its a whole new level of possibilities, not just graphic
Dennis TaylorPosted Aug 19, 2019, 1:40 PM
Another useless tutorial here on C# Corner. All you have told anyone is to copy and paste code. Not ONE word on how anything works.
ALI LONBARPosted Apr 8, 2019, 12:07 AM
Is it even for self-control?
karthik UPosted Oct 5, 2018, 12:53 AM
Very useful article...
Nilesh ShahPosted Feb 13, 2017, 5:47 PM
Good explanation for creating custom controls
pavankumar BottaPosted May 21, 2016, 11:22 AM
Nice article...
Mohammed AshrafPosted May 11, 2016, 7:59 AM
Good article...
Pritam ZopePosted Mar 15, 2016, 10:39 AM
In MenuStripZ code remove else part if you are getting trouble in it,remove lines 46-49,remove this part else { e.Item.ForeColor = Color.White; }
Sr KarthigaPosted Feb 8, 2016, 8:48 AM
Good one
Ehsan SajjadPosted Feb 8, 2016, 7:26 AM
Nice
Pritam ZopePosted Dec 26, 2015, 4:10 AM
Watch video how to create Custom Controls in Visual Studio using C#. https://www.youtube.com/watch?v=CFL3I3oMok4
Humayun Kabir MamunPosted Dec 23, 2015, 3:03 AM
Nice...
Mysura ReddyPosted Dec 23, 2015, 1:47 AM
Nice article sir.. but when we try to resize the button.. the button text position remains same.. button text not working like normal button control. please check that
Pritam ZopePosted Dec 22, 2015, 11:09 AM
Thanks...
Ankur MistryPosted Dec 22, 2015, 10:01 AM
Nice share
Kiranteja JallepalliPosted Dec 22, 2015, 8:57 AM
nice article..,keep posting
Santhakumar MunuswamyPosted Dec 22, 2015, 8:55 AM
Welcome
Santhakumar MunuswamyPosted Dec 22, 2015, 8:55 AM
Good Start