SoftechSoftware homepage
SoftechSoftware Email
<!------------------------------- STEP 3 ---------------------------><!-- Add the article text. Please use simple formatting (
,
etc) -->
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 dinamically created
- Each button can have its own mouse pointer
- Button is hilighted 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 staticallyWith 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 dynamicallyIn 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, <BR> 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, <BR> 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, <BR> 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, <BR> 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)
SetAlignSets the alignment type between icon/bitmap and text.
DWORD SetAlign(BYTE byAlign, BOOL bRepaint = TRUE)
SetPressedStyleSets the pressed style.
DWORD SetPressedStyle(BYTE byStyle, BOOL bRepaint = TRUE)
SetCheckSets the state of the checkbox.
If the button is not a checkbox, this function has no meaning.
DWORD SetCheck(int nCheck, BOOL bRepaint = TRUE)
GetCheckReturns the current state of the checkbox.
If the button is not a checkbox, this function has no meaning.
int GetCheck()
SetDefaultColorsSets all colors to a default value.
DWORD SetDefaultColors(BOOL bRepaint = TRUE)
SetColorSets the color to use for a particular state.
DWORD SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint = TRUE)
GetColorReturns the color used for a particular state.
DWORD GetColor(BYTE byColorIndex, COLORREF* crpColor)
OffsetColorThis 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)
SetAlwaysTrackSets the hilight logic for the button.
Applies only to flat buttons.
DWORD SetAlwaysTrack(BOOL bAlwaysTrack = TRUE)
SetBtnCursorSets the cursor to be used when the mouse is over the button.
DWORD SetBtnCursor(int nCursorId = NULL, BOOL bRepaint = TRUE)
DrawBorderSets if the button border must be drawn.
Applies only to flat buttons.
DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE)
DrawFlatFocusSets 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)
SetTooltipTextSets the text to show in the button tooltip.
void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE)
EnableBalloonTooltipEnables the tooltip to be displayed using the balloon style.
This function must be called before any call to SetTooltipText is made.
DWORD EnableBalloonTooltip()
ActivateTooltipEnables or disables the button tooltip.
void ActivateTooltip(BOOL bEnable = TRUE)
GetDefaultReturns if the button is the default button.
BOOL GetDefault()
DrawTransparentEnables the transparent mode.
Note: this operation is not reversible.
DrawTransparent should be called just after the button is created.
Do not use trasparent 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)
SetURLSets the URL that will be opened when the button is clicked.
DWORD SetURL(LPCTSTR lpszURL = NULL)
SetMenuAssociates 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)
SetMenuAssociates 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)
SetMenuCallbackSets 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)
SizeToContentResizes 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()
SetSoundSets 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)
OnDrawBackgroundThis 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)
OnDrawBorderThis 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)
GetVersionIReturns the class version as a short value.
static short GetVersionI()
GetVersionCReturns 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 indipendent 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 dinamically 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 IE
- 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 speeds 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
Some minor changes
- ST_CButton v1.0
First release
Remarks
The demo application shows nearly all the features of the CButtonST
class.
CButtonST
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 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 finds and fixes 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.