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

Creating a Glass Button using GDI+

By , 26 Mar 2013
 
Prize winner in Competition "Best C# article of Jan 2007"

Screenshots

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.

Introduction

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">

  <Border.Background>
    <LinearGradientBrush EndPoint="0.494,0.889" 
                         StartPoint="0.494,0.028">
      <GradientStop Color="#99FFFFFF" Offset="0" />

      <GradientStop Color="#33FFFFFF" Offset="1" />
    </LinearGradientBrush>
  </Border.Background>

</Border>

into:

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),
                          LinearGradientMode.Vertical))
  {
    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.

History

  • 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.

License

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
Member
I am a graduate of Wroclaw University of Technology, Poland.
 
My interests: reading, programming, drawing, Japan, yoga, tai-chi.
 
My website: www.lukesw.net

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

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionC++ / MFCmemberAndy Bantly17 Apr '13 - 5:27 
Buggood conversion from xaml to c#membersridhar.codeproject27 Mar '13 - 0:04 
GeneralMy vote of 5mvpKanasz Robert27 Sep '12 - 8:36 
QuestionGreat tool but unreadable code [modified]memberraminxtar17 Sep '12 - 1:46 
AnswerRe: Great tool but unreadable codememberLukasz Swiatkowski17 Sep '12 - 1:49 
QuestionA great articlememberMichael Haephrati1 Jul '12 - 7:15 
GeneralMy vote of 5memberKraeven1 May '12 - 23:58 
QuestionSometimes I get a red cross (red X) [modified]memberBjornLamers13 Mar '12 - 0:11 
QuestionniiiiiiiiiiiiicememberDes1re27 Feb '12 - 8:58 
Generalvery goooooooooooooood !memberkingtak25 Feb '12 - 22:47 
Questionhow did you change form colour to blackmembersamit198425 Nov '11 - 0:06 
AnswerRe: how did you change form colour to blackmemberLukasz Swiatkowski25 Nov '11 - 0:42 
QuestionHow to set image in MFC using resource Icons?memberChandrak Baxi10 Apr '11 - 20:19 
AnswerRe: How to set image in MFC using resource Icons?memberLukasz Swiatkowski10 Apr '11 - 21:09 
GeneralMy vote of 5memberdrummerboy051124 Mar '11 - 9:39 
GeneralMy vote of 5membercsrss21 Dec '10 - 9:02 
GeneralBrilliant :)memberAnt21003 Sep '10 - 11:21 
GeneralMy vote of 5memberlastrebel2 Sep '10 - 13:24 
GeneralThank YoumemberTim Grindley2 Mar '10 - 1:27 
GeneralRounded Cornersmemberedurveda18 Nov '09 - 9:18 
Generalback color transparencymemberMember 39534807 Jul '09 - 23:46 
GeneralRe: back color transparencymemberLukasz Swiatkowski8 Jul '09 - 3:16 
JokeThank youmemberMr_Coder18 Mar '09 - 18:50 
Generalits some how goodmemberzanzona11 Jan '09 - 23:07 
GeneralUsing a GlassButton as the appearance for a RadioButtonmemberMeestor_X28 Nov '08 - 10:59 

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

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130513.1 | Last Updated 27 Mar 2013
Article Copyright 2007 by Lukasz Swiatkowski
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid