Click here to Skip to main content
13,597,887 members
Click here to Skip to main content
Add your own
alternative version


164 bookmarked
Posted 19 Mar 2001
Licenced CPOL


, 9 Jul 2008
Rate this:
Please Sign up or sign in to vote.
A skinned button class with clipping region, tooltip and mouse tracking

Sample Image - sample.gif

With this class you can easily give a skin to your buttons in few steps:

  1. Add xSkinButton.cpp and xSkinButton.h to the project.
  2. Include xSkinButton.h in the header file where the controls are defined
  3. Create (or edit) a member variable for each button you want to customize as CxSkinButton. If the Class Wizard doesn't show the CxSkinButton type, select CButton and then edit the code manually.
  4. Add the bitmap resource for the buttons:
    • NORMAL bitmap: default button image.
    • DOWN bitmap: pushed button image.
    • OVER bitmap:(optional) image to shown when the mouse is over the button. If NULL, NORMAL bitmap will be used.
    • DISABLED bitmap: (optional) image for the disabled state. If NULL, NORMAL bitmap will be used.
    • FOCUS bitmap: (optional) image for the focused state. If NULL, NORMAL bitmap will be used.
    • MASK bitmap: (optional) clipping region. If you don't use the MASK, the button will be a rectangular owner-draw control. The default transparent color is RGB(255,255,255).
  5. In the window initialization add the CxSkinButton methods:
    BOOL CxSkinButtonDemoDlg::OnInitDialog()
    //    ...
    //    ...

    The SetTextColor and SetToolTipText are self explaining; SetSkin is:

    void CxSkinButton::SetSkin(UINT normal,UINT down,UINT over, 
                               UINT disabled, UINT focus,UINT mask, 
                               short drawmode, short border, 
                               short margin)
    • normal, down, over, disabled, focus, mask = bitmap resource IDs
    • drawmode = if mask is not NULL, this should be 0 (normal); else you can try 1 (stretch) or 2 (tiled).
    • border = if mask is not NULL or is not rectangular, this should be 0; else you can try 1 to draw the standard 3D border around the button.
    • margin = if mask is not NULL or is not rectangular, this should be 0; else you can try to change this value to draw a dotted rectangle over the button when the control has the focus.


  • The BS_OWNERDRAW style is added automatically, you don't need to set the "Owner draw" property in the resource editor.
  • only NORMAL and DOWN bitmaps are essential; OVER bitmap is a plus.
  • DISABLED bitmap is not necessary if the button is always enabled. You can also use the button text (automatically etched) to show the disabled state.
  • MASK bitmap is not necessary if the button is rectangular.
  • for rectangular buttons you should set the margin parameter greater than 0 (4 is a good choice), or use the FOCUS bitmap.
  • for rectangular buttons you can use 'flat' bitmaps and set the border parameter to 1. In this situation, NORMAL and DOWN bitmaps can also share the same resource.

Release History

v1.00 - 15/03/2001
- basic implementation and interface.
v1.10 - 28/03/2001
enhanced mouse tracking implementation (by Milan Gardian).
- SetCapture removed: accelerators now are dispatched.
- Double-click handling.
- Better behavior during "button-pressed" (mouse button down & holding) phase
v1.20 - 02/04/2001
- New CreateRgnFromBitmap() implementation. Mask bitmap now works in any display color mode, any mask color depth and any mask size.
v1.21 - 14/04/2001
- OnMouseLeave cast error fixed.
- Fixed FocusRect defect when OVER bitmap was NULL.
v1.30 - 25/04/2001
- Fixed CreateRgnFromBitmap failure under WinNT4.0
v1.40 - 29/06/2001
- check & radio button add on.
- added "focus" bitmap.
- fixed CreateRgnFromBitmap bug.
- fixed shortcut bug.
- fixed text drawing code.
v1.41 - 27/10/2001
- Fixed memory leakage in CreateRgnFromBitmap
v1.50 - 07/07/2008
- fixed memory leaks using SelectObject and GetDC (thanks to sachelis and Bernd Giesen)
- added SetToolTipColor (thanks to Mykel)


Win95,WinNT = Yes, requires IE3.0 or higher
Win98, WinME, W2k, WinXP = Yes

Thanks to all the Code Project developers!
Special thanks to:
Milan Gardian for mouse and keyboard tracking code.
Fable(at)aramszu(dot)net for ExtCreateRegion replacement code.
Rainer Mangold for radio-button and check-box code.
Andy Green and Cameron Epp for suggestions & debugging.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

No Biography provided

You may also be interested in...

Comments and Discussions

QuestionVC2010 + CxSkinButton : button do not show! Pin
Member 1073532825-May-16 20:57
memberMember 1073532825-May-16 20:57 
QuestionCheck and Radio created on the fly: Check uncheck Pin
maxspot27-Aug-15 0:33
membermaxspot27-Aug-15 0:33 
QuestionTab order of Button is not working Pin
KUMARRaju15-Nov-13 5:01
memberKUMARRaju15-Nov-13 5:01 
Questionhow transform the button in a Dialog with bitmap background Pin
wjcsj6-Jul-12 7:27
memberwjcsj6-Jul-12 7:27 
QuestionBackground is not transparent Pin
billqu_developer6-Jul-11 17:49
memberbillqu_developer6-Jul-11 17:49 
GeneralButtons dont work properly in stretch drawing mode Pin
quyps27-Apr-11 20:39
memberquyps27-Apr-11 20:39 
GeneralMemory leak in CxSkinButton::CreateRgnFromBitmap Pin
tHeWiZaRdOfDoS3-Dec-10 22:22
membertHeWiZaRdOfDoS3-Dec-10 22:22 
QuestionCreating a CxSkinButton on the fly? Pin
anuj.saluja3-Sep-10 21:48
memberanuj.saluja3-Sep-10 21:48 
AnswerRe: Creating a CxSkinButton on the fly? Pin
anuj.saluja10-Sep-10 9:47
memberanuj.saluja10-Sep-10 9:47 
GeneralThe dialog does not display Pin
JRCooper25-Jun-10 18:08
memberJRCooper25-Jun-10 18:08 
QuestionCan only add one button. PLS HELP Pin
AlexGvG8-May-10 7:32
memberAlexGvG8-May-10 7:32 
GeneralSetSkin BUG Pin
shaino20-Mar-09 19:58
membershaino20-Mar-09 19:58 
Generalwelcome back Pin
Teashirt29-Jul-08 17:33
memberTeashirt29-Jul-08 17:33 
Questionwhen using xSkinButton in MFC regular dll can not auto change state ! Pin
arler1-Nov-07 21:20
memberarler1-Nov-07 21:20 
Questionhow can add icon in bitmap? Pin
shenhua8829-May-07 15:07
membershenhua8829-May-07 15:07 
QuestionLicense to use? Pin
SRKarthik21-May-07 0:20
memberSRKarthik21-May-07 0:20 
GeneralMask Not Working Pin
siddharthfunda29-Mar-07 21:26
membersiddharthfunda29-Mar-07 21:26 
GeneralNeed nIDCtl Pin
blackbox797-Jan-06 19:44
memberblackbox797-Jan-06 19:44 
GeneralCxSkinButton does not draw text Pin
Stanislav Khatsko10-Nov-04 16:27
sussStanislav Khatsko10-Nov-04 16:27 
GeneralCxSkinButton does not draw text Pin
premiumclock10-Nov-04 16:27
memberpremiumclock10-Nov-04 16:27 
GeneralLeak in CreateRgnFromBitmap Pin
sachelis4-May-04 4:24
membersachelis4-May-04 4:24 
GeneralRe: Leak in CreateRgnFromBitmap Pin
sachelis4-May-04 4:46
membersachelis4-May-04 4:46 
GeneralRe: Leak in CreateRgnFromBitmap [modified] Pin
Bernd Giesen2-Jul-04 1:12
memberBernd Giesen2-Jul-04 1:12 
GeneralFlaw in DrawItem() method Pin
Bernd Giesen7-Apr-04 0:50
memberBernd Giesen7-Apr-04 0:50 
GeneralLoading image from disk Pin
WolfSupernova12-Nov-03 6:02
memberWolfSupernova12-Nov-03 6:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    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 | Cookies | Terms of Use | Mobile
Web02 | 2.8.180621.3 | Last Updated 9 Jul 2008
Article Copyright 2001 by Davide Pizzolato
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid