Click here to Skip to main content
15,867,308 members
Articles / Mobile Apps

CCeButtonST v1.2

Rate me:
Please Sign up or sign in to vote.
5.00/5 (17 votes)
18 Dec 2001CPOL4 min read 220.7K   4K   88   31
The reference control for MFC flat buttons with text and icons. Give your CE applications a professional look!

Sample Image Sample Image Sample Image

Abstract

CCeButtonST is a class derived from MFC CButton class.
With this class your CE applications can have standard buttons or new and modern buttons with "flat" style!

Main CCeButtonST features are:

  • Standard CButton properties
  • Text and icon on the same button
  • Only text or only icon buttons
  • Support for any size icons (max. 256 colors)
  • Standard or flat button style
  • Change runtime from flat to standard style
  • Buttons can have two images. One when the mouse is over the button and one when the mouse is outside (only for "flat" buttons)
  • Every color can be customized
  • Can be used via DDX_ calls
  • Can be used in DLLs
  • Can be dynamically created
  • Each button can have its own mouse pointer
  • Button is highlighted also when the window is inactive, like happens in Internet Explorer
  • Built-in basic support for menus
  • Can be derived to create other button styles not supplied by default
  • Full source code included!
  • UNICODE compatible
  • Windows CE v3.0 compatible
  • Cost-less implementation in existing applications

How to integrate CCeButtonST in your application

In your project include the following files:

  • CeBtnST.h
  • CeBtnST.cpp

Create a CCeButtonST object statically

With dialog editor create a standard button called, for example, IDOK (you don't need to make it owner drawn) and create a member variable for this button:

CCeButtonST m_btnOk;
Now attach the button to CCeButtonST. For dialog-based applications, in your OnInitDialog:
// Call the base-class method
CDialog::OnInitDialog();

// Create the IDOK button
m_btnOk.SubclassDlgItem(IDOK, this);
Or in your DoDataExchange:
// Call the base method
CDialog::DoDataExchange(pDX);

// Create the IDOK button
DDX_Control(pDX, IDOK, m_btnOk);

Create a CCeButtonST object dynamically

In your application, create a member variable for the button. Please note that this variable is a pointer:

CCeButtonST* m_pbtnOk;
Now create the button. For dialog-based applications, in your OnInitDialog:
// Call the base-class method
CDialog::OnInitDialog();

// Create the IDOK button
m_pbtnOk = new CCeButtonST;
m_pbtnOk->Create(_T("&Ok"), WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, CRect(10, 10, 200, 100), this, IDOK);
// Set the same font of the application
m_pbtnOk->SetFont(GetFont());
Remember to destroy the button or you will get a memory leak. This can be done, for example, in your class destructor:
if (m_pbtnOk) delete m_pbtnOk;

Class methods

SetIcon (using resources)
Assigns icons to the button.
Any previous icon will be removed.

// Parameters:
//      [IN]    nIconIn
//              ID number of the icon resource to show when the mouse is over the button.
//              Pass NULL to remove any icon from the button.
//      [IN]    sizeIn
//              Size of the icon.
//      [IN]    nIconOut
//              ID number of the icon resource to show when the mouse is outside the button.
//              Can be NULL.
//      [IN]    sizeOut
//              Size of the icon.
//      [IN]    nIconDis
//              ID number of the icon resource to show when the button is disabled.
//              Can be NULL.
//      [IN]    sizeDis
//              Size of the icon.
//
// Return value:
//      BTNST_OK
//          Function executed successfully.
//
DWORD SetIcon(int nIconIn, CSize sizeIn = CSize(32,32), int nIconOut = NULL, 
              CSize sizeOut = CSize(32,32), int nIconDis = NULL, CSize sizeDis = CSize(32,32))
SetIcon (using handles)
Assigns icons to the button.
Any previous icon will be removed.
// Parameters:
//     [IN]   hIconIn
//            Handle fo the icon to show when the mouse is over the button.
//            Pass NULL to remove any icon from the button.
//     [IN]   sizeIn
//            Size of the icon.
//     [IN]   hIconOut
//            Handle to the icon to show when the mouse is outside the button.
//            Can be NULL.
//     [IN]   sizeOut
//            Size of the icon.
//     [IN]   hIconDis
//            ID number of the icon resource to show when the button is disabled.
//            Can be NULL.
//     [IN]   sizeDis
//            Size of the icon.
//
// Return value:
//      BTNST_OK
//          Function executed successfully.
//
DWORD SetIcon(HICON hIconIn, CSize sizeIn = CSize(32,32), HICON hIconOut = NULL, 
              CSize sizeOut = CSize(32,32), HICON hIconDis = NULL, CSize sizeDis = CSize(32,32))
SetFlat
Sets the button to have a standard or flat style.
// Parameters:
//     [IN]   bFlat
//            If TRUE the button will have a flat style, else
//            will have a standard style.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD SetFlat(BOOL bFlat = TRUE, BOOL bRepaint = TRUE)
SetAlign
Sets the alignment type between icon and text.
// Parameters:
//     [IN]   byAlign
//            Alignment type. Can be one of the following values:
//            ST_ALIGN_HORIZ          Icon on the left, text on the right
//            ST_ALIGN_VERT           Icon on the top, text on the bottom
//            ST_ALIGN_HORIZ_RIGHT    Icon on the right, text on the left
//            By default, CCeButtonST buttons have ST_ALIGN_HORIZ alignment.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//     BTNST_INVALIDALIGN
//        Alignment type not supported.
//
DWORD SetAlign(BYTE byAlign, BOOL bRepaint = TRUE)
SetCheck
Sets the state of the checkbox.
If the button is not a checkbox, this function has no meaning.
// Parameters:
//     [IN]   nCheck
//            1 to check the checkbox.
//            0 to un-check the checkbox.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD SetCheck(int nCheck, BOOL bRepaint = TRUE)
GetCheck
Returns the current state of the checkbox.
If the button is not a checkbox, this function has no meaning.
// Return value:
//     The current state of the checkbox.
//        1 if checked.
//        0 if not checked or the button is not a checkbox.
//
int GetCheck()
SetDefaultColors
Sets all colors to a default value.
// Parameters:
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD SetDefaultColors(BOOL bRepaint = TRUE)
SetColor
Sets the color to use for a particular state.
// Parameters:
//     [IN]   byColorIndex
//            Index of the color to set. Can be one of the following values:
//            BTNST_COLOR_BK_IN       Background color when mouse is over the button
//            BTNST_COLOR_FG_IN       Text color when mouse is over the button
//            BTNST_COLOR_BK_OUT      Background color when mouse is outside the button
//            BTNST_COLOR_FG_OUT      Text color when mouse is outside the button
//            BTNST_COLOR_BK_FOCUS    Background color when the button is focused
//            BTNST_COLOR_FG_FOCUS    Text color when the button is focused
//     [IN]   crColor
//            New color.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//     BTNST_INVALIDINDEX
//        Invalid color index.
//
DWORD SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint = TRUE)
GetColor
Returns the color used for a particular state.
// Parameters:
//     [IN]   byColorIndex
//            Index of the color to get. Can be one of the following values:
//            BTNST_COLOR_BK_IN       Background color when mouse is over the button
//            BTNST_COLOR_FG_IN       Text color when mouse is over the button
//            BTNST_COLOR_BK_OUT      Background color when mouse is outside the button
//            BTNST_COLOR_FG_OUT      Text color when mouse is outside the button
//            BTNST_COLOR_BK_FOCUS    Background color when the button is focused
//            BTNST_COLOR_FG_FOCUS    Text color when the button is focused
//     [OUT]  crpColor
//            A pointer to a COLORREF that will receive the color.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//     BTNST_INVALIDINDEX
//        Invalid color index.
//
DWORD GetColor(BYTE byColorIndex, COLORREF* crpColor)
SetAlwaysTrack
Sets the hilight logic for the button.
Applies only to flat buttons.
// Parameters:
//     [IN]   bAlwaysTrack
//            If TRUE the button will be hilighted even if the window that owns it, is
//            not the active window.
//            If FALSE the button will be hilighted only if the window that owns it,
//            is the active window.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD SetAlwaysTrack(BOOL bAlwaysTrack = TRUE)
SetBtnCursor
Sets the cursor to be used when the mouse is over the button.
// Parameters:
//     [IN]   nCursorId
//            ID number of the cursor resource.
//            Pass NULL to remove a previously loaded cursor.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//     BTNST_INVALIDRESOURCE
//        Failed loading the specified resource.
//
DWORD SetBtnCursor(int nCursorId = NULL, BOOL bRepaint = TRUE)
DrawBorder
Sets if the button border must be drawn.
Applies only to flat buttons.
// Parameters:
//     [IN]   bDrawBorder
//            If TRUE the border will be drawn.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE)
DrawFlatFocus
Sets if the focus rectangle must be drawn for flat buttons.
// Parameters:
//     [IN]   bDrawFlatFocus
//            If TRUE the focus rectangle will be drawn also for flat buttons.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = TRUE)
GetDefault
Returns if the button is the default button.
// Return value:
//     TRUE
//        The button is the default button.
//     FALSE
//        The button is not the default button.
//
BOOL GetDefault()
SetURL
Sets the URL that will be opened when the button is clicked.
// Parameters:
//     [IN]   lpszURL
//            Pointer to a null-terminated string that contains the URL.
//            Pass NULL to removed any previously specified URL.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
DWORD SetURL(LPCTSTR lpszURL = NULL)
SetMenu
Associates a menu to the button.
The menu will be displayed clicking the button.
// Parameters:
//     [IN]   nMenu
//            ID number of the menu resource.
//            Pass NULL to remove any menu from the button.
//     [IN]   hParentWnd
//            Handle to the window that owns the menu.
//            This window receives all messages from the menu.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//     BTNST_INVALIDRESOURCE
//        Failed loading the specified resource.
//
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint = TRUE)
OnDrawBackground
This function is called every time the button background needs to be painted.
This is a virtual function that can be rewritten in CCeButtonST-derived classes
to produce a whole range of buttons not available by default.
// Parameters:
//     [IN]   pDC
//            Pointer to a CDC object that indicates the device context.
//     [IN]   pRect
//            Pointer to a CRect object that indicates the bounds of the
//            area to be painted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
virtual DWORD OnDrawBackground(CDC* pDC, LPCRECT pRect)
OnDrawBorder
This function is called every time the button border needs to be painted.
This is a virtual function that can be rewritten in CCeButtonST-derived classes
to produce a whole range of buttons not available by default.
// Parameters:
//     [IN]   pDC
//            Pointer to a CDC object that indicates the device context.
//     [IN]   pRect
//            Pointer to a CRect object that indicates the bounds of the
//            area to be painted.
//
// Return value:
//     BTNST_OK
//        Function executed successfully.
//
virtual DWORD OnDrawBorder(CDC* pDC, LPCRECT pRect)
GetVersionI
Returns the class version as a short value.
// Return value:
//     Class version. Divide by 10 to get actual version.
//
static short GetVersionI()
GetVersionC
Returns the class version as a string value.
// Return value:
//     Pointer to a null-terminated string containig the class version.
//
static LPCTSTR GetVersionC()

History

  • v1.2 (18/December/2001)
    Corrected a CE bug in OnLButtonDown
  • v1.1 (28/November/2001)
    Corrected the "DestroyCursor" problem
  • v1.0 (22/October/2001)
    First release

Remarks

The demo application shows nearly all the features of the CCeButtonST class.
It includes project settings for all the emulators included in Visual C++ eMbedded Tools v3.0 plus
settings to compile and run on the Advantech PCM-4823 single board computer.
CCeButtonST architecture makes possible to produce a whole range of buttons not available by default.
If someone implements new button styles I will be happy to include his code in
the next CCeButtonST demo application.

Disclaimer

THE SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE RISK OF USING THIS SOFTWARE.

License

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


Written By
Web Developer
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

 
QuestionBigger Icons Pin
klay1-Aug-10 15:32
klay1-Aug-10 15:32 
Generalthank you! Pin
JOYZML26-Dec-09 4:23
JOYZML26-Dec-09 4:23 
GeneralThanks a lot! Pin
Lysy9515-Jun-09 4:28
Lysy9515-Jun-09 4:28 
GeneralBUG? if use it for lots of buttons,then program dead! Pin
rengdongzwf24-May-07 18:53
rengdongzwf24-May-07 18:53 
QuestionIcon does not center Pin
Kunchongji3-Aug-06 19:07
Kunchongji3-Aug-06 19:07 
GeneralDemo project problems Pin
advatronix19-Dec-05 14:11
advatronix19-Dec-05 14:11 
QuestionHow change Font meu in Pocket Pc 2003 Pin
nguyenthanhtung15-Feb-05 15:22
nguyenthanhtung15-Feb-05 15:22 
QuestionChange Font Menu? Pin
nguyenthanhtung31-Jan-05 17:21
nguyenthanhtung31-Jan-05 17:21 
GeneralBTNST_COLOR_BK_OUT seems not take effect... Pin
Member 84865013-Nov-04 6:06
Member 84865013-Nov-04 6:06 
GeneralCCeButtonST and Default Buttons Pin
Hadi Rezaee1-Oct-04 22:14
Hadi Rezaee1-Oct-04 22:14 
GeneralMemory Leakeage Pin
SMPCHRIS22-Jun-04 8:25
SMPCHRIS22-Jun-04 8:25 
GeneralIcon size under NT Pin
SMPCHRIS14-Jun-04 2:28
SMPCHRIS14-Jun-04 2:28 
GeneralIcon Pin
GuilhemMtp1-Apr-04 20:56
GuilhemMtp1-Apr-04 20:56 
GeneralRe: Icon Pin
flyball8-Sep-04 19:24
flyball8-Sep-04 19:24 
GeneralProblems with the control Pin
Simone197620-Nov-03 23:26
Simone197620-Nov-03 23:26 
QuestionHow to use in in Win 32 API based program Pin
annum2-Oct-03 9:52
annum2-Oct-03 9:52 
AnswerRe: How to use in in Win 32 API based program Pin
Davide Calabro2-Oct-03 11:08
Davide Calabro2-Oct-03 11:08 
GeneralRe: How to use in in Win 32 API based program Pin
Anonymous2-Oct-03 11:27
Anonymous2-Oct-03 11:27 
GeneralRe: How to use in in Win 32 API based program Pin
annum2-Oct-03 11:31
annum2-Oct-03 11:31 
thanks!.

So is there a way of making cool buttons like this especially the one with green background and left/right arrows, using win32 only.

If there are some websites or links I will very much appreciate the help

GeneralRe: How to use in in Win 32 API based program Pin
Member 119490821-Apr-05 23:07
Member 119490821-Apr-05 23:07 
GeneralProblems Changing Font Pin
Andrea Benini (Ben)8-Apr-03 23:16
Andrea Benini (Ben)8-Apr-03 23:16 
GeneralRe: Problems Changing Font Pin
Davide Calabro9-Apr-03 21:47
Davide Calabro9-Apr-03 21:47 
GeneralRe: Problems Changing Font Pin
Andrea Benini (Ben)10-Apr-03 5:01
Andrea Benini (Ben)10-Apr-03 5:01 
Generalsos Pin
buaafang5-Apr-03 15:20
buaafang5-Apr-03 15:20 
GeneralHelp Pin
Mariz27-Mar-03 7:30
Mariz27-Mar-03 7:30 

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.