原谅连接:http://www.codeguru.com/cpp/w-p/ce/controls/article.php/c3509/CCeButtonST-v12.htm
The reference control for MFC flat buttons with text and icons. Give your CE applications a professional look!
Environment: eMbedded VC++ 3.0, Windows CE 3.0
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 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 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
n 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 following values:
// ST_ALIGN_HORIZ Icon on left, text on right
// ST_ALIGN_VERT Icon on top, text on bottom
// ST_ALIGN_HORIZ_RIGHT Icon on right, text on 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 rem/>k 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()
- 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.