Click here to Skip to main content
6,595,854 members and growing! (17,699 online)
Email Password   helpLost your password?
Desktop Development » Button Controls » General     Intermediate

Images on XP-Style Buttons

By Michael Ganss

A .NET Windows Forms Button using Visual Styles on Windows XP, that can display an image.
C#, VC6, VC7, VC7.1.NET 1.1, Win2K, WinXP, Win2003, MFC, VS.NET2003, Dev
Posted:17 Feb 2004
Updated:27 Oct 2004
Views:279,680
Bookmarked:160 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
32 votes for this article.
Popularity: 6.09 Rating: 4.05 out of 5
4 votes, 12.5%
1

2
2 votes, 6.3%
3
7 votes, 21.9%
4
19 votes, 59.4%
5

Introduction

One thing I love best about XP is the capability to have themed controls. You can even load new themes much like it's been possible with most window managers for the X Window System.

These themed controls can be used with .NET Windows Forms by supplying a manifest and � for some controls like Button � setting the FlatStyle property to FlatStyle.System.

Unfortunately, setting the FlatStyle property of a Button control to FlatStyle.System makes it impossible to display an image on the face of the button. Somehow, setting the Image property has no effect on these controls.

Background

A number of workarounds have been proposed, e.g., this one by MalteseFalcon. All approaches known to me use owner-drawn buttons to mimic the built in visual styles of XP but provide no ability to match third party visual styles.

The code snippet in this article makes it possible to have images on your XP-themed buttons while retaining the capability to adapt to custom visual styles.

The capability to draw controls using different visual styles was introduced by Microsoft with comctl32.dll, version 6, which has been shipping with the newest versions of Windows, i.e., Windows XP and Windows Server 2003. With this version, a number of new API calls have been introduced, among them is BCM_SETIMAGELIST which assigns an image list to a button control. The code in this article uses Platform Invocation Services (PInvoke) to use the BCM_SETIMAGELIST message.

The BCM_SETIMAGELIST message has another interesting property: if you supply more than one image in the image list, you can have the button display a different image for each of a number of states the button is in:

  • Normal
  • Hover
  • Pressed
  • Disabled
  • Focused

This behavior might be achieved using events as well, but using BCM_SETIMAGELIST, you get it without having to code the event handlers.

Using the code

The code wraps the System.Windows.Forms.Button class in a class called ImageButton. You can use this class just like a normal button except for the additional overloaded method SetImage. If you just want to display an image on the face of the button, you can use the method like this:

Bitmap searchBitmap = new Bitmap("Search_16X16_32bpp.png");
ImageButton searchImageButton = new ImageButton();
searchImageButton.SetImage(searchBitmap);
...

If you want more control over the alignment, padding, or set images for different button states, use the overloaded methods:

Bitmap goBitmap = new Bitmap("Go_48X48_32bpp.png");
Bitmap goHoverBitmap = new Bitmap("Go!_48X48_32bpp.png");
Bitmap goDisabledBitmap = new Bitmap("GoDisabled_48X48_32bpp.png");
ImageButton goImageButton = new ImageButton();
goImageButton.SetImage(goBitmap, goHoverBitmap, goBitmap, goDisabledBitmap, 
                       goBitmap, ImageButton.Alignment.Center);
...

Images with alpha channel are supported.

Points of Interest

Windows Forms ImageLists have a bug: if you add an Image to an ImageList, the alpha channel is lost. Therefore, the class in this article uses a workaround by resetting the pixel values of the Image after it has been added to the ImageList.

The demo image shows some buttons with the default XP visual style (top) as well as the custom Chaninja RC5 visual style (bottom).

The images in the demo are from the Qute collection originally drawn for Mozilla Firebird by Arvid "Quadrone" Axelsson.

History

  • February 24, 2004: Version 1.1.
    • Added alignment for non-XP-style buttons.
    • Added speed-up to Bitmap copying, contributed by Richard Deeming.
  • February 26, 2004: Version 1.2.
    • Added image scaling suggested by nxtwothou.
  • February 28, 2004: Version 1.3.
    • Added bicubic interpolation for rescaling.
  • May 8, 2004: Version 1.4.
    • Added drop down arrow capability
  • May 14, 2004: Version 1.5.
    • Added ThemedImage property for the designer.
    • Added auto-generation of disabled image (thanks to Carlos Leyva).
  • October 25, 2004: Version 1.6.
    • Fixed themes on/off detection bug (thanks to Leonid Kunin).
    • Added NAnt file.
    • Added I18n :-)

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

Michael Ganss


Member
Michael Ganss is Managing Director of UpdateStar. UpdateStar offers complete protection from PC vulnerability caused by outdated software. The award-winning UpdateStar offers comfortable software installation, uninstallation, and keeps all of your programs up-to-date. UpdateStar recognizes more than 135,000 software products and lets you know once an update is available for you - for optimized PC security.
Occupation: Software Developer (Senior)
Company: UpdateStar
Location: Germany Germany

Other popular Button Controls articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 72 (Total in Forum: 72) (Refresh)FirstPrevNext
GeneralBroke out of the box! PinmemberAl_S4:34 1 Sep '09  
GeneralEasier Method PinmemberEvit-Morningstar6:42 5 Jul '07  
NewsCode is obsolete for .NET 2.0... Pinmemberxlouk5:13 7 Jul '06  
GeneralRe: Code is obsolete for .NET 2.0... Pinmemberearnshaw19430:54 3 Apr '07  
GeneralRe: Code is obsolete for .NET 2.0... Pinmemberxlouk2:24 3 Apr '07  
GeneralRe: Code is obsolete for .NET 2.0... PinmemberJagdPanther6:37 14 Aug '07  
GeneralRe: Code is obsolete for .NET 2.0... [modified] PinmemberDotNetInterest8:15 13 Aug '07  
GeneralRe: Code is obsolete for .NET 2.0... Pinmemberxlouk23:32 19 Aug '07  
Generalbugs in DropdownButton PinmemberPunCha4:28 21 Apr '06  
GeneralI could not get it work with VS 2003 pro Pinmemberriscy6:49 25 Feb '06  
GeneralRe: I could not get it work with VS 2003 pro PinmemberMichael Ganss0:38 27 Feb '06  
General"pushed" button style for a dropdown button ? Pinmemberjoebarthib5:58 6 Dec '05  
GeneralRe: "pushed" button style for a dropdown button ? PinmemberMichael Ganss23:08 6 Dec '05  
GeneralRe: pushed button style for a dropdown button ? Pinmemberjoebarthib0:20 8 Dec '05  
GeneralImageCheckBox Pinmemberwolfgang_hg5:31 28 Nov '05  
QuestionNo XP Style PinmemberGreg Osborne6:57 26 Oct '05  
AnswerRe: No XP Style PinmemberMichael Ganss22:55 26 Oct '05  
QuestionProblem after using ImageButton PinmemberRagulKumar18:28 29 Aug '05  
AnswerRe: Problem after using ImageButton PinmemberMichael Ganss23:00 29 Aug '05  
QuestionRe: Problem after using ImageButton PinsussAnonymous20:05 31 Aug '05  
AnswerRe: Problem after using ImageButton PinmemberMichael Ganss23:15 31 Aug '05  
AnswerRe: Problem after using ImageButton PinmemberGreg Osborne7:01 26 Oct '05  
GeneralGDI-Exceptions due to unsafe code ?! Pinmemberwolfgang_hg6:51 25 Feb '05  
GeneralRe: GDI-Exceptions due to unsafe code ?! PinmemberMichael Ganss7:02 25 Feb '05  
GeneralRe: GDI-Exceptions due to unsafe code ?! PinmemberJoel Lucsy10:14 3 Mar '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 27 Oct 2004
Editor: Nishant Sivakumar
Copyright 2004 by Michael Ganss
Everything else Copyright © CodeProject, 1999-2009
Web19 | Advertise on the Code Project