Abstract
CButtonST
is a class derived from MFC CButton
class.
With this class, your applications can have standard buttons or new and modern buttons with "flat" style!
Main CButtonST
features are:
- Standard
CButton
properties - Text and icon (or bitmap) on the same button
- Only text or only icon/bitmap buttons
- Support for any size icons (max. 256 colors)
- Support for bitmaps
- Support for transparent buttons (for bitmapped applications)
- 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 support for multiline tooltips
- Built-in basic support for menus
- Built-in support for owner draw menus (using
BCMenu
class) - Built-in basic support for sounds
- Can be derived to create other button styles not supplied by default
- Full source code included!
- UNICODE compatible
- Cost-less implementation in existing applications
Click here to see a real-world application made using CButtonST
.
How to Integrate CButtonST in Your Application
In your project, include the following files:
Starting from version 3.5, CButtonST
now supports menus created using the BCMenu
class.
This 3rd party class gives you the ability to show menus using the most recent visual styles as seen on the latest Microsoft products or even in Windows XP.
Latest BCMenu
version can be found here.
To enable support for BCMenu
, the following two lines in BtnST.h must be enabled:
#define BTNST_USE_BCMENU
#include "BCMenu.h"
Also, the following files must be included in your project:
Note: Please note that when BCMenu support is enabled, the parameters accepted by the SetMenu method are different!
Starting from version 3.6, CButtonST
can play sounds on particular button states.
To enable support for sound, the following line in BtnST.h must be enabled:
#define BTNST_USE_SOUND
This gives access to the SetSound
method.
Create a CButtonST 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:
CButtonST m_btnOk;
Now attach the button to CButtonST
. For dialog-based applications, in your OnInitDialog
:
CDialog::OnInitDialog();
m_btnOk.SubclassDlgItem(IDOK, this);
Or in your DoDataExchange
:
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, m_btnOk);
Create a CButtonST Object Dynamically
In your application, create a member variable for the button. Please note that this variable is a pointer:
CButtonST* m_pbtnOk;
Now create the button. For dialog-based applications, in your OnInitDialog
:
CDialog::OnInitDialog();
m_pbtnOk = new CButtonST;
m_pbtnOk->Create(_T("&Ok"), WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP,
CRect(10, 10, 200, 100), this, IDOK);
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 multi-size resources)
- Assigns icons to the button
- Any previous icon or bitmap will be removed
DWORD SetIcon(int nIconIn, int nCxDesiredIn, int nCyDesiredIn,
int nIconOut = NULL, int nCxDesiredOut = 0, int nCyDesiredOut = 0)
SetIcon
(using resources)
- Assigns icons to the button
- Any previous icon or bitmap will be removed
DWORD SetIcon(int nIconIn, int nIconOut = NULL)
SetIcon
(using handles)
- Assigns icons to the button
- Any previous icon or bitmap will be removed
DWORD SetIcon(HICON hIconIn, HICON hIconOut = NULL)
SetBitmaps
(using resources)
- Assigns bitmaps to the button
- Any previous icon or bitmap will be removed
DWORD SetBitmaps(int nBitmapIn, COLORREF crTransColorIn,
int nBitmapOut = NULL, COLORREF crTransColorOut = 0)
SetBitmaps
(using handles)
- Assigns bitmaps to the button
- Any previous icon or bitmap will be removed
DWORD SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn,
HBITMAP hBitmapOut = NULL, COLORREF crTransColorOut = 0)
SetFlat
- Sets the button to have a standard or flat style
DWORD SetFlat(BOOL bFlat = TRUE, BOOL bRepaint = TRUE)
SetAlign
- Sets the alignment type between icon/bitmap and text
DWORD SetAlign(BYTE byAlign, BOOL bRepaint = TRUE)
SetPressedStyle
DWORD SetPressedStyle(BYTE byStyle, BOOL bRepaint = TRUE)
SetCheck
- Sets the state of the
checkbox
- If the button is not a
checkbox
, this function has no meaning
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
int GetCheck()
SetDefaultColors
- Sets all colors to a default value.
DWORD SetDefaultColors(BOOL bRepaint = TRUE)
SetColor
- Sets the color to use for a particular state
DWORD SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint = TRUE)
GetColor
- Returns the color used for a particular state
DWORD GetColor(BYTE byColorIndex, COLORREF* crpColor)
OffsetColor
- This function applies an offset to the RGB components of the specified color.
- This function can be seen as an easy way to make a color darker or lighter than its default value.
DWORD OffsetColor(BYTE byColorIndex, short shOffset, BOOL bRepaint = TRUE)
SetAlwaysTrack
- Sets the highlight logic for the button
- Applies only to flat buttons
DWORD SetAlwaysTrack(BOOL bAlwaysTrack = TRUE)
SetBtnCursor
- Sets the cursor to be used when the mouse is over the button
DWORD SetBtnCursor(int nCursorId = NULL, BOOL bRepaint = TRUE)
DrawBorder
- Sets if the button border must be drawn
- Applies only to flat buttons
DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE)
DrawFlatFocus
- Sets if the focus rectangle must be drawn for flat buttons
DWORD DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = TRUE)
SetTooltipText
(Using resource)
- Sets the text to show in the button tooltip
void SetTooltipText(int nText, BOOL bActivate = TRUE)
SetTooltipText
- Sets the text to show in the button tooltip
void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE)
EnableBalloonTooltip
- Enables the tooltip to be displayed using the balloon style
- This function must be called before any call to
SetTooltipText
is made
DWORD EnableBalloonTooltip()
ActivateTooltip
- Enables or disables the button tooltip
void ActivateTooltip(BOOL bEnable = TRUE)
GetDefault
- Returns if the button is the default button
BOOL GetDefault()
DrawTransparent
- Enables the transparent mode
- Note: This operation is not reversible.
DrawTransparent
should be called just after the button is created. - Do not use transparent buttons until you really need it (you have a bitmapped background) since each transparent button makes a copy in memory of its background.
- This may bring unnecessary memory use and execution overload.
void DrawTransparent(BOOL bRepaint = FALSE)
SetURL
- Sets the URL that will be opened when the button is clicked.
DWORD SetURL(LPCTSTR lpszURL = NULL)
SetMenu
- Associates a menu to the button
- The menu will be displayed clicking the button
- This method is available only if
BTNST_USE_BCMENU
is not defined
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint = TRUE)
SetMenu
- Associates a menu to the button
- The menu will be displayed clicking the button.
- This method is available only if
BTNST_USE_BCMENU
is defined. The menu will be handled by the BCMenu
class.
DWORD SetMenu(UINT nMenu,
HWND hParentWnd,
BOOL bWinXPStyle = TRUE,
UINT nToolbarID = NULL,
CSize sizeToolbarIcon = CSize(16, 16),
COLORREF crToolbarBk = RGB(255, 0, 255),
BOOL bRepaint = TRUE)
SetMenuCallback
- Sets the callback message that will be sent to the specified window just before the menu associated to the button is displayed
DWORD SetMenuCallback(HWND hWnd, UINT nMessage, LPARAM lParam = 0)
SizeToContent
- Resizes the button to the same size of the image
- To get good results, both the IN and OUT images should have the same size
void SizeToContent()
SetSound
- Sets the sound that must be played on particular button states
- This method is available only if
BTNST_USE_SOUND
is defined
DWORD SetSound(LPCTSTR lpszSound,
HMODULE hMod = NULL,
BOOL bPlayOnClick = FALSE,
BOOL bPlayAsync = TRUE)
OnDrawBackground
- This function is called every time the button background needs to be painted.
- If the button is in transparent mode, this function will NOT be called.
- This is a virtual function that can be rewritten in
CButtonST
-derived classes to produce a whole range of buttons not available by default.
virtual DWORD OnDrawBackground(CDC* pDC, CRect* 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
CButtonST
-derived classes to produce a whole range of buttons not available by default.
virtual DWORD OnDrawBorder(CDC* pDC, CRect* pRect)
GetVersionI
- Returns the class version as a short value.
static short GetVersionI()
GetVersionC
Returns the class version as a string
value.
static LPCTSTR GetVersionC()
History
- v3.9 (03/March/2003)
- Added support for Windows XP icons
- Added support for multi-size icons
- Added
BTNST_AUTO_DARKER
as a special value for second icon - Fixed the grayscale icon bug under Win9x/Me
- Class is now independent from
TTS_BALLOON
- v3.8 (25/November/2002)
- Added support for balloon tooltips
- Added
EnableBalloonTooltip
method OnDrawBorder virtual
method is now called also for non-flat buttons OnDrawBackground
and OnDrawBorder
now receive a correct CRect*
parameter - Fixed a little color bug
- Correctly works under MFC 7.0
- v3.7 (22/July/2002)
- Added
SetPressedStyle
method - Added
BTNST_INVALIDPRESSEDSTYLE
return value - Added
ST_ALIGN_OVERLAP
align style
- v3.6 (09/July/2002)
- Added
SetMenuCallback
method to give the ability to modify the associated menu just before is it displayed - Added basic support for sounds
- Added
SetSound
method - Added
ResizeToContent
method
- v3.5 (18/April/2002)
- Second icon can be automatically created in grayscale
- Added
BTNST_AUTO_GRAY
as a special value for second icon Bitmap
is draw disabled if the button is disabled - Added support for owner draw menus (using
BCMenu
class) - Added an overloaded
SetMenu
method to support BCMenu
class - Added
OffsetColor
method - Added support for
DDX_Check
calls
- v3.4 (17/October/2001)
- Added basic support for menus
- Added
SetMenu
method
- v3.3 (20/September/2001)
- Default button is now handled correctly
- Removed some rarely used methods
- Other optimizations
- v3.2 (14/June/2001)
- Added support for bitmaps
- Added
SetBitmaps
methods
- v2.6
- Added an overloaded version of the
SetIcon
method - Added
ST_ALIGN_HORIZ_RIGHT
flag to SetAlign
function - Fixed a bug when used in MFC extension DLLs
- Improved code for transparent buttons
- v2.5
- Support for 16x16 32x32 and 48x48 icons
- Buttons can be dynamically created
- Added support for transparent buttons
- Auto-detect default button (useful only for standard buttons)
- Auto-detect icon's dimension
- Added
DrawTransparent
method - Added
GetDefault
method - Modified
SetIcon
method
- v2.4
- Added support for tooltips
- Added
SetTooltipText
, ActivateTooltip
members - The "Double-click bug" should be fixed
- v2.3
- The class should now work from within a DLL
- The "Spacebar-Bug" should be fixed
- Added
RedrawWindow()
as the last line of SetIcon
member - The focus rectangle is now the last thing drawn
- The focus rectangle can now be drawn also for "flat" buttons
- Added
SetFlatFocus
, GetFlatFocus
members - Added
SetBtnCursor
member - Flat buttons can now work like in Internet Explorer
- v2.2
- Removed
SubclassDlgItem
member (this is transparent for the user) - Added
PreSubclassWindow
member (this allows DDX_
calls) - Added
SetDefaultActiveFgColor
, SetActiveFgColor
, GetActiveFgColor
members - Added
SetDefaultActiveBgColor
, SetActiveBgColor
, GetActiveBgColor
members - Added
SetDefaultInactiveFgColor
, SetInactiveFgColor
, GetInactiveFgColor
members - Added
SetDefaultInactiveBgColor
, SetInactiveBgColor
, GetInactiveBgColor
members - When the mouse is over a button, the focus now remains to the control that owns it!
- The flat buttons now work properly also in windows not derived from
CDialog
! - A memory DC (
CMemDC
) is used to draw the button. This should speed up the graphic operations.
- v2.1
- Support for two icons
- Modified
SetIcon
member - Added
SetShowText
/GetShowText
members - Fixed a bug dealing with the left mouse button
- Little optimizations
- v2.0
- Changed the class name for name convention
- Support for 256 colors icons
- Removed a stupid memory leak!
- Removed support for
CImagelists
- Documentation in HTML format
- ST_CButton v1.1
- ST_CButton v1.0
Remarks
The demo application shows nearly all the features of the CButtonST
class.
CButtonST
architecture makes it 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 CButtonST
demo application.
Thanks
Thanks very much to the dozens of users that are using CButtonST
in their applications.
Thanks also to all the people that find and fix bugs. Thanks!
If possible, please send a screenshot of your application where CButtonST
is used. These screenshots will be collected for personal interest.
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 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.