Click here to Skip to main content
15,868,016 members
Articles / Desktop Programming / MFC

CxShadeButton

Rate me:
Please Sign up or sign in to vote.
4.90/5 (59 votes)
4 Nov 2001CPOL4 min read 544.2K   10.2K   165   83
An owner-drawn button class that gives a professional look to your buttons.

Sample Image - sample.jpg

Introduction

With this class you can easily give a professional look to your buttons in a few steps. No bitmap resources are needed - all bitmaps are generated at runtime. Parts of the code come from the CxSkinButton article. The goal is to replace the standard buttons, check boxes, and radio buttons with minimal modifications in the application code.

  1. Add "xShadeButton.cpp" and "xShadeButton.h" to the project.
  2. Include "xShadeButton.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 CxShadeButton. If the Class Wizard doesn't show the CxShadeButton type, select CButton and then edit the code manually.
  4. In the window initialization, add the CxShadeButton methods:
  5. C++
    BOOL CxShadeButtonDemoDlg::OnInitDialog()
    {
        //    ...
        m_btn1.SetTextColor(RGB(255,0,0));
        m_btn1.SetToolTipText("Button1");
        m_btn1.SetShade(SHS_DIAGSHADE,8,10,5,RGB(55,255,55));
        //    ...

CxShadeButton Class Members and Operations

CxShadeButton is derived from CButton. The BS_OWNERDRAW style is added automatically, you don't need to set the "Owner draw" property in the resource editor. You can change some styles (flat, push-like, text alignment, group,...) using the resource editor, however not all the styles are currently supported. If you change the aspect of the button at runtime, to avoid flicker, first call the functions that don't cause invalidation (like SetShade, SetIcon, or SetFont) and than invalidate the button, for example with SetWindowText, or directly with Invalidate.

C++
void SetShade(UINT shadeID=0, BYTE granularity=8,
              BYTE highlight=10,BYTE coloring=0,COLORREF color=0);
    Generates the button bitmaps.
    Important
  • shadeID: can be one of these effects:
    • SHS_NOISE = 0
    • SHS_DIAGSHADE = 1
    • SHS_HSHADE = 2
    • SHS_VSHADE = 3
    • SHS_HBUMP = 4
    • SHS_VBUMP = 5
    • SHS_SOFTBUMP =6
    • SHS_HARDBUMP = 7
    • SHS_METAL = 8
  • granularity: this parameter adds a uniform noise to the button bitmaps. A good value is from 5 to 20; 0 to disable the effect. The noise has a positive effect because it hides the palette steps.
  • highlight: sets the highlight level when the mouse is over the button. A good value is from 5 to 20; 0 to disable the effect.
  • coloring: sets the percentage of color to blend in the button palette. The value can range from 0 to 100; 0 to disable the effect.
  • color: if coloring is greater than zero, color is mixed with the standard button colors.
  • Remarks: the coloring and color parameters should be used carefully to guarantee a good aspect in all the situations.

void SetToolTipText(CString s, CString sDown="");
    Sets or changes the tool tip text.
    nice
  • s: string displayed in normal state.
  • sDown: (optional) specifies a second text to be displayed when a check box or radio button is checked.
COLORREF SetTextColor(COLORREF new_color);
    Sets or changes the button text color. Returns the previous button text color.
    nice
void SetIcon(UINT nIcon, UINT nIconAlign=BS_CENTER, UINT nIconDown=0, 
             UINT nIconHighLight=0);
    Similar to the BS_ICON style.
    nice
  • nIcon: ID number of the icon resource.
  • nIconAlign: icon alignment, can be one of the following values:
    • BS_CENTER
    • BS_LEFT
    • BS_RIGHT
  • nIconDown: (optional) ID number of the icon resource displayed when the button is checked.
  • nIconHighLight: (optional) ID number of the icon resource displayed when the mouse pointer is over the button.
  • Remarks: the button text is automatically placed so that the icon and the text don't overlap.

C++
bool SetFont(CString sFontName, long lSize=0, long 
             lWeight=400, BYTE bItalic=0, BYTE bUnderline=0);
bool SetFont(LOGFONT* pNewStyle); / LOGFONT* GetFont();
    Changes the text font.
    nice
  • sFontName : specifies the typeface name of the font.
  • lSize : (optional) text height.
  • lWeight : (optional) text weight can range from 0 to 1000; 100=thin, 300=light, 400=normal, 700=bold.
  • bItalic : (optional) italic style.
  • bUnderline : (optional) underline style.
  • Remarks: use GetFont/SetFont with a LOGFONT structure to get/set the complete attributes of the font. GetFont returns NULL if the button is using the default system font.

void SetTextAlign(UINT nTextAlign=BS_CENTER);
    Sets the text alignment
    optional
  • nTextAlign: button text alignment, can be one of the following values:
    • BS_CENTER
    • BS_LEFT
    • BS_RIGHT
void SetFlat(bool bFlag);
    Sets the border style:
    optional
  • bFlag can have the following values:
    • FALSE = standard 3D border.
    • TRUE = flat border.

Compatibility

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

Acknowledgement

Thanks to all the CodeProject developers! Special thanks to:

  • Milan Gardian for mouse and keyboard tracking code.
  • Davide Calabro for CButtonST code snippets.
  • Rainer Mangold for radio-button and check-box code.
  • Jeremy Davis, Andre Brogli, Richard Cunday, Shanker Chandrabose, Luis, Gilad, Rui Lopes, Tom Archer, Tommy Svensson, David Scambler, Orioli Alessandro, João Filipe de Castro Ferreira, Jesper Kinnås, and Derek Lakin for suggestions, debugging, and support.

Release History

  • v1.00 - 12/05/2001
    • Basic implementation and interface.
  • v1.10 - 23/05/2001
    • Added text shift on button down.
    • Fixed many CxDib bugs.
    • Fixed SHS_HARDBUMP bug.
    • Added icon support.
    • Added text alignment.
    • Added flat style.
  • v1.20 - 23/06/2001
    • Fixed keyboard shortcut bug.
    • Check box and radio button add on.
    • Second icon and second tooltip add on.
    • Memory DC for painting operations.
  • v1.30 - 03/08/2001
    • Fixed SetIcon bug.
    • Added Font support.
  • v1.40 - 23/09/2001
    • Fixed memory leakage bug in DrawItem() and SetIcon().
    • Fixed second tooltip initialization bug.
    • Fixed OnLButtonUp() problem with drag and drop.
    • Added multiline tooltip support.
  • v1.41 - 4/11/2001
    • Fixed memory leakage bug in SetIcon() and in the destructor.
    • Added third icon for highlighted state.

License

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


Written By
Italy Italy
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: No DDX_Radio support Pin
deepakgupta11114-May-03 4:50
deepakgupta11114-May-03 4:50 
QuestionReally Like The Shades..How to apply to Dialog face?? Pin
Mustafa24-May-02 7:07
Mustafa24-May-02 7:07 
GeneralProblems!! Pin
22-Mar-02 12:32
suss22-Mar-02 12:32 
GeneralMultiline Setting Pin
Mark Kozel8-Feb-02 8:45
Mark Kozel8-Feb-02 8:45 
GeneralRe: Multiline Setting Pin
Anonymous24-Jul-02 10:45
Anonymous24-Jul-02 10:45 
QuestionTAB? Pin
17-Jan-02 2:45
suss17-Jan-02 2:45 
AnswerRe: TAB? Pin
Davide Pizzolato17-Jan-02 10:28
Davide Pizzolato17-Jan-02 10:28 
GeneralRe: TAB? Pin
Ravi Bhavnani18-Feb-02 12:33
professionalRavi Bhavnani18-Feb-02 12:33 
GeneralRe: TAB? Pin
Davide Pizzolato18-Feb-02 20:10
Davide Pizzolato18-Feb-02 20:10 
GeneralProblems using CxShadeButton with ResizableLib Pin
João Filipe de Castro Ferreira5-Nov-01 3:17
João Filipe de Castro Ferreira5-Nov-01 3:17 
GeneralRe: Problems using CxShadeButton with ResizableLib Pin
Paolo Messina5-Nov-01 11:03
professionalPaolo Messina5-Nov-01 11:03 
GeneralRe: Problems using CxShadeButton with ResizableLib Pin
Davide Pizzolato5-Nov-01 12:20
Davide Pizzolato5-Nov-01 12:20 
GeneralDownload Pin
FilthyZombie4-Nov-01 23:23
FilthyZombie4-Nov-01 23:23 
GeneralRe: Download Pin
Davide Pizzolato5-Nov-01 7:48
Davide Pizzolato5-Nov-01 7:48 
GeneralRe: Download Pin
FilthyZombie5-Nov-01 22:23
FilthyZombie5-Nov-01 22:23 
GeneralProblems in CxShadeButton::DrawItem() function !! Pin
Cris22-Oct-01 8:01
Cris22-Oct-01 8:01 
GeneralRe: Problems in CxShadeButton::DrawItem() function !! Pin
Davide Pizzolato22-Oct-01 12:03
Davide Pizzolato22-Oct-01 12:03 
GeneralSomething wrong with useing SetIcon()! Pin
22-Oct-01 2:59
suss22-Oct-01 2:59 
GeneralRe: Something wrong with useing SetIcon()! Pin
Davide Pizzolato22-Oct-01 12:02
Davide Pizzolato22-Oct-01 12:02 
GeneralRe: Something wrong with useing SetIcon()! Pin
22-Oct-01 16:39
suss22-Oct-01 16:39 
GeneralFixed SetIcon() Pin
Davide Pizzolato23-Oct-01 8:46
Davide Pizzolato23-Oct-01 8:46 
GeneralRe: Fixed SetIcon() Pin
26-Oct-01 4:13
suss26-Oct-01 4:13 
GeneralMemory allocation/free conflict Pin
Hal Director25-Sep-01 16:53
Hal Director25-Sep-01 16:53 
QuestionHow to set the default shade effect Pin
Davide Pizzolato24-Sep-01 7:42
Davide Pizzolato24-Sep-01 7:42 
QuestionLooks great! How about CPropertySheet? Pin
21-Sep-01 10:18
suss21-Sep-01 10:18 

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.