Click here to Skip to main content
Licence 
First Posted 28 Apr 2004
Views 168,243
Bookmarked 71 times

Custom Button with Color and Shape

By | 28 Apr 2004 | Article
Another simple custom button control with color and shape.

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

About the Author

Alan Zhao

Web Developer
www.LightspeedSigns.com
United States United States

Member

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.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralEmbedding in another project PinmemberTony Reynolds21:40 20 Jul '08  
GeneralRe: Embedding in another project PinmemberTony Reynolds22:46 21 Jul '08  
GeneralSlow click event handling? [modified] Pinmemberscoroop23:11 12 Nov '07  
GeneralRe: Slow click event handling? Pinmembervoiceofthemany2:39 15 Oct '09  
GeneralUsuage Pinmembersamsmithnz14:24 26 May '07  
GeneralRe: Usuage PinmemberAlan Zhao7:01 29 May '07  
GeneralRe: Usuage PinmemberSunshine Always0:06 11 Sep '07  
QuestionSmall Problem [modified] Pinmembersumit siddheshwar18:54 8 Aug '06  

Hi Alan,
 
I am having a small problem regarding drawing a filled rectangle. I want to draw rectangles with transpant color.
 
That is If I draw two rectangles with transparancy and if they overlap then both rectables should visible.
 


 
Sumit Siddheshwar

Generalneed Help to Novice Pinmemberavantaram11:01 4 Aug '06  
QuestionVB.Net? Pinmemberam_binu23:36 17 Jul '06  
GeneralNice Component PinmemberMahesh Sapre22:54 1 Jun '06  
GeneralDefaulting to Rectangle Pinmemberhoule8:14 13 Dec '05  
GeneralRe: Defaulting to Rectangle Pinmemberhoule8:22 13 Dec '05  
QuestionMissing file : ColorButtonDesigner? Pinmemberchinkuanyeh6:04 19 Dec '04  
GeneralHi Alan Pinmemberjjason_1814:54 14 Jul '04  
QuestionBack color? PinmemberKenneta11:04 27 May '04  
AnswerRe: Back color? PinsussTal pasi15:50 9 Sep '05  
QuestionShortcut keys? PinmemberJohn N20:20 18 May '04  
Generalslight issue with hover colors not releasing PinmemberMartyK20071:25 10 Sep '07  

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.

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