Click here to Skip to main content
Click here to Skip to main content

Creating a Glass Button using GDI+

, 26 Mar 2013 CPL
Rate this:
Please Sign up or sign in to vote.
How to create an animating glass button using only GDI+ (and not using WPF)


Sample application using a standard glass button with image.

Sample application using a standard glass button with image.

The same application, but this time it has a customized glass button.

Sample application using a customized glass button.

MFC application which hosts four glass buttons.

MFC application which hosts four glass buttons.


I bet you have already seen animated task buttons in Windows Vista. I have. I was wondering how to create a similar control. Fortunately, I found a web page which describes how to do that using the Microsoft Expression Blend (Creating a Glass Button: The Complete Tutorial). The glass button (and thus the whole application) created with the Microsoft Expression Blend requires .NET Framework 3.0 to run. Because some people cannot or do not want to use .NET Framework 3.0 yet, I have decided to rewrite that cool control using only GDI+ so it would work with .NET Framework 2.0.

"Converting" XAML to C# (GDI+)

The tutorial from the page mentioned above was easy to complete, and the generated XAML code was so understandable that there were no big issues with a "conversion."

For example, I have translated the following code:

<Border HorizontalAlignment="Stretch" 
        Margin="0,0,0,0" x:Name="shine" 
        Width="Auto" CornerRadius="4,4,0,0">

    <LinearGradientBrush EndPoint="0.494,0.889" 
      <GradientStop Color="#99FFFFFF" Offset="0" />

      <GradientStop Color="#33FFFFFF" Offset="1" />



using (GraphicsPath bh = CreateTopRoundRectangle(rect2, 4))
  int opacity = 0x99;
  if (isPressed) opacity = (int)(.4f * opacity + .5f);
  using (Brush br = new LinearGradientBrush(rect2, 
                          Color.FromArgb(opacity, shineColor),
                          Color.FromArgb(opacity / 3, shineColor),
    g.FillPath(br, bh);

(This is only a fragment of the DrawButtonBackground method.)

Even the animation of a hovered button was easily obtained by using the Timer class. Unfortunately, an animation is not quite smooth when a glass button is quite big.

How to use the GlassButton class?

The GlassButton class derives from the Button class so it can be used in the same way. Displaying an image on a glass button is also supported now. Even the guidelines work fine in the Visual Studio's form designer.


  • 1.3.2 (02.11.2008) — Important! This is the last “standalone” version of the control. The next version will be included in a new project hosted at CodePlex.
    • Fixed a bug that caused the button's image to be disposed in certain situations.
  • 1.3.1 (27.10.2008)
    • The source code is now available both in C# and VB.NET.
    • Minor bugs fixed.
  • 1.3 (19.11.2007)
    • The image is grayed when the button is disabled.
    • Added property 'FadeOnFocus'.
    • Improved performance.
    • Minor bugs fixed.
  • 1.2 (31.03.2007)
    • The 'disabled' look differs from the 'enabled' one.
    • Added some 'PropertyChange' events.
    • Improved performance.
    • Splitted source code from compiled library and demo application.
    • Added MFC demo application.
    • Added toolbox bitmap.
    • Minor bugs fixed.
  • 1.1.1 (22.02.2007)
    • Minor bugs fixed.
  • 1.1 (21.02.2007)
    • Added images support.
  • 1.0 (19.02.2007)
    • First version.


This article, along with any associated source code and files, is licensed under The Common Public License Version 1.0 (CPL)


About the Author

Lukasz Swiatkowski
Software Developer
Poland Poland
I am a graduate of Wroclaw University of Technology, Poland.

My interests: reading, programming, drawing, Japan, yoga, tai-chi.

My websites:,

Comments and Discussions

QuestionHow to import in my project? PinmemberMember 1099147112-Jan-15 6:23 
AnswerRe: How to import in my project? PinmemberLukasz Swiatkowski13-Jan-15 22:18 
SuggestionHave 5 from me PinmemberMarkBoreham7-Jan-14 22:58 
QuestionC++ / MFC PinmemberAndy Bantly17-Apr-13 6:27 
AnswerRe: C++ / MFC PinmemberChris Mayyer23-May-13 0:34 
GeneralRe: C++ / MFC PinmemberAndy Bantly23-May-13 2:31 
Buggood conversion from xaml to c# Pinmembersridhar.codeproject27-Mar-13 1:04 
GeneralMy vote of 5 PinmvpKanasz Robert27-Sep-12 9:36 
QuestionGreat tool but unreadable code [modified] Pinmemberraminxtar17-Sep-12 2:46 
AnswerRe: Great tool but unreadable code PinmemberLukasz Swiatkowski17-Sep-12 2:49 
QuestionA great article PinmemberMichael Haephrati1-Jul-12 8:15 
GeneralMy vote of 5 PinmemberKraeven2-May-12 0:58 
QuestionSometimes I get a red cross (red X) [modified] PinmemberBjornLamers13-Mar-12 1:11 
Questionniiiiiiiiiiiiice PinmemberDes1re27-Feb-12 9:58 
Generalvery goooooooooooooood ! Pinmemberkingtak25-Feb-12 23:47 
Questionhow did you change form colour to black Pinmembersamit198425-Nov-11 1:06 
AnswerRe: how did you change form colour to black PinmemberLukasz Swiatkowski25-Nov-11 1:42 
QuestionHow to set image in MFC using resource Icons? PinmemberChandrak Baxi10-Apr-11 21:19 
AnswerRe: How to set image in MFC using resource Icons? PinmemberLukasz Swiatkowski10-Apr-11 22:09 
GeneralMy vote of 5 Pinmemberdrummerboy051124-Mar-11 10:39 
GeneralMy vote of 5 Pinmembercsrss21-Dec-10 10:02 
GeneralBrilliant :) PinmemberAnt21003-Sep-10 12:21 
GeneralMy vote of 5 Pinmemberlastrebel2-Sep-10 14:24 
GeneralThank You PinmemberTim Grindley2-Mar-10 2:27 
GeneralRounded Corners Pinmemberedurveda18-Nov-09 10:18 
Generalback color transparency PinmemberMember 39534808-Jul-09 0:46 

i used your control in an vc++ appliction in a dialog class. i created an instance of the control like this

CWinFormsControl<Glass::GlassButton> m_button1;

i then assciated the control to a static text control like this.

DDX_ManagedControl(pDX, IDC_GLASS_BUTTON, m_button1);

i have set the backcolor of the glassbutton to transparent.

the problem here is that when i set the brush color of the dialog on WM_CTLCOLOR evernt,
the background color of the button does not change to the color of the brush but instead draws the default dialog color in the area under the button.

GeneralRe: back color transparency PinmemberLukasz Swiatkowski8-Jul-09 4:16 
JokeThank you PinmemberMr_Coder18-Mar-09 19:50 
Generalits some how good Pinmemberzanzona12-Jan-09 0:07 
GeneralUsing a GlassButton as the appearance for a RadioButton PinmemberMeestor_X28-Nov-08 11:59 
GeneralRe: Using a GlassButton as the appearance for a RadioButton PinmemberLukasz Swiatkowski12-Jan-09 12:49 
QuestionRe: Using a GlassButton as the appearance for a RadioButton Pinmemberhimoobd14-May-09 2:39 
QuestionImage Animation PinmemberDanish Sultan9-Nov-08 21:46 
AnswerRe: Image Animation PinmemberLukasz Swiatkowski12-Jan-09 12:13 
General[Message Removed] PinmemberKatekortez25-Oct-08 9:56 
GeneralExcellent! Pinmembergrt3kl19-Aug-08 12:27 
GeneralRe: Excellent! PinmvpLukasz Swiatkowski2-Sep-08 9:17 
GeneralVB Version Pinmemberraing325-Jun-08 14:42 
GeneralRe: VB Version PinmvpLukasz Swiatkowski26-Jun-08 0:47 
GeneralAwesome Button! PinmemberEngr4867-Jun-08 9:22 
GeneralRe: Awesome Button! PinmvpLukasz Swiatkowski26-Jun-08 0:37 
QuestionLicence PinmemberJulian-w17-May-08 4:03 
AnswerRe: Licence PinmvpLukasz Swiatkowski17-May-08 7:10 
GeneralRe: Licence PinmemberJulian-w17-May-08 8:18 
GeneralRe: Licence PinmemberJulian-w18-May-08 3:50 
GeneralRe: Licence PinmvpLukasz Swiatkowski18-May-08 3:59 
GeneralDrawToBitmap PinmemberJacob Shepherd20-Apr-08 21:41 
GeneralRe: DrawToBitmap PinmvpLukasz Swiatkowski21-Apr-08 6:33 
GeneralRe: DrawToBitmap PinmemberJacob Shepherd28-Apr-08 15:11 
GeneralRe: DrawToBitmap PinmvpLukasz Swiatkowski29-Apr-08 8:42 

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
Web03 | 2.8.150414.1 | Last Updated 27 Mar 2013
Article Copyright 2007 by Lukasz Swiatkowski
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid