Click here to Skip to main content
11,496,146 members (656 online)
Click here to Skip to main content

Custom Button with Color and Shape

, 28 Apr 2004 193.9K 5.5K 76
Another simple custom button control with color and shape.
The site is currently in read-only mode for maintenance. Posting of new items will be available again shortly.

Introduction

This is my first C# custom control. Please download the demo program and have a click.

Features

Users are able to define the:

  • Color
    • Border color
    • Normal color A
    • Normal color B
    • Hover color A
    • Hover color B
  • GradientStyle
    • Horizontal
    • Vertical
    • ForwardDiagonal
    • BackwardDiagonal
  • ButtonStyle
    • Rectangle
    • Ellipse
  • SmoothingQuality
    • None(crispy)
    • HighSpeed
    • AntiAlias
    • HighQuality

You can actually feel the clicks with its flat style!

Key Techniques Used in OnPaint()

SmoothingMode

//
// set SmoothingMode
//
switch (_SmoothingQuality)
{
    case SmoothingQualities.None:
        e.Graphics.SmoothingMode = SmoothingMode.Default;
        break;
    case SmoothingQualities.HighSpeed:
        e.Graphics.SmoothingMode = SmoothingMode.HighSpeed;
        break;
    case SmoothingQualities.AntiAlias:
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        break;
    case SmoothingQualities.HighQuality:
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
        break;
}

LinearGradientMode

//
// mode declaration
//
LinearGradientMode mode;
//
// set LinearGradientMode
//
switch (_GradientStyle)
{
    case GradientStyles.Horizontal:
        mode = LinearGradientMode.Horizontal;
        break;
    case GradientStyles.Vertical:
        mode = LinearGradientMode.Vertical;
        break;
    case GradientStyles.ForwardDiagonal:
        mode = LinearGradientMode.ForwardDiagonal;
        break;
    case GradientStyles.BackwardDiagonal:
        mode = LinearGradientMode.BackwardDiagonal;
        break;
    default:
        mode = LinearGradientMode.Vertical;
        break;
}

LinearGradientBrush

//
// brush declaration
//
LinearGradientBrush brush;
switch (_State)
{
    case _States.Normal:
        brush = new LinearGradientBrush(newRect, 
                _NormalColorA, _NormalColorB, mode);
        switch (_ButtonStyle)
        {
            case ButtonStyles.Rectangle:
                e.Graphics.FillRectangle(brush, newRect);
                e.Graphics.DrawRectangle(new 
                    Pen(_NormalBorderColor, 1), newRect);
                break;
            case ButtonStyles.Ellipse:
                e.Graphics.FillEllipse(brush, newRect);
                e.Graphics.DrawEllipse(new 
                  Pen(_NormalBorderColor, 1), newRect);
                break;

        }
        e.Graphics.DrawString(this.Text, base.Font, 
           new SolidBrush(base.ForeColor), textX, textY);
        break;

    case _States.MouseOver:
        brush = new LinearGradientBrush(newRect, 
              _HoverColorA, _HoverColorB, mode);
        switch (_ButtonStyle)
        {
            case ButtonStyles.Rectangle:
                e.Graphics.FillRectangle(brush, newRect);
                e.Graphics.DrawRectangle(new 
                     Pen(_HoverBorderColor, 1), newRect);
                break;
            case ButtonStyles.Ellipse:
                e.Graphics.FillEllipse(brush, newRect);
                e.Graphics.DrawEllipse(new 
                   Pen(_HoverBorderColor, 1), newRect);
                break;

        }
        e.Graphics.DrawString(this.Text, base.Font, 
          new SolidBrush(base.ForeColor), textX, textY);
        break;

    case _States.Clicked:
        brush = new LinearGradientBrush(newRect, 
              _HoverColorA, _HoverColorB, mode);
        switch (_ButtonStyle)
        {
            case ButtonStyles.Rectangle:
                e.Graphics.FillRectangle(brush, newRect);
                e.Graphics.DrawRectangle(new 
                     Pen(_HoverBorderColor, 2), newRect);
                break;
            case ButtonStyles.Ellipse:
                e.Graphics.FillEllipse(brush, newRect);
                e.Graphics.DrawEllipse(new 
                   Pen(_HoverBorderColor, 2), newRect);
                break;

        }
        e.Graphics.DrawString(this.Text, base.Font, 
          new SolidBrush(base.ForeColor), 
          textX + 1, textY + 1);
        break;
}

My Other Control Project

Feedbacks

Please vote for this article.

And email me or leave your messages if you have:

  • bug reports
  • code improvements
  • any comments or suggestions.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Alan Zhao
Web Developer www.LightspeedSigns.com
United States United States
Hi, my name is Alan Zhao. I live in Glens Falls, NY. Say hi to me if you see me one day.

also visit me at www.LinkGone.com - Make your long URLs easy to read, remember and reuse.

Comments and Discussions

 
GeneralMy vote of 1 Pin
Nathan Ferreira22-Aug-14 5:32
memberNathan Ferreira22-Aug-14 5:32 
GeneralKeep up with good job man Pin
Nipuna Sandas6-Aug-14 1:00
memberNipuna Sandas6-Aug-14 1:00 
QuestionHere is something interesting regarding shaped buttons Pin
murathankocan3-Feb-13 23:38
membermurathankocan3-Feb-13 23:38 
GeneralMy vote of 1 Pin
Long Nguyen (xyz)7-Aug-12 21:18
memberLong Nguyen (xyz)7-Aug-12 21:18 
GeneralEmbedding in another project Pin
Tony Reynolds20-Jul-08 22:40
memberTony Reynolds20-Jul-08 22:40 
GeneralRe: Embedding in another project Pin
Tony Reynolds21-Jul-08 23:46
memberTony Reynolds21-Jul-08 23:46 
GeneralSlow click event handling? [modified] Pin
scoroop13-Nov-07 0:11
memberscoroop13-Nov-07 0:11 
GeneralRe: Slow click event handling? Pin
voiceofthemany15-Oct-09 3:39
membervoiceofthemany15-Oct-09 3:39 
GeneralUsuage Pin
samsmithnz26-May-07 15:24
membersamsmithnz26-May-07 15:24 
GeneralRe: Usuage Pin
Alan Zhao29-May-07 8:01
memberAlan Zhao29-May-07 8:01 
GeneralRe: Usuage Pin
Sunshine Always11-Sep-07 1:06
memberSunshine Always11-Sep-07 1:06 
QuestionSmall Problem [modified] Pin
sumit siddheshwar8-Aug-06 19:54
membersumit siddheshwar8-Aug-06 19:54 
Generalneed Help to Novice Pin
avantaram4-Aug-06 12:01
memberavantaram4-Aug-06 12:01 
QuestionVB.Net? Pin
am_binu18-Jul-06 0:36
memberam_binu18-Jul-06 0:36 
GeneralNice Component Pin
Mahesh Sapre1-Jun-06 23:54
memberMahesh Sapre1-Jun-06 23:54 
GeneralDefaulting to Rectangle Pin
houle13-Dec-05 9:14
memberhoule13-Dec-05 9:14 
GeneralRe: Defaulting to Rectangle Pin
houle13-Dec-05 9:22
memberhoule13-Dec-05 9:22 
QuestionMissing file : ColorButtonDesigner? Pin
chinkuanyeh19-Dec-04 7:04
memberchinkuanyeh19-Dec-04 7:04 
GeneralHi Alan Pin
jjason_1814-Jul-04 15:54
memberjjason_1814-Jul-04 15:54 
QuestionBack color? Pin
Kenneta27-May-04 12:04
memberKenneta27-May-04 12:04 
AnswerRe: Back color? Pin
Tal pasi9-Sep-05 16:50
sussTal pasi9-Sep-05 16:50 
QuestionShortcut keys? Pin
John N18-May-04 21:20
memberJohn N18-May-04 21:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150520.1 | Last Updated 29 Apr 2004
Article Copyright 2004 by Alan Zhao
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid