| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559 | 
							- #include "stdafx.h"
 
- #include "BtnST.h"
 
- #ifdef	BTNST_USE_SOUND
 
- #pragma comment(lib, "winmm.lib")
 
- #include <Mmsystem.h>
 
- #endif
 
- #ifdef _DEBUG
 
- #define new DEBUG_NEW
 
- #undef THIS_FILE
 
- static char THIS_FILE[] = __FILE__;
 
- #endif
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CButtonST
 
- // Mask for control's type
 
- #define BS_TYPEMASK SS_TYPEMASK
 
- #ifndef	TTM_SETTITLE
 
- #define TTM_SETTITLEA           (WM_USER + 32)  // wParam = TTI_*, lParam = char* szTitle
 
- #define TTM_SETTITLEW           (WM_USER + 33)  // wParam = TTI_*, lParam = wchar* szTitle
 
- #ifdef	UNICODE
 
- #define TTM_SETTITLE            TTM_SETTITLEW
 
- #else
 
- #define TTM_SETTITLE            TTM_SETTITLEA
 
- #endif
 
- #endif
 
- #ifndef	TTS_BALLOON
 
- #define	TTS_BALLOON		0x40
 
- #endif
 
- CButtonST::CButtonST()
 
- {
 
- 	m_bIsPressed		= FALSE;
 
- 	m_bIsFocused		= FALSE;
 
- 	m_bIsDisabled		= FALSE;
 
- 	m_bMouseOnButton	= FALSE;
 
- 	FreeResources(FALSE);
 
- 	// Default type is "flat" button
 
- 	m_bIsFlat = TRUE;
 
- 	// Button will be tracked also if when the window is inactive (like Internet Explorer)
 
- 	m_bAlwaysTrack = TRUE;
 
-   
 
- 	// By default draw border in "flat" button 
 
- 	m_bDrawBorder = TRUE; 
 
-   
 
- 	// By default icon is aligned horizontally
 
- 	m_byAlign = ST_ALIGN_HORIZ; 
 
- 	// By default use usual pressed style
 
- 	SetPressedStyle(BTNST_PRESSED_LEFTRIGHT, FALSE);
 
-   
 
- 	// By default, for "flat" button, don't draw the focus rect
 
- 	m_bDrawFlatFocus = FALSE;
 
- 	// By default the button is not the default button
 
- 	m_bIsDefault = FALSE;
 
- 	// Invalid value, since type still unknown
 
- 	m_nTypeStyle = BS_TYPEMASK;
 
- 	// By default the button is not a checkbox
 
- 	m_bIsCheckBox = FALSE;
 
- 	m_nCheck = 0;
 
- 	// Set default colors
 
- 	SetDefaultColors(FALSE);
 
- 	// No tooltip created
 
- 	m_ToolTip.m_hWnd = NULL;
 
- 	m_dwToolTipStyle = 0;
 
- 	// Do not draw as a transparent button
 
- 	m_bDrawTransparent = FALSE;
 
- 	m_pbmpOldBk = NULL;
 
- 	// No URL defined
 
- 	SetURL(NULL);
 
- 	// No cursor defined
 
- 	m_hCursor = NULL;
 
- 	// No associated menu
 
- #ifndef	BTNST_USE_BCMENU
 
- 	m_hMenu = NULL;
 
- #endif
 
- 	m_hParentWndMenu = NULL;
 
- 	m_bMenuDisplayed = FALSE;
 
- 	m_bShowDisabledBitmap = TRUE;
 
- 	m_ptImageOrg.x = 3;
 
- 	m_ptImageOrg.y = 3;
 
- 	// No defined callbacks
 
- 	::ZeroMemory(&m_csCallbacks, sizeof(m_csCallbacks));
 
- #ifdef	BTNST_USE_SOUND
 
- 	// No defined sounds
 
- 	::ZeroMemory(&m_csSounds, sizeof(m_csSounds));
 
- #endif
 
- } // End of CButtonST
 
- CButtonST::~CButtonST()
 
- {
 
- 	m_font.DeleteObject();
 
- 	// Restore old bitmap (if any)
 
- 	if (m_dcBk.m_hDC && m_pbmpOldBk)
 
- 	{
 
- 		m_dcBk.SelectObject(m_pbmpOldBk);
 
- 	} // if
 
- 	FreeResources();
 
- 	// Destroy the cursor (if any)
 
- 	if (m_hCursor) ::DestroyCursor(m_hCursor);
 
- 	// Destroy the menu (if any)
 
- #ifdef	BTNST_USE_BCMENU
 
- 	if (m_menuPopup.m_hMenu)	m_menuPopup.DestroyMenu();
 
- #else
 
- 	if (m_hMenu)	::DestroyMenu(m_hMenu);
 
- #endif
 
- } // End of ~CButtonST
 
- BEGIN_MESSAGE_MAP(CButtonST, CButton)
 
-     //{{AFX_MSG_MAP(CButtonST)
 
- 	ON_WM_SETCURSOR()
 
- 	ON_WM_KILLFOCUS()
 
- 	ON_WM_MOUSEMOVE()
 
- 	ON_WM_SYSCOLORCHANGE()
 
- 	ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
 
- 	ON_WM_ACTIVATE()
 
- 	ON_WM_ENABLE()
 
- 	ON_WM_CANCELMODE()
 
- 	ON_WM_GETDLGCODE()
 
- 	ON_WM_CTLCOLOR_REFLECT()
 
- 	//}}AFX_MSG_MAP
 
- #ifdef	BTNST_USE_BCMENU
 
- 	ON_WM_MENUCHAR()
 
- 	ON_WM_MEASUREITEM()
 
- #endif
 
- 	ON_MESSAGE(BM_SETSTYLE, OnSetStyle)
 
- 	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
 
- 	ON_MESSAGE(BM_SETCHECK, OnSetCheck)
 
- 	ON_MESSAGE(BM_GETCHECK, OnGetCheck)
 
- END_MESSAGE_MAP()
 
- void CButtonST::FreeResources(BOOL bCheckForNULL)
 
- {
 
- 	if (bCheckForNULL)
 
- 	{
 
- 		// Destroy icons
 
- 		// Note: the following two lines MUST be here! even if
 
- 		// BoundChecker says they are unnecessary!
 
- 		if (m_csIcons[0].hIcon)	::DestroyIcon(m_csIcons[0].hIcon);
 
- 		if (m_csIcons[1].hIcon)	::DestroyIcon(m_csIcons[1].hIcon);
 
- 		// Destroy bitmaps
 
- 		if (m_csBitmaps[0].hBitmap)	::DeleteObject(m_csBitmaps[0].hBitmap);
 
- 		if (m_csBitmaps[1].hBitmap)	::DeleteObject(m_csBitmaps[1].hBitmap);
 
- 		// Destroy mask bitmaps
 
- 		if (m_csBitmaps[0].hMask)	::DeleteObject(m_csBitmaps[0].hMask);
 
- 		if (m_csBitmaps[1].hMask)	::DeleteObject(m_csBitmaps[1].hMask);
 
- 	} // if
 
- 	::ZeroMemory(&m_csIcons, sizeof(m_csIcons));
 
- 	::ZeroMemory(&m_csBitmaps, sizeof(m_csBitmaps));
 
- } // End of FreeResources
 
- void CButtonST::PreSubclassWindow() 
 
- {
 
- 	UINT nBS;
 
- 	nBS = GetButtonStyle();
 
- 	// Set initial control type
 
- 	m_nTypeStyle = nBS & BS_TYPEMASK;
 
- 	// Check if this is a checkbox
 
- 	if (nBS & BS_CHECKBOX) m_bIsCheckBox = TRUE;
 
- 	// Set initial default state flag
 
- 	if (m_nTypeStyle == BS_DEFPUSHBUTTON)
 
- 	{
 
- 		// Set default state for a default button
 
- 		m_bIsDefault = TRUE;
 
- 		// Adjust style for default button
 
- 		m_nTypeStyle = BS_PUSHBUTTON;
 
- 	} // If
 
- 	// You should not set the Owner Draw before this call
 
- 	// (don't use the resource editor "Owner Draw" or
 
- 	// ModifyStyle(0, BS_OWNERDRAW) before calling PreSubclassWindow() )
 
- 	ASSERT(m_nTypeStyle != BS_OWNERDRAW);
 
- 	// Switch to owner-draw
 
- 	ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
 
- #if 1 // »ñÈ¡³õʼ×ÖÌå;
 
- 	CFont* cf = GetFont();
 
- 	if(cf !=NULL)
 
- 	{
 
- 		cf->GetObject(sizeof(m_lf),&m_lf);
 
- 	}
 
- 	else
 
- 	{
 
- 		GetObject(GetStockObject(SYSTEM_FONT),sizeof(m_lf),&m_lf);
 
- 	}
 
- 	ReconstructFont();
 
- #endif
 
- 	CButton::PreSubclassWindow();
 
- } // End of PreSubclassWindow
 
- UINT CButtonST::OnGetDlgCode() 
 
- {
 
- 	UINT nCode = CButton::OnGetDlgCode();
 
- 	// Tell the system if we want default state handling
 
- 	// (losing default state always allowed)
 
- 	nCode |= (m_bIsDefault ? DLGC_DEFPUSHBUTTON : DLGC_UNDEFPUSHBUTTON);
 
- 	return nCode;
 
- } // End of OnGetDlgCode
 
- BOOL CButtonST::PreTranslateMessage(MSG* pMsg) 
 
- {
 
- 	InitToolTip();
 
- 	m_ToolTip.RelayEvent(pMsg);
 
- 	
 
- 	if (pMsg->message == WM_LBUTTONDBLCLK)
 
- 		pMsg->message = WM_LBUTTONDOWN;
 
- 	return CButton::PreTranslateMessage(pMsg);
 
- } // End of PreTranslateMessage
 
- HBRUSH CButtonST::CtlColor(CDC* pDC, UINT nCtlColor) 
 
- {
 
- 	return (HBRUSH)::GetStockObject(NULL_BRUSH); 
 
- } // End of CtlColor
 
- void CButtonST::OnSysColorChange() 
 
- {
 
- 	CButton::OnSysColorChange();
 
- 	m_dcBk.DeleteDC();
 
- 	m_bmpBk.DeleteObject();	
 
- 	SetDefaultColors();
 
- } // End of OnSysColorChange
 
- LRESULT CButtonST::OnSetStyle(WPARAM wParam, LPARAM lParam)
 
- {
 
- 	UINT nNewType = (wParam & BS_TYPEMASK);
 
- 	// Update default state flag
 
- 	if (nNewType == BS_DEFPUSHBUTTON)
 
- 	{
 
- 		m_bIsDefault = TRUE;
 
- 	} // if
 
- 	else if (nNewType == BS_PUSHBUTTON)
 
- 	{
 
- 		// Losing default state always allowed
 
- 		m_bIsDefault = FALSE;
 
- 	} // if
 
- 	// Can't change control type after owner-draw is set.
 
- 	// Let the system process changes to other style bits
 
- 	// and redrawing, while keeping owner-draw style
 
- 	return DefWindowProc(BM_SETSTYLE,
 
- 		(wParam & ~BS_TYPEMASK) | BS_OWNERDRAW, lParam);
 
- } // End of OnSetStyle
 
- LRESULT CButtonST::OnSetCheck(WPARAM wParam, LPARAM lParam)
 
- {
 
- 	ASSERT(m_bIsCheckBox);
 
- 	switch (wParam)
 
- 	{
 
- 		case BST_CHECKED:
 
- 		case BST_INDETERMINATE:	// Indeterminate state is handled like checked state
 
- 			SetCheck(1);
 
- 			break;
 
- 		default:
 
- 			SetCheck(0);
 
- 			break;
 
- 	} // switch
 
- 	return 0;
 
- } // End of OnSetCheck
 
- LRESULT CButtonST::OnGetCheck(WPARAM wParam, LPARAM lParam)
 
- {
 
- 	ASSERT(m_bIsCheckBox);
 
- 	return GetCheck();
 
- } // End of OnGetCheck
 
- #ifdef	BTNST_USE_BCMENU
 
- LRESULT CButtonST::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
 
- {
 
- 	LRESULT lResult;
 
- 	if (BCMenu::IsMenu(pMenu))
 
- 		lResult = BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
 
- 	else
 
- 		lResult = CButton::OnMenuChar(nChar, nFlags, pMenu);
 
- 	return lResult;
 
- } // End of OnMenuChar
 
- #endif
 
- #ifdef	BTNST_USE_BCMENU
 
- void CButtonST::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
 
- {
 
- 	BOOL bSetFlag = FALSE;
 
- 	if (lpMeasureItemStruct->CtlType == ODT_MENU)
 
- 	{
 
- 		if (IsMenu((HMENU)lpMeasureItemStruct->itemID) && BCMenu::IsMenu((HMENU)lpMeasureItemStruct->itemID))
 
- 		{
 
- 			m_menuPopup.MeasureItem(lpMeasureItemStruct);
 
- 			bSetFlag = TRUE;
 
- 		} // if
 
- 	} // if
 
- 	if (!bSetFlag) CButton::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
 
- } // End of OnMeasureItem
 
- #endif
 
- void CButtonST::OnEnable(BOOL bEnable) 
 
- {
 
- 	CButton::OnEnable(bEnable);
 
- 	
 
- 	if (bEnable == FALSE)	
 
- 	{
 
- 		CWnd*	pWnd = GetParent()->GetNextDlgTabItem(this);
 
- 		if (pWnd)
 
- 			pWnd->SetFocus();
 
- 		else
 
- 			GetParent()->SetFocus();
 
- 		CancelHover();
 
- 	} // if
 
- } // End of OnEnable
 
- void CButtonST::OnKillFocus(CWnd * pNewWnd)
 
- {
 
- 	CButton::OnKillFocus(pNewWnd);
 
- 	CancelHover();
 
- } // End of OnKillFocus
 
- void CButtonST::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
 
- {
 
- 	CButton::OnActivate(nState, pWndOther, bMinimized);
 
- 	if (nState == WA_INACTIVE)	CancelHover();
 
- } // End of OnActivate
 
- void CButtonST::OnCancelMode() 
 
- {
 
- 	CButton::OnCancelMode();
 
- 	CancelHover();
 
- } // End of OnCancelMode
 
- BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
 
- {
 
- 	// If a cursor was specified then use it!
 
- 	if (m_hCursor != NULL)
 
- 	{
 
- 		::SetCursor(m_hCursor);
 
- 		return TRUE;
 
- 	} // if
 
- 	return CButton::OnSetCursor(pWnd, nHitTest, message);
 
- } // End of OnSetCursor
 
- void CButtonST::CancelHover()
 
- {
 
- 	// Only for flat buttons
 
- 	if (m_bIsFlat)
 
- 	{
 
- 		if (m_bMouseOnButton)
 
- 		{
 
- 			m_bMouseOnButton = FALSE;
 
- 			Invalidate();
 
- 		} // if
 
- 	} // if
 
- } // End of CancelHover
 
- void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
 
- {
 
- 	CWnd*				wndUnderMouse = NULL;
 
- 	CWnd*				wndActive = this;
 
- 	TRACKMOUSEEVENT		csTME;
 
- 	CButton::OnMouseMove(nFlags, point);
 
- 	ClientToScreen(&point);
 
- 	wndUnderMouse = WindowFromPoint(point);
 
- 	// If the mouse enter the button with the left button pressed then do nothing
 
- 	if (nFlags & MK_LBUTTON && m_bMouseOnButton == FALSE) return;
 
- 	// If our button is not flat then do nothing
 
- 	if (m_bIsFlat == FALSE) return;
 
- 	if (m_bAlwaysTrack == FALSE)	wndActive = GetActiveWindow();
 
- 	if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
 
- 	{
 
- 		if (!m_bMouseOnButton)
 
- 		{
 
- 			m_bMouseOnButton = TRUE;
 
- 			Invalidate();
 
- #ifdef	BTNST_USE_SOUND
 
- 			// Play sound ?
 
- 			if (m_csSounds[0].lpszSound)
 
- 				::PlaySound(m_csSounds[0].lpszSound, m_csSounds[0].hMod, m_csSounds[0].dwFlags);
 
- #endif
 
- 			csTME.cbSize = sizeof(csTME);
 
- 			csTME.dwFlags = TME_LEAVE;
 
- 			csTME.hwndTrack = m_hWnd;
 
- 			::_TrackMouseEvent(&csTME);
 
- 		} // if
 
- 	} else CancelHover();
 
- } // End of OnMouseMove
 
- // Handler for WM_MOUSELEAVE
 
- LRESULT CButtonST::OnMouseLeave(WPARAM wParam, LPARAM lParam)
 
- {
 
- 	CancelHover();
 
- 	return 0;
 
- } // End of OnMouseLeave
 
- BOOL CButtonST::OnClicked() 
 
- {	
 
- 	SetFocus();
 
- #ifdef	BTNST_USE_SOUND
 
- 	// Play sound ?
 
- 	if (m_csSounds[1].lpszSound)
 
- 		::PlaySound(m_csSounds[1].lpszSound, m_csSounds[1].hMod, m_csSounds[1].dwFlags);
 
- #endif
 
- 	if (m_bIsCheckBox)
 
- 	{
 
- 		m_nCheck = !m_nCheck;
 
- 		Invalidate();
 
- 	} // if
 
- 	else
 
- 	{
 
- 		// Handle the menu (if any)
 
- #ifdef	BTNST_USE_BCMENU
 
- 		if (m_menuPopup.m_hMenu)
 
- #else
 
- 		if (m_hMenu)
 
- #endif
 
- 		{
 
- 			CRect	rWnd;
 
- 			GetWindowRect(rWnd);
 
- 			m_bMenuDisplayed = TRUE;
 
- 			Invalidate();
 
- #ifdef	BTNST_USE_BCMENU
 
- 			BCMenu* psub = (BCMenu*)m_menuPopup.GetSubMenu(0);
 
- 			if (m_csCallbacks.hWnd)	::SendMessage(m_csCallbacks.hWnd, m_csCallbacks.nMessage, (WPARAM)psub, m_csCallbacks.lParam);
 
- 			DWORD dwRetValue = psub->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, rWnd.left, rWnd.bottom, this, NULL);
 
- #else
 
- 			HMENU hSubMenu = ::GetSubMenu(m_hMenu, 0);
 
- 			if (m_csCallbacks.hWnd)	::SendMessage(m_csCallbacks.hWnd, m_csCallbacks.nMessage, (WPARAM)hSubMenu, m_csCallbacks.lParam);
 
- 			DWORD dwRetValue = ::TrackPopupMenuEx(hSubMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, rWnd.left, rWnd.bottom, m_hParentWndMenu, NULL);
 
- #endif
 
- 			m_bMenuDisplayed = FALSE;
 
- 			Invalidate();
 
- 			if (dwRetValue)
 
- 				::PostMessage(m_hParentWndMenu, WM_COMMAND, MAKEWPARAM(dwRetValue, 0), (LPARAM)NULL);
 
- 		} // if
 
- 		else
 
- 		{
 
- 			// Handle the URL (if any)
 
- 			if (_tcslen(m_szURL) > 0)
 
- 			{
 
- 				SHELLEXECUTEINFO	csSEI;
 
- 				memset(&csSEI, 0, sizeof(csSEI));
 
- 				csSEI.cbSize = sizeof(SHELLEXECUTEINFO);
 
- 				csSEI.fMask = SEE_MASK_FLAG_NO_UI;
 
- 				csSEI.lpVerb = _T("open");
 
- 				csSEI.lpFile = m_szURL;
 
- 				csSEI.nShow = SW_SHOWMAXIMIZED;
 
- 				::ShellExecuteEx(&csSEI);
 
- 			} // if
 
- 		} // else
 
- 	} // else
 
- 	return FALSE;
 
- } // End of OnClicked
 
- void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
 
- {
 
- 	CDC*	pDC = CDC::FromHandle(lpDIS->hDC);
 
- 	// Checkbox?
 
- 	if (m_bIsCheckBox)
 
- 	{
 
- 		m_bIsPressed  =  (lpDIS->itemState & ODS_SELECTED) || (m_nCheck != 0);
 
- 	} // if
 
- 	else	// Normal button OR other button style ...
 
- 	{
 
- 		m_bIsPressed = (lpDIS->itemState & ODS_SELECTED);
 
- 		// If there is a menu and it's displayed, draw the button as pressed
 
- 		if (
 
- #ifdef	BTNST_USE_BCMENU
 
- 			m_menuPopup.m_hMenu 
 
- #else
 
- 			m_hMenu 
 
- #endif
 
- 			&& m_bMenuDisplayed)	m_bIsPressed = TRUE;
 
- 	} // else
 
- 	m_bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
 
- 	m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
 
- 	CRect itemRect = lpDIS->rcItem;
 
- 	pDC->SetBkMode(TRANSPARENT);
 
- 	// Prepare draw... paint button background
 
- 	// Draw transparent?
 
- 	if (m_bDrawTransparent)
 
- 		PaintBk(pDC);
 
- 	else
 
- 		OnDrawBackground(pDC, &itemRect);
 
- 	// Draw button border
 
- 	OnDrawBorder(pDC, &itemRect);
 
- 	// Read the button's title
 
- 	CString sTitle;
 
- 	GetWindowText(sTitle);
 
- 	CRect captionRect = lpDIS->rcItem;
 
- 	// Draw the icon
 
- 	if (m_csIcons[0].hIcon)
 
- 	{
 
- 		DrawTheIcon(pDC, !sTitle.IsEmpty(), &lpDIS->rcItem, &captionRect, m_bIsPressed, m_bIsDisabled);
 
- 	} // if
 
- 	if (m_csBitmaps[0].hBitmap)
 
- 	{
 
- 		pDC->SetBkColor(RGB(255,255,255));
 
- 		DrawTheBitmap(pDC, !sTitle.IsEmpty(), &lpDIS->rcItem, &captionRect, m_bIsPressed, m_bIsDisabled);
 
- 	} // if
 
- 	// Write the button title (if any)
 
- 	if (sTitle.IsEmpty() == FALSE)
 
- 	{
 
- 		DrawTheText(pDC, (LPCTSTR)sTitle, &lpDIS->rcItem, &captionRect, m_bIsPressed, m_bIsDisabled);
 
- 	} // if
 
- 	if (m_bIsFlat == FALSE || (m_bIsFlat && m_bDrawFlatFocus))
 
- 	{
 
- 		// Draw the focus rect
 
- 		if (m_bIsFocused)
 
- 		{
 
- 			CRect focusRect = itemRect;
 
- 			focusRect.DeflateRect(3, 3);
 
- 			pDC->DrawFocusRect(&focusRect);
 
- 		} // if
 
- 	} // if
 
- } // End of DrawItem
 
- void CButtonST::PaintBk(CDC* pDC)
 
- {
 
- 	CClientDC clDC(GetParent());
 
- 	CRect rect;
 
- 	CRect rect1;
 
- 	GetClientRect(rect);
 
- 	GetWindowRect(rect1);
 
- 	GetParent()->ScreenToClient(rect1);
 
- 	if (m_dcBk.m_hDC == NULL)
 
- 	{
 
- 		m_dcBk.CreateCompatibleDC(&clDC);
 
- 		m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
 
- 		m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
 
- 		m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
 
- 	} // if
 
- 	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
 
- } // End of PaintBk
 
- HBITMAP CButtonST::CreateBitmapMask(HBITMAP hSourceBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTransColor)
 
- {
 
- 	HBITMAP		hMask		= NULL;
 
- 	HDC			hdcSrc		= NULL;
 
- 	HDC			hdcDest		= NULL;
 
- 	HBITMAP		hbmSrcT		= NULL;
 
- 	HBITMAP		hbmDestT	= NULL;
 
- 	COLORREF	crSaveBk;
 
- 	COLORREF	crSaveDestText;
 
- 	hMask = ::CreateBitmap(dwWidth, dwHeight, 1, 1, NULL);
 
- 	if (hMask == NULL)	return NULL;
 
- 	hdcSrc	= ::CreateCompatibleDC(NULL);
 
- 	hdcDest	= ::CreateCompatibleDC(NULL);
 
- 	hbmSrcT = (HBITMAP)::SelectObject(hdcSrc, hSourceBitmap);
 
- 	hbmDestT = (HBITMAP)::SelectObject(hdcDest, hMask);
 
- 	crSaveBk = ::SetBkColor(hdcSrc, crTransColor);
 
- 	::BitBlt(hdcDest, 0, 0, dwWidth, dwHeight, hdcSrc, 0, 0, SRCCOPY);
 
- 	crSaveDestText = ::SetTextColor(hdcSrc, RGB(255, 255, 255));
 
- 	::SetBkColor(hdcSrc,RGB(0, 0, 0));
 
- 	::BitBlt(hdcSrc, 0, 0, dwWidth, dwHeight, hdcDest, 0, 0, SRCAND);
 
- 	SetTextColor(hdcDest, crSaveDestText);
 
- 	::SetBkColor(hdcSrc, crSaveBk);
 
- 	::SelectObject(hdcSrc, hbmSrcT);
 
- 	::SelectObject(hdcDest, hbmDestT);
 
- 	::DeleteDC(hdcSrc);
 
- 	::DeleteDC(hdcDest);
 
- 	return hMask;
 
- } // End of CreateBitmapMask
 
- //
 
- // Parameters:
 
- //		[IN]	bHasTitle
 
- //				TRUE if the button has a text
 
- //		[IN]	rpItem
 
- //				A pointer to a RECT structure indicating the allowed paint area
 
- //		[IN/OUT]rpTitle
 
- //				A pointer to a CRect object indicating the paint area reserved for the
 
- //				text. This structure will be modified if necessary.
 
- //		[IN]	bIsPressed
 
- //				TRUE if the button is currently pressed
 
- //		[IN]	dwWidth
 
- //				Width of the image (icon or bitmap)
 
- //		[IN]	dwHeight
 
- //				Height of the image (icon or bitmap)
 
- //		[OUT]	rpImage
 
- //				A pointer to a CRect object that will receive the area available to the image
 
- //
 
- void CButtonST::PrepareImageRect(BOOL bHasTitle, RECT* rpItem, CRect* rpTitle, BOOL bIsPressed, DWORD dwWidth, DWORD dwHeight, CRect* rpImage)
 
- {
 
- 	CRect rBtn;
 
- 	rpImage->CopyRect(rpItem);
 
- 	switch (m_byAlign)
 
- 	{
 
- 		case ST_ALIGN_HORIZ:
 
- 			if (bHasTitle == FALSE)
 
- 			{
 
- 				// Center image horizontally
 
- 				rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
 
- 			}
 
- 			else
 
- 			{
 
- 				// Image must be placed just inside the focus rect
 
- 				rpImage->left += m_ptImageOrg.x;  
 
- 				rpTitle->left += dwWidth + m_ptImageOrg.x;
 
- 			}
 
- 			// Center image vertically
 
- 			rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);
 
- 			break;
 
- 		case ST_ALIGN_HORIZ_RIGHT:
 
- 			GetClientRect(&rBtn);
 
- 			if (bHasTitle == FALSE)
 
- 			{
 
- 				// Center image horizontally
 
- 				rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
 
- 			}
 
- 			else
 
- 			{
 
- 				// Image must be placed just inside the focus rect
 
- 				rpTitle->right = rpTitle->Width() - dwWidth - m_ptImageOrg.x;
 
- 				rpTitle->left = m_ptImageOrg.x;
 
- 				rpImage->left = rBtn.right - dwWidth - m_ptImageOrg.x;
 
- 				// Center image vertically
 
- 				rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);
 
- 			}
 
- 			break;
 
- 		
 
- 		case ST_ALIGN_VERT:
 
- 			// Center image horizontally
 
- 			rpImage->left += ((rpImage->Width() - (long)dwWidth)/2);
 
- 			if (bHasTitle == FALSE)
 
- 			{
 
- 				// Center image vertically
 
- 				rpImage->top += ((rpImage->Height() - (long)dwHeight)/2);           
 
- 			}
 
- 			else
 
- 			{
 
- 				rpImage->top = m_ptImageOrg.y;
 
- 				rpTitle->top += dwHeight;
 
- 			}
 
- 			break;
 
- 		case ST_ALIGN_OVERLAP:
 
- 			break;
 
- 	} // switch
 
-     
 
- 	// If button is pressed then press image also
 
- 	if (bIsPressed && m_bIsCheckBox == FALSE)
 
- 		rpImage->OffsetRect(m_ptPressedOffset.x, m_ptPressedOffset.y);
 
- } // End of PrepareImageRect
 
- void CButtonST::DrawTheIcon(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
 
- {
 
- 	BYTE		byIndex		= 0;
 
- 	// Select the icon to use
 
- 	if ((m_bIsCheckBox && bIsPressed) || (!m_bIsCheckBox && (bIsPressed || m_bMouseOnButton)))
 
- 		byIndex = 0;
 
- 	else
 
- 		byIndex = (m_csIcons[1].hIcon == NULL ? 0 : 1);
 
- 	CRect	rImage;
 
- 	PrepareImageRect(bHasTitle, rpItem, rpCaption, bIsPressed, m_csIcons[byIndex].dwWidth, m_csIcons[byIndex].dwHeight, &rImage);
 
- 	// Ole'!
 
- 	pDC->DrawState(	rImage.TopLeft(),
 
- 					rImage.Size(), 
 
- 					m_csIcons[byIndex].hIcon,
 
- 					(bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
 
- 					(CBrush*)NULL);
 
- } // End of DrawTheIcon
 
- void CButtonST::DrawTheBitmap(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
 
- {
 
- 	HDC			hdcBmpMem	= NULL;
 
- 	HBITMAP		hbmOldBmp	= NULL;
 
- 	HDC			hdcMem		= NULL;
 
- 	HBITMAP		hbmT		= NULL;
 
- 	BYTE		byIndex		= 0;
 
- 	// Select the bitmap to use
 
- 	if ((m_bIsCheckBox && bIsPressed) || (!m_bIsCheckBox && (bIsPressed || m_bMouseOnButton)))
 
- 		byIndex = 0;
 
- 	else
 
- 		byIndex = (m_csBitmaps[1].hBitmap == NULL ? 0 : 1);
 
- 	CRect	rImage;
 
- 	PrepareImageRect(bHasTitle, rpItem, rpCaption, bIsPressed, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, &rImage);
 
- 	hdcBmpMem = ::CreateCompatibleDC(pDC->m_hDC);
 
- 	hbmOldBmp = (HBITMAP)::SelectObject(hdcBmpMem, m_csBitmaps[byIndex].hBitmap);
 
- 	hdcMem = ::CreateCompatibleDC(NULL);
 
- 	hbmT = (HBITMAP)::SelectObject(hdcMem, m_csBitmaps[byIndex].hMask);
 
- 	if (bIsDisabled && m_bShowDisabledBitmap)
 
- 	{
 
- 		HDC		hDC = NULL;
 
- 		HBITMAP	hBitmap = NULL;
 
- 		hDC = ::CreateCompatibleDC(pDC->m_hDC);
 
- 		hBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight);
 
- 		HBITMAP	hOldBmp2 = (HBITMAP)::SelectObject(hDC, hBitmap);
 
- 		RECT	rRect;
 
- 		rRect.left = 0;
 
- 		rRect.top = 0;
 
- 		rRect.right = rImage.right + 1;
 
- 		rRect.bottom = rImage.bottom + 1;
 
- 		::FillRect(hDC, &rRect, (HBRUSH)RGB(255, 255, 255));
 
- 		COLORREF crOldColor = ::SetBkColor(hDC, RGB(255,255,255));
 
- 		::BitBlt(hDC, 0, 0, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcMem, 0, 0, SRCAND);
 
- 		::BitBlt(hDC, 0, 0, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcBmpMem, 0, 0, SRCPAINT);
 
- 		::SetBkColor(hDC, crOldColor);
 
- 		::SelectObject(hDC, hOldBmp2);
 
- 		::DeleteDC(hDC);
 
- 		pDC->DrawState(	CPoint(rImage.left/*+1*/, rImage.top), 
 
- 						CSize(m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight), 
 
- 						hBitmap, DST_BITMAP | DSS_DISABLED);
 
- 		::DeleteObject(hBitmap);
 
- 	} // if
 
- 	else
 
- 	{
 
- 		::BitBlt(pDC->m_hDC, rImage.left, rImage.top, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcMem, 0, 0, SRCAND);
 
- 		::BitBlt(pDC->m_hDC, rImage.left, rImage.top, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcBmpMem, 0, 0, SRCPAINT);
 
- 	} // else
 
- 	::SelectObject(hdcMem, hbmT);
 
- 	::DeleteDC(hdcMem);
 
- 	::SelectObject(hdcBmpMem, hbmOldBmp);
 
- 	::DeleteDC(hdcBmpMem);
 
- } // End of DrawTheBitmap
 
- void CButtonST::DrawTheText(CDC* pDC, LPCTSTR lpszText, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
 
- {
 
- 	// Draw the button's title
 
- 	// If button is pressed then "press" title also
 
- 	if (m_bIsPressed && m_bIsCheckBox == FALSE)
 
- 		rpCaption->OffsetRect(m_ptPressedOffset.x, m_ptPressedOffset.y);
 
- 	// ONLY FOR DEBUG 
 
- 	//CBrush brBtnShadow(RGB(255, 0, 0));
 
- 	//pDC->FrameRect(rCaption, &brBtnShadow);
 
- 	// Center text
 
- 	CRect centerRect = rpCaption;
 
- 	// ÉèÖÃ×ÖÌå;
 
- 	CFont *pOldFont = pDC->SelectObject(&m_font);
 
- 	pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER | DT_CALCRECT);
 
- 	rpCaption->OffsetRect((centerRect.Width() - rpCaption->Width())/2, (centerRect.Height() - rpCaption->Height())/2);
 
- 	/* RFU
 
- 	rpCaption->OffsetRect(0, (centerRect.Height() - rpCaption->Height())/2);
 
- 	rpCaption->OffsetRect((centerRect.Width() - rpCaption->Width())-4, (centerRect.Height() - rpCaption->Height())/2);
 
- 	*/
 
- 	pDC->SetBkMode(TRANSPARENT);
 
- 	/*
 
- 	pDC->DrawState(rCaption->TopLeft(), rCaption->Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
 
- 					TRUE, 0, (CBrush*)NULL);
 
- 	*/
 
- 	if (m_bIsDisabled)
 
- 	{
 
- 		rpCaption->OffsetRect(1, 1);
 
- 		pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
 
- 		pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
 
- 		rpCaption->OffsetRect(-1, -1);
 
- 		pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
 
- 		pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
 
- 	} // if
 
- 	else
 
- 	{
 
- 		if (m_bMouseOnButton || m_bIsPressed) 
 
- 		{
 
- 			pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_IN]);
 
- 			pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_IN]);
 
- 		} // if
 
- 		else 
 
- 		{
 
- 			if (m_bIsFocused)
 
- 			{ 
 
- 				pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_FOCUS]); 
 
- 				pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_FOCUS]); 
 
- 			} // if
 
- 			else 
 
- 			{
 
- 				pDC->SetTextColor(m_crColors[BTNST_COLOR_FG_OUT]); 
 
- 				pDC->SetBkColor(m_crColors[BTNST_COLOR_BK_OUT]); 
 
- 			} // else
 
- 		} // else
 
- 		pDC->DrawText(lpszText, -1, rpCaption, DT_WORDBREAK | DT_CENTER);
 
- 	} // if
 
- 	pDC->SelectObject(pOldFont);
 
- } // End of DrawTheText
 
- // This function creates a grayscale bitmap starting from a given bitmap.
 
- // The resulting bitmap will have the same size of the original one.
 
- //
 
- // Parameters:
 
- //		[IN]	hBitmap
 
- //				Handle to the original bitmap.
 
- //		[IN]	dwWidth
 
- //				Specifies the bitmap width, in pixels.
 
- //		[IN]	dwHeight
 
- //				Specifies the bitmap height, in pixels.
 
- //		[IN]	crTrans
 
- //				Color to be used as transparent color. This color will be left unchanged.
 
- //
 
- // Return value:
 
- //		If the function succeeds, the return value is the handle to the newly created
 
- //		grayscale bitmap.
 
- //		If the function fails, the return value is NULL.
 
- //
 
- HBITMAP CButtonST::CreateGrayscaleBitmap(HBITMAP hBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTrans)
 
- {
 
- 	HBITMAP		hGrayBitmap = NULL;
 
- 	HDC			hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
 
- 	HBITMAP		hOldBmp1 = NULL, hOldBmp2 = NULL;
 
- 	hMainDC = ::GetDC(NULL);
 
- 	if (hMainDC == NULL)	return NULL;
 
- 	hMemDC1 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMemDC1 == NULL)
 
- 	{
 
- 		::ReleaseDC(NULL, hMainDC);
 
- 		return NULL;
 
- 	} // if
 
- 	hMemDC2 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMemDC2 == NULL)
 
- 	{
 
- 		::DeleteDC(hMemDC1);
 
- 		::ReleaseDC(NULL, hMainDC);
 
- 		return NULL;
 
- 	} // if
 
- 	hGrayBitmap = ::CreateCompatibleBitmap(hMainDC, dwWidth, dwHeight);
 
- 	if (hGrayBitmap)
 
- 	{
 
- 		hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, hGrayBitmap);
 
- 		hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, hBitmap);
 
- 		//::BitBlt(hMemDC1, 0, 0, dwWidth, dwHeight, hMemDC2, 0, 0, SRCCOPY);
 
- 		DWORD		dwLoopY = 0, dwLoopX = 0;
 
- 		COLORREF	crPixel = 0;
 
- 		BYTE		byNewPixel = 0;
 
- 		for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
 
- 		{
 
- 			for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
 
- 			{
 
- 				crPixel = ::GetPixel(hMemDC2, dwLoopX, dwLoopY);
 
- 				byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114));
 
- 				if (crPixel != crTrans)
 
- 					::SetPixel(hMemDC1, dwLoopX, dwLoopY, RGB(byNewPixel, byNewPixel, byNewPixel));
 
- 				else
 
- 					::SetPixel(hMemDC1, dwLoopX, dwLoopY, crPixel);
 
- 			} // for
 
- 		} // for
 
- 		::SelectObject(hMemDC1, hOldBmp1);
 
- 		::SelectObject(hMemDC2, hOldBmp2);
 
- 	} // if
 
- 	::DeleteDC(hMemDC1);
 
- 	::DeleteDC(hMemDC2);
 
- 	::ReleaseDC(NULL, hMainDC);
 
- 	return hGrayBitmap;
 
- } // End of CreateGrayscaleBitmap
 
- // This function creates a bitmap that is 25% darker than the original.
 
- // The resulting bitmap will have the same size of the original one.
 
- //
 
- // Parameters:
 
- //		[IN]	hBitmap
 
- //				Handle to the original bitmap.
 
- //		[IN]	dwWidth
 
- //				Specifies the bitmap width, in pixels.
 
- //		[IN]	dwHeight
 
- //				Specifies the bitmap height, in pixels.
 
- //		[IN]	crTrans
 
- //				Color to be used as transparent color. This color will be left unchanged.
 
- //
 
- // Return value:
 
- //		If the function succeeds, the return value is the handle to the newly created
 
- //		darker bitmap.
 
- //		If the function fails, the return value is NULL.
 
- //
 
- HBITMAP CButtonST::CreateDarkerBitmap(HBITMAP hBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTrans)
 
- {
 
- 	HBITMAP		hGrayBitmap = NULL;
 
- 	HDC			hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
 
- 	HBITMAP		hOldBmp1 = NULL, hOldBmp2 = NULL;
 
- 	hMainDC = ::GetDC(NULL);
 
- 	if (hMainDC == NULL)	return NULL;
 
- 	hMemDC1 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMemDC1 == NULL)
 
- 	{
 
- 		::ReleaseDC(NULL, hMainDC);
 
- 		return NULL;
 
- 	} // if
 
- 	hMemDC2 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMemDC2 == NULL)
 
- 	{
 
- 		::DeleteDC(hMemDC1);
 
- 		::ReleaseDC(NULL, hMainDC);
 
- 		return NULL;
 
- 	} // if
 
- 	hGrayBitmap = ::CreateCompatibleBitmap(hMainDC, dwWidth, dwHeight);
 
- 	if (hGrayBitmap)
 
- 	{
 
- 		hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, hGrayBitmap);
 
- 		hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, hBitmap);
 
- 		//::BitBlt(hMemDC1, 0, 0, dwWidth, dwHeight, hMemDC2, 0, 0, SRCCOPY);
 
- 		DWORD		dwLoopY = 0, dwLoopX = 0;
 
- 		COLORREF	crPixel = 0;
 
- 		for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
 
- 		{
 
- 			for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
 
- 			{
 
- 				crPixel = ::GetPixel(hMemDC2, dwLoopX, dwLoopY);
 
- 				if (crPixel != crTrans)
 
- 					::SetPixel(hMemDC1, dwLoopX, dwLoopY, DarkenColor(crPixel, 0.25));
 
- 				else
 
- 					::SetPixel(hMemDC1, dwLoopX, dwLoopY, crPixel);
 
- 			} // for
 
- 		} // for
 
- 		::SelectObject(hMemDC1, hOldBmp1);
 
- 		::SelectObject(hMemDC2, hOldBmp2);
 
- 	} // if
 
- 	::DeleteDC(hMemDC1);
 
- 	::DeleteDC(hMemDC2);
 
- 	::ReleaseDC(NULL, hMainDC);
 
- 	return hGrayBitmap;
 
- } // End of CreateDarkerBitmap
 
- // This function creates a grayscale icon starting from a given icon.
 
- // The resulting icon will have the same size of the original one.
 
- //
 
- // Parameters:
 
- //		[IN]	hIcon
 
- //				Handle to the original icon.
 
- //
 
- // Return value:
 
- //		If the function succeeds, the return value is the handle to the newly created
 
- //		grayscale icon.
 
- //		If the function fails, the return value is NULL.
 
- //
 
- // Updates:
 
- //		26/Nov/2002	Restored 1 BitBlt operation
 
- //		03/May/2002	Removed dependancy from m_hWnd
 
- //					Removed 1 BitBlt operation
 
- //
 
- HICON CButtonST::CreateGrayscaleIcon(HICON hIcon)
 
- {
 
- 	HICON		hGrayIcon = NULL;
 
- 	HDC			hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
 
- 	BITMAP		bmp;
 
- 	HBITMAP		hOldBmp1 = NULL, hOldBmp2 = NULL;
 
- 	ICONINFO	csII, csGrayII;
 
- 	BOOL		bRetValue = FALSE;
 
- 	bRetValue = ::GetIconInfo(hIcon, &csII);
 
- 	if (bRetValue == FALSE)	return NULL;
 
- 	hMainDC = ::GetDC(NULL);
 
- 	hMemDC1 = ::CreateCompatibleDC(hMainDC);
 
- 	hMemDC2 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)	return NULL;
 
-   
 
- 	if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp))
 
- 	{
 
- 		DWORD	dwWidth = csII.xHotspot*2;
 
- 		DWORD	dwHeight = csII.yHotspot*2;
 
- 		csGrayII.hbmColor = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
 
- 		if (csGrayII.hbmColor)
 
- 		{
 
- 			hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, csII.hbmColor);
 
- 			hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, csGrayII.hbmColor);
 
- 			//::BitBlt(hMemDC2, 0, 0, dwWidth, dwHeight, hMemDC1, 0, 0, SRCCOPY);
 
- 			DWORD		dwLoopY = 0, dwLoopX = 0;
 
- 			COLORREF	crPixel = 0;
 
- 			BYTE		byNewPixel = 0;
 
- 			for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
 
- 			{
 
- 				for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
 
- 				{
 
- 					crPixel = ::GetPixel(hMemDC1, dwLoopX, dwLoopY);
 
- 					byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114));
 
- 					if (crPixel)	
 
- 						::SetPixel(hMemDC2, dwLoopX, dwLoopY, RGB(byNewPixel, byNewPixel, byNewPixel));
 
- 					else
 
- 						::SetPixel(hMemDC2, dwLoopX, dwLoopY, crPixel);
 
- 				} // for
 
- 			} // for
 
- 			::SelectObject(hMemDC1, hOldBmp1);
 
- 			::SelectObject(hMemDC2, hOldBmp2);
 
- 			csGrayII.hbmMask = csII.hbmMask;
 
- 			csGrayII.fIcon = TRUE;
 
- 			hGrayIcon = ::CreateIconIndirect(&csGrayII);
 
- 		} // if
 
- 		::DeleteObject(csGrayII.hbmColor);
 
- 		//::DeleteObject(csGrayII.hbmMask);
 
- 	} // if
 
- 	::DeleteObject(csII.hbmColor);
 
- 	::DeleteObject(csII.hbmMask);
 
- 	::DeleteDC(hMemDC1);
 
- 	::DeleteDC(hMemDC2);
 
- 	::ReleaseDC(NULL, hMainDC);
 
- 	return hGrayIcon;
 
- } // End of CreateGrayscaleIcon
 
- // This function creates a icon that is 25% darker than the original.
 
- // The resulting icon will have the same size of the original one.
 
- //
 
- // Parameters:
 
- //		[IN]	hIcon
 
- //				Handle to the original icon.
 
- //
 
- // Return value:
 
- //		If the function succeeds, the return value is the handle to the newly created
 
- //		darker icon.
 
- //		If the function fails, the return value is NULL.
 
- //
 
- HICON CButtonST::CreateDarkerIcon(HICON hIcon)
 
- {
 
- 	HICON		hGrayIcon = NULL;
 
- 	HDC			hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
 
- 	BITMAP		bmp;
 
- 	HBITMAP		hOldBmp1 = NULL, hOldBmp2 = NULL;
 
- 	ICONINFO	csII, csGrayII;
 
- 	BOOL		bRetValue = FALSE;
 
- 	bRetValue = ::GetIconInfo(hIcon, &csII);
 
- 	if (bRetValue == FALSE)	return NULL;
 
- 	hMainDC = ::GetDC(NULL);
 
- 	hMemDC1 = ::CreateCompatibleDC(hMainDC);
 
- 	hMemDC2 = ::CreateCompatibleDC(hMainDC);
 
- 	if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)	return NULL;
 
-   
 
- 	if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp))
 
- 	{
 
- 		DWORD	dwWidth = csII.xHotspot*2;
 
- 		DWORD	dwHeight = csII.yHotspot*2;
 
- 		csGrayII.hbmColor = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
 
- 		if (csGrayII.hbmColor)
 
- 		{
 
- 			hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, csII.hbmColor);
 
- 			hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, csGrayII.hbmColor);
 
- 			//::BitBlt(hMemDC2, 0, 0, dwWidth, dwHeight, hMemDC1, 0, 0, SRCCOPY);
 
- 			DWORD		dwLoopY = 0, dwLoopX = 0;
 
- 			COLORREF	crPixel = 0;
 
- 			for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
 
- 			{
 
- 				for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
 
- 				{
 
- 					crPixel = ::GetPixel(hMemDC1, dwLoopX, dwLoopY);
 
- 					if (crPixel)	
 
- 						::SetPixel(hMemDC2, dwLoopX, dwLoopY, DarkenColor(crPixel, 0.25));
 
- 					else
 
- 						::SetPixel(hMemDC2, dwLoopX, dwLoopY, crPixel);
 
- 				} // for
 
- 			} // for
 
- 			::SelectObject(hMemDC1, hOldBmp1);
 
- 			::SelectObject(hMemDC2, hOldBmp2);
 
- 			csGrayII.hbmMask = csII.hbmMask;
 
- 			csGrayII.fIcon = TRUE;
 
- 			hGrayIcon = ::CreateIconIndirect(&csGrayII);
 
- 		} // if
 
- 		::DeleteObject(csGrayII.hbmColor);
 
- 		//::DeleteObject(csGrayII.hbmMask);
 
- 	} // if
 
- 	::DeleteObject(csII.hbmColor);
 
- 	::DeleteObject(csII.hbmMask);
 
- 	::DeleteDC(hMemDC1);
 
- 	::DeleteDC(hMemDC2);
 
- 	::ReleaseDC(NULL, hMainDC);
 
- 	return hGrayIcon;
 
- } // End of CreateDarkerIcon
 
- COLORREF CButtonST::DarkenColor(COLORREF crColor, double dFactor)
 
- {
 
- 	if (dFactor > 0.0 && dFactor <= 1.0)
 
- 	{
 
- 		BYTE red,green,blue,lightred,lightgreen,lightblue;
 
- 		red = GetRValue(crColor);
 
- 		green = GetGValue(crColor);
 
- 		blue = GetBValue(crColor);
 
- 		lightred = (BYTE)(red-(dFactor * red));
 
- 		lightgreen = (BYTE)(green-(dFactor * green));
 
- 		lightblue = (BYTE)(blue-(dFactor * blue));
 
- 		crColor = RGB(lightred,lightgreen,lightblue);
 
- 	} // if
 
- 	return crColor;
 
- } // End of DarkenColor
 
- // This function assigns icons to the button.
 
- // Any previous icon or bitmap 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]	nCxDesiredIn
 
- //				Specifies the width, in pixels, of the icon to load.
 
- //		[IN]	nCyDesiredIn
 
- //				Specifies the height, in pixels, of the icon to load.
 
- //		[IN]	nIconOut
 
- //				ID number of the icon resource to show when the mouse is outside the button.
 
- //				Can be NULL.
 
- //				If this parameter is the special value BTNST_AUTO_GRAY (cast to int) the second
 
- //				icon will be automatically created starting from nIconIn and converted to grayscale.
 
- //				If this parameter is the special value BTNST_AUTO_DARKER (cast to int) the second
 
- //				icon will be automatically created 25% darker starting from nIconIn.
 
- //		[IN]	nCxDesiredOut
 
- //				Specifies the width, in pixels, of the icon to load.
 
- //		[IN]	nCyDesiredOut
 
- //				Specifies the height, in pixels, of the icon to load.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //
 
- DWORD CButtonST::SetIcon(int nIconIn, int nCxDesiredIn, int nCyDesiredIn, int nIconOut, int nCxDesiredOut, int nCyDesiredOut)
 
- {
 
- 	HICON		hIconIn			= NULL;
 
- 	HICON		hIconOut		= NULL;
 
- 	HINSTANCE	hInstResource	= NULL;
 
- 	// Find correct resource handle
 
- 	hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconIn), RT_GROUP_ICON);
 
- 	// Set icon when the mouse is IN the button
 
- 	hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconIn), IMAGE_ICON, nCxDesiredIn, nCyDesiredIn, 0);
 
-   	// Set icon when the mouse is OUT the button
 
- 	switch (nIconOut)
 
- 	{
 
- 		case NULL:
 
- 			break;
 
- 		case (int)BTNST_AUTO_GRAY:
 
- 			hIconOut = BTNST_AUTO_GRAY;
 
- 			break;
 
- 		case (int)BTNST_AUTO_DARKER:
 
- 			hIconOut = BTNST_AUTO_DARKER;
 
- 			break;
 
- 		default:
 
- 			hIconOut = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOut), IMAGE_ICON, nCxDesiredOut, nCyDesiredOut, 0);
 
- 			break;
 
- 	} // switch
 
- 	return SetIcon(hIconIn, hIconOut);
 
- } // End of SetIcon
 
- // This function assigns icons to the button.
 
- // Any previous icon or bitmap 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]	nIconOut
 
- //				ID number of the icon resource to show when the mouse is outside the button.
 
- //				Can be NULL.
 
- //				If this parameter is the special value BTNST_AUTO_GRAY (cast to int) the second
 
- //				icon will be automatically created starting from nIconIn and converted to grayscale.
 
- //				If this parameter is the special value BTNST_AUTO_DARKER (cast to int) the second
 
- //				icon will be automatically created 25% darker starting from nIconIn.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //
 
- DWORD CButtonST::SetIcon(int nIconIn, int nIconOut)
 
- {
 
- 	return SetIcon(nIconIn, 0, 0, nIconOut, 0, 0);
 
- } // End of SetIcon
 
- // This function assigns icons to the button.
 
- // Any previous icon or bitmap 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]	hIconOut
 
- //				Handle to the icon to show when the mouse is outside the button.
 
- //				Can be NULL.
 
- //				If this parameter is the special value BTNST_AUTO_GRAY the second
 
- //				icon will be automatically created starting from hIconIn and converted to grayscale.
 
- //				If this parameter is the special value BTNST_AUTO_DARKER the second
 
- //				icon will be automatically created 25% darker starting from hIconIn.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //
 
- DWORD CButtonST::SetIcon(HICON hIconIn, HICON hIconOut)
 
- {
 
- 	BOOL		bRetValue;
 
- 	ICONINFO	ii;
 
- 	// Free any loaded resource
 
- 	FreeResources();
 
- 	if (hIconIn)
 
- 	{
 
- 		// Icon when mouse over button?
 
- 		m_csIcons[0].hIcon = hIconIn;
 
- 		// Get icon dimension
 
- 		::ZeroMemory(&ii, sizeof(ICONINFO));
 
- 		bRetValue = ::GetIconInfo(hIconIn, &ii);
 
- 		if (bRetValue == FALSE)
 
- 		{
 
- 			FreeResources();
 
- 			return BTNST_INVALIDRESOURCE;
 
- 		} // if
 
- 		m_csIcons[0].dwWidth	= (DWORD)(ii.xHotspot * 2);
 
- 		m_csIcons[0].dwHeight	= (DWORD)(ii.yHotspot * 2);
 
- 		::DeleteObject(ii.hbmMask);
 
- 		::DeleteObject(ii.hbmColor);
 
- 		// Icon when mouse outside button?
 
- 		if (hIconOut)
 
- 		{
 
- 			switch ((int)hIconOut)
 
- 			{
 
- 				case (int)BTNST_AUTO_GRAY:
 
- 					hIconOut = CreateGrayscaleIcon(hIconIn);
 
- 					break;
 
- 				case (int)BTNST_AUTO_DARKER:
 
- 					hIconOut = CreateDarkerIcon(hIconIn);
 
- 					break;
 
- 			} // switch
 
- 			m_csIcons[1].hIcon = hIconOut;
 
- 			// Get icon dimension
 
- 			::ZeroMemory(&ii, sizeof(ICONINFO));
 
- 			bRetValue = ::GetIconInfo(hIconOut, &ii);
 
- 			if (bRetValue == FALSE)
 
- 			{
 
- 				FreeResources();
 
- 				return BTNST_INVALIDRESOURCE;
 
- 			} // if
 
- 			m_csIcons[1].dwWidth	= (DWORD)(ii.xHotspot * 2);
 
- 			m_csIcons[1].dwHeight	= (DWORD)(ii.yHotspot * 2);
 
- 			::DeleteObject(ii.hbmMask);
 
- 			::DeleteObject(ii.hbmColor);
 
- 		} // if
 
- 	} // if
 
- 	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetIcon
 
- // This function assigns bitmaps to the button.
 
- // Any previous icon or bitmap will be removed.
 
- //
 
- // Parameters:
 
- //		[IN]	nBitmapIn
 
- //				ID number of the bitmap resource to show when the mouse is over the button.
 
- //				Pass NULL to remove any bitmap from the button.
 
- //		[IN]	crTransColorIn
 
- //				Color (inside nBitmapIn) to be used as transparent color.
 
- //		[IN]	nBitmapOut
 
- //				ID number of the bitmap resource to show when the mouse is outside the button.
 
- //				Can be NULL.
 
- //		[IN]	crTransColorOut
 
- //				Color (inside nBitmapOut) to be used as transparent color.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //		BTNST_FAILEDMASK
 
- //			Failed creating mask bitmap.
 
- //
 
- DWORD CButtonST::SetBitmaps(int nBitmapIn, COLORREF crTransColorIn, int nBitmapOut, COLORREF crTransColorOut)
 
- {
 
- 	HBITMAP		hBitmapIn		= NULL;
 
- 	HBITMAP		hBitmapOut		= NULL;
 
- 	HINSTANCE	hInstResource	= NULL;
 
- 	
 
- 	// Find correct resource handle
 
- 	hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmapIn), RT_BITMAP);
 
- 	// Load bitmap In
 
- 	hBitmapIn = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmapIn), IMAGE_BITMAP, 0, 0, 0);
 
- 	// Load bitmap Out
 
- 	switch (nBitmapOut)
 
- 	{
 
- 		case NULL:
 
- 			break;
 
- 		case (int)BTNST_AUTO_GRAY:
 
- 			hBitmapOut = (HBITMAP)BTNST_AUTO_GRAY;
 
- 			break;
 
- 		case (int)BTNST_AUTO_DARKER:
 
- 			hBitmapOut = (HBITMAP)BTNST_AUTO_DARKER;
 
- 			break;
 
- 		default:
 
- 			hBitmapOut = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmapOut), IMAGE_BITMAP, 0, 0, 0);
 
- 			break;
 
- 	} // if
 
- 	return SetBitmaps(hBitmapIn, crTransColorIn, hBitmapOut, crTransColorOut);
 
- } // End of SetBitmaps
 
- // This function assigns bitmaps to the button.
 
- // Any previous icon or bitmap will be removed.
 
- //
 
- // Parameters:
 
- //		[IN]	hBitmapIn
 
- //				Handle fo the bitmap to show when the mouse is over the button.
 
- //				Pass NULL to remove any bitmap from the button.
 
- //		[IN]	crTransColorIn
 
- //				Color (inside hBitmapIn) to be used as transparent color.
 
- //		[IN]	hBitmapOut
 
- //				Handle to the bitmap to show when the mouse is outside the button.
 
- //				Can be NULL.
 
- //		[IN]	crTransColorOut
 
- //				Color (inside hBitmapOut) to be used as transparent color.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //		BTNST_FAILEDMASK
 
- //			Failed creating mask bitmap.
 
- //
 
- DWORD CButtonST::SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn, HBITMAP hBitmapOut, COLORREF crTransColorOut)
 
- {
 
- 	int		nRetValue = 0;
 
- 	BITMAP	csBitmapSize;
 
- 	// Free any loaded resource
 
- 	FreeResources();
 
- 	if (hBitmapIn)
 
- 	{
 
- 		m_csBitmaps[0].hBitmap = hBitmapIn;
 
- 		m_csBitmaps[0].crTransparent = crTransColorIn;
 
- 		// Get bitmap size
 
- 		nRetValue = ::GetObject(hBitmapIn, sizeof(csBitmapSize), &csBitmapSize);
 
- 		if (nRetValue == 0)
 
- 		{
 
- 			FreeResources();
 
- 			return BTNST_INVALIDRESOURCE;
 
- 		} // if
 
- 		m_csBitmaps[0].dwWidth = (DWORD)csBitmapSize.bmWidth;
 
- 		m_csBitmaps[0].dwHeight = (DWORD)csBitmapSize.bmHeight;
 
- 		// Create grayscale/darker bitmap BEFORE mask (of hBitmapIn)
 
- 		switch ((int)hBitmapOut)
 
- 		{
 
- 			case (int)BTNST_AUTO_GRAY:
 
- 				hBitmapOut = CreateGrayscaleBitmap(hBitmapIn, m_csBitmaps[0].dwWidth, m_csBitmaps[0].dwHeight, crTransColorIn);
 
- 				m_csBitmaps[1].hBitmap = hBitmapOut;
 
- 				crTransColorOut = crTransColorIn;
 
- 				break;
 
- 			case (int)BTNST_AUTO_DARKER:
 
- 				hBitmapOut = CreateDarkerBitmap(hBitmapIn, m_csBitmaps[0].dwWidth, m_csBitmaps[0].dwHeight, crTransColorIn);
 
- 				m_csBitmaps[1].hBitmap = hBitmapOut;
 
- 				crTransColorOut = crTransColorIn;
 
- 				break;
 
- 		} // switch
 
- 		// Create mask for bitmap In
 
- 		m_csBitmaps[0].hMask = CreateBitmapMask(hBitmapIn, m_csBitmaps[0].dwWidth, m_csBitmaps[0].dwHeight, crTransColorIn);
 
- 		if (m_csBitmaps[0].hMask == NULL)
 
- 		{
 
- 			FreeResources();
 
- 			return BTNST_FAILEDMASK;
 
- 		} // if
 
- 		if (hBitmapOut)
 
- 		{
 
- 			m_csBitmaps[1].hBitmap = hBitmapOut;
 
- 			m_csBitmaps[1].crTransparent = crTransColorOut;
 
- 			// Get bitmap size
 
- 			nRetValue = ::GetObject(hBitmapOut, sizeof(csBitmapSize), &csBitmapSize);
 
- 			if (nRetValue == 0)
 
- 			{
 
- 				FreeResources();
 
- 				return BTNST_INVALIDRESOURCE;
 
- 			} // if
 
- 			m_csBitmaps[1].dwWidth = (DWORD)csBitmapSize.bmWidth;
 
- 			m_csBitmaps[1].dwHeight = (DWORD)csBitmapSize.bmHeight;
 
- 			// Create mask for bitmap Out
 
- 			m_csBitmaps[1].hMask = CreateBitmapMask(hBitmapOut, m_csBitmaps[1].dwWidth, m_csBitmaps[1].dwHeight, crTransColorOut);
 
- 			if (m_csBitmaps[1].hMask == NULL)
 
- 			{
 
- 				FreeResources();
 
- 				return BTNST_FAILEDMASK;
 
- 			} // if
 
- 		} // if
 
- 	} // if
 
- 	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetBitmaps
 
- // This functions 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.
 
- //				By default, CButtonST buttons are flat.
 
- //		[IN]	bRepaint
 
- //				If TRUE the control will be repainted.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //
 
- DWORD CButtonST::SetFlat(BOOL bFlat, BOOL bRepaint)
 
- {
 
- 	m_bIsFlat = bFlat;
 
- 	if (bRepaint)	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetFlat
 
- // This function sets the alignment type between icon/bitmap and text.
 
- //
 
- // Parameters:
 
- //		[IN]	byAlign
 
- //				Alignment type. Can be one of the following values:
 
- //				ST_ALIGN_HORIZ			Icon/bitmap on the left, text on the right
 
- //				ST_ALIGN_VERT			Icon/bitmap on the top, text on the bottom
 
- //				ST_ALIGN_HORIZ_RIGHT	Icon/bitmap on the right, text on the left
 
- //				ST_ALIGN_OVERLAP		Icon/bitmap on the same space as text
 
- //				By default, CButtonST 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 CButtonST::SetAlign(BYTE byAlign, BOOL bRepaint)
 
- {
 
- 	switch (byAlign)
 
- 	{    
 
- 		case ST_ALIGN_HORIZ:
 
- 		case ST_ALIGN_HORIZ_RIGHT:
 
- 		case ST_ALIGN_VERT:
 
- 		case ST_ALIGN_OVERLAP:
 
- 			m_byAlign = byAlign;
 
- 			if (bRepaint)	Invalidate();
 
- 			return BTNST_OK;
 
- 			break;
 
- 	} // switch
 
- 	return BTNST_INVALIDALIGN;
 
- } // End of SetAlign
 
- // This function sets the pressed style.
 
- //
 
- // Parameters:
 
- //		[IN]	byStyle
 
- //				Pressed style. Can be one of the following values:
 
- //				BTNST_PRESSED_LEFTRIGHT		Pressed style from left to right (as usual)
 
- //				BTNST_PRESSED_TOPBOTTOM		Pressed style from top to bottom
 
- //				By default, CButtonST buttons have BTNST_PRESSED_LEFTRIGHT style.
 
- //		[IN]	bRepaint
 
- //				If TRUE the control will be repainted.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDPRESSEDSTYLE
 
- //			Pressed style not supported.
 
- //
 
- DWORD CButtonST::SetPressedStyle(BYTE byStyle, BOOL bRepaint)
 
- {
 
- 	switch (byStyle)
 
- 	{
 
- 		case BTNST_PRESSED_LEFTRIGHT:
 
- 			m_ptPressedOffset.x = 1;
 
- 			m_ptPressedOffset.y = 1;
 
- 			break;
 
- 		case BTNST_PRESSED_TOPBOTTOM:
 
- 			m_ptPressedOffset.x = 0;
 
- 			m_ptPressedOffset.y = 2;
 
- 			break;
 
- 		default:
 
- 			return BTNST_INVALIDPRESSEDSTYLE;
 
- 	} // switch
 
- 	if (bRepaint)	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetPressedStyle
 
- // This function 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 CButtonST::SetCheck(int nCheck, BOOL bRepaint)
 
- {
 
- 	if (m_bIsCheckBox)
 
- 	{
 
- 		if (nCheck == 0) m_nCheck = 0;
 
- 		else m_nCheck = 1;
 
- 		if (bRepaint) Invalidate();
 
- 	} // if
 
- 	return BTNST_OK;
 
- } // End of SetCheck
 
- // This function 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 CButtonST::GetCheck()
 
- {
 
- 	return m_nCheck;
 
- } // End of GetCheck
 
- // This function 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 CButtonST::SetDefaultColors(BOOL bRepaint)
 
- {
 
- 	m_crColors[BTNST_COLOR_BK_IN]		= ::GetSysColor(COLOR_BTNFACE);
 
- 	m_crColors[BTNST_COLOR_FG_IN]		= ::GetSysColor(COLOR_BTNTEXT);
 
- 	m_crColors[BTNST_COLOR_BK_OUT]		= ::GetSysColor(COLOR_BTNFACE);
 
- 	m_crColors[BTNST_COLOR_FG_OUT]		= ::GetSysColor(COLOR_BTNTEXT);
 
- 	m_crColors[BTNST_COLOR_BK_FOCUS]	= ::GetSysColor(COLOR_BTNFACE);
 
- 	m_crColors[BTNST_COLOR_FG_FOCUS]	= ::GetSysColor(COLOR_BTNTEXT);
 
- 	if (bRepaint)	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetDefaultColors
 
- // This function 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 CButtonST::SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint)
 
- {
 
- 	if (byColorIndex >= BTNST_MAX_COLORS)	return BTNST_INVALIDINDEX;
 
- 	// Set new color
 
- 	m_crColors[byColorIndex] = crColor;
 
- 	if (bRepaint)	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetColor
 
- CButtonST& CButtonST::SetFontSize(int nSize)
 
- {
 
- 	CFont cf;
 
- 	LOGFONT lf;
 
- 	cf.CreatePointFont(nSize * 10, m_lf.lfFaceName);
 
- 	cf.GetLogFont(&lf);
 
- 	m_lf.lfHeight = lf.lfHeight;
 
- 	m_lf.lfWidth  = lf.lfWidth;
 
- 	//	nSize*=-1;
 
- 	//	m_lf.lfHeight = nSize;
 
- 	ReconstructFont();
 
- 	UpdateSurface();
 
- 	return *this;
 
- }
 
- CButtonST& CButtonST::SetFontName(const CString& strFont, BYTE byCharSet /* Default = ANSI_CHARSET */)
 
- {	
 
- 	m_lf.lfCharSet = byCharSet;
 
- 	_tcscpy_s(m_lf.lfFaceName,strFont);
 
- 	ReconstructFont();
 
- 	UpdateSurface();
 
- 	return *this;
 
- }
 
- void CButtonST::ReconstructFont()
 
- {
 
- 	m_font.DeleteObject();
 
- 	BOOL bCreated = m_font.CreateFontIndirect(&m_lf);
 
- 	ASSERT(bCreated);
 
- }
 
- CButtonST& CButtonST::SetFontItalic(BOOL bSet)
 
- {
 
- 	m_lf.lfItalic = bSet;
 
- 	ReconstructFont();
 
- 	UpdateSurface();
 
- 	return *this;	
 
- }
 
- CButtonST& CButtonST::SetFontUnderline(BOOL bSet)
 
- {	
 
- 	m_lf.lfUnderline = bSet;
 
- 	ReconstructFont();
 
- 	UpdateSurface();
 
- 	return *this;
 
- }
 
- CButtonST& CButtonST::SetFontBold(BOOL bBold)
 
- {	
 
- 	m_lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
 
- 	ReconstructFont();
 
- 	UpdateSurface();
 
- 	return *this;
 
- }
 
- void CButtonST::UpdateSurface()
 
- {
 
- 	CRect (rc);
 
- 	GetWindowRect(rc);
 
- 	RedrawWindow();
 
- 	GetParent()->ScreenToClient(rc);
 
- 	GetParent()->InvalidateRect(rc,TRUE);
 
- 	GetParent()->UpdateWindow();
 
- }
 
- // This functions returns the color used for a particular state.
 
- //
 
- // Parameters:
 
- //		[IN]	byColorIndex
 
- //				Index of the color to get.
 
- //				See SetColor for the list of available colors.
 
- //		[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 CButtonST::GetColor(BYTE byColorIndex, COLORREF* crpColor)
 
- {
 
- 	if (byColorIndex >= BTNST_MAX_COLORS)	return BTNST_INVALIDINDEX;
 
- 	// Get color
 
- 	*crpColor = m_crColors[byColorIndex];
 
- 	return BTNST_OK;
 
- } // End of GetColor
 
- // 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.
 
- //
 
- // Parameters:
 
- //		[IN]	byColorIndex
 
- //				Index of the color to set.
 
- //				See SetColor for the list of available colors.
 
- //		[IN]	shOffsetColor
 
- //				A short value indicating the offset to apply to the color.
 
- //				This value must be between -255 and 255.
 
- //		[IN]	bRepaint
 
- //				If TRUE the control will be repainted.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDINDEX
 
- //			Invalid color index.
 
- //		BTNST_BADPARAM
 
- //			The specified offset is out of range.
 
- //
 
- DWORD CButtonST::OffsetColor(BYTE byColorIndex, short shOffset, BOOL bRepaint)
 
- {
 
- 	BYTE	byRed = 0;
 
- 	BYTE	byGreen = 0;
 
- 	BYTE	byBlue = 0;
 
- 	short	shOffsetR = shOffset;
 
- 	short	shOffsetG = shOffset;
 
- 	short	shOffsetB = shOffset;
 
- 	if (byColorIndex >= BTNST_MAX_COLORS)	return BTNST_INVALIDINDEX;
 
- 	if (shOffset < -255 || shOffset > 255)	return BTNST_BADPARAM;
 
- 	// Get RGB components of specified color
 
- 	byRed = GetRValue(m_crColors[byColorIndex]);
 
- 	byGreen = GetGValue(m_crColors[byColorIndex]);
 
- 	byBlue = GetBValue(m_crColors[byColorIndex]);
 
- 	// Calculate max. allowed real offset
 
- 	if (shOffset > 0)
 
- 	{
 
- 		if (byRed + shOffset > 255)		shOffsetR = 255 - byRed;
 
- 		if (byGreen + shOffset > 255)	shOffsetG = 255 - byGreen;
 
- 		if (byBlue + shOffset > 255)	shOffsetB = 255 - byBlue;
 
- 		shOffset = min(min(shOffsetR, shOffsetG), shOffsetB);
 
- 	} // if
 
- 	else
 
- 	{
 
- 		if (byRed + shOffset < 0)		shOffsetR = -byRed;
 
- 		if (byGreen + shOffset < 0)		shOffsetG = -byGreen;
 
- 		if (byBlue + shOffset < 0)		shOffsetB = -byBlue;
 
- 		shOffset = max(max(shOffsetR, shOffsetG), shOffsetB);
 
- 	} // else
 
- 	// Set new color
 
- 	m_crColors[byColorIndex] = RGB(byRed + shOffset, byGreen + shOffset, byBlue + shOffset);
 
- 	if (bRepaint)	Invalidate();
 
- 	return BTNST_OK;
 
- } // End of OffsetColor
 
- // This function 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 CButtonST::SetAlwaysTrack(BOOL bAlwaysTrack)
 
- {
 
- 	m_bAlwaysTrack = bAlwaysTrack;
 
- 	return BTNST_OK;
 
- } // End of SetAlwaysTrack
 
- // This function 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 CButtonST::SetBtnCursor(int nCursorId, BOOL bRepaint)
 
- {
 
- 	HINSTANCE	hInstResource = NULL;
 
- 	// Destroy any previous cursor
 
- 	if (m_hCursor)
 
- 	{
 
- 		::DestroyCursor(m_hCursor);
 
- 		m_hCursor = NULL;
 
- 	} // if
 
- 	// Load cursor
 
- 	if (nCursorId)
 
- 	{
 
- 		hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId), RT_GROUP_CURSOR);
 
- 		// Load cursor resource
 
- 		m_hCursor = (HCURSOR)::LoadImage(hInstResource, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0);
 
- 		// Repaint the button
 
- 		if (bRepaint) Invalidate();
 
- 		// If something wrong
 
- 		if (m_hCursor == NULL) return BTNST_INVALIDRESOURCE;
 
- 	} // if
 
- 	return BTNST_OK;
 
- } // End of SetBtnCursor
 
- // This function 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 CButtonST::DrawBorder(BOOL bDrawBorder, BOOL bRepaint)
 
- {
 
- 	m_bDrawBorder = bDrawBorder;
 
- 	// Repaint the button
 
- 	if (bRepaint) Invalidate();
 
- 	return BTNST_OK;
 
- } // End of DrawBorder
 
- // This function 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 CButtonST::DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
 
- {
 
- 	m_bDrawFlatFocus = bDrawFlatFocus;
 
- 	// Repaint the button
 
- 	if (bRepaint) Invalidate();
 
- 	return BTNST_OK;
 
- } // End of DrawFlatFocus
 
- void CButtonST::InitToolTip()
 
- {
 
- 	if (m_ToolTip.m_hWnd == NULL)
 
- 	{
 
- 		// Create ToolTip control
 
- 		m_ToolTip.Create(this, m_dwToolTipStyle);
 
- 		// Create inactive
 
- 		m_ToolTip.Activate(FALSE);
 
- 		// Enable multiline
 
- 		m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, 400);
 
- 		//m_ToolTip.SendMessage(TTM_SETTITLE, TTI_INFO, (LPARAM)_T("Title"));
 
- 	} // if
 
- } // End of InitToolTip
 
- // This function sets the text to show in the button tooltip.
 
- //
 
- // Parameters:
 
- //		[IN]	nText
 
- //				ID number of the string resource containing the text to show.
 
- //		[IN]	bActivate
 
- //				If TRUE the tooltip will be created active.
 
- //
 
- void CButtonST::SetTooltipText(int nText, BOOL bActivate)
 
- {
 
- 	CString sText;
 
- 	// Load string resource
 
- 	sText.LoadString(nText);
 
- 	// If string resource is not empty
 
- 	if (sText.IsEmpty() == FALSE) SetTooltipText((LPCTSTR)sText, bActivate);
 
- } // End of SetTooltipText
 
- // This function sets the text to show in the button tooltip.
 
- //
 
- // Parameters:
 
- //		[IN]	lpszText
 
- //				Pointer to a null-terminated string containing the text to show.
 
- //		[IN]	bActivate
 
- //				If TRUE the tooltip will be created active.
 
- //
 
- void CButtonST::SetTooltipText(LPCTSTR lpszText, BOOL bActivate)
 
- {
 
- 	// We cannot accept NULL pointer
 
- 	if (lpszText == NULL) return;
 
- 	// Initialize ToolTip
 
- 	InitToolTip();
 
- 	// If there is no tooltip defined then add it
 
- 	if (m_ToolTip.GetToolCount() == 0)
 
- 	{
 
- 		CRect rectBtn; 
 
- 		GetClientRect(rectBtn);
 
- 		m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
 
- 	} // if
 
- 	// Set text for tooltip
 
- 	m_ToolTip.UpdateTipText(lpszText, this, 1);
 
- 	m_ToolTip.Activate(bActivate);
 
- } // End of SetTooltipText
 
- // This function enables or disables the button tooltip.
 
- //
 
- // Parameters:
 
- //		[IN]	bActivate
 
- //				If TRUE the tooltip will be activated.
 
- //
 
- void CButtonST::ActivateTooltip(BOOL bActivate)
 
- {
 
- 	// If there is no tooltip then do nothing
 
- 	if (m_ToolTip.GetToolCount() == 0) return;
 
- 	// Activate tooltip
 
- 	m_ToolTip.Activate(bActivate);
 
- } // End of EnableTooltip
 
- // This function enables the tooltip to be displayed using the balloon style.
 
- // This function must be called before any call to SetTooltipText is made.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //
 
- DWORD CButtonST::EnableBalloonTooltip()
 
- {
 
- 	m_dwToolTipStyle |= TTS_BALLOON;
 
- 	return BTNST_OK;
 
- } // End of EnableBalloonTooltip
 
- // This function 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 CButtonST::GetDefault()
 
- {
 
- 	return m_bIsDefault;
 
- } // End of GetDefault
 
- // This function enables 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.
 
- //
 
- // Parameters:
 
- //		[IN]	bRepaint
 
- //				If TRUE the control will be repainted.
 
- //
 
- void CButtonST::DrawTransparent(BOOL bRepaint)
 
- {
 
- 	m_bDrawTransparent = TRUE;
 
- 	// Restore old bitmap (if any)
 
- 	if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
 
- 	{
 
- 		m_dcBk.SelectObject(m_pbmpOldBk);
 
- 	} // if
 
- 	m_bmpBk.DeleteObject();
 
- 	m_dcBk.DeleteDC();
 
- 	// Repaint the button
 
- 	if (bRepaint) Invalidate();
 
- } // End of DrawTransparent
 
- DWORD CButtonST::SetBk(CDC* pDC)
 
- {
 
- 	if (m_bDrawTransparent && pDC)
 
- 	{
 
- 		// Restore old bitmap (if any)
 
- 		if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
 
- 		{
 
- 			m_dcBk.SelectObject(m_pbmpOldBk);
 
- 		} // if
 
- 		m_bmpBk.DeleteObject();
 
- 		m_dcBk.DeleteDC();
 
- 		CRect rect;
 
- 		CRect rect1;
 
- 		GetClientRect(rect);
 
- 		GetWindowRect(rect1);
 
- 		GetParent()->ScreenToClient(rect1);
 
- 		m_dcBk.CreateCompatibleDC(pDC);
 
- 		m_bmpBk.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
 
- 		m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
 
- 		m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, rect1.left, rect1.top, SRCCOPY);
 
- 		return BTNST_OK;
 
- 	} // if
 
- 	return BTNST_BADPARAM;
 
- } // End of SetBk
 
- // This function 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 CButtonST::SetURL(LPCTSTR lpszURL)
 
- {
 
- 	// Remove any existing URL
 
- 	memset(m_szURL, 0, sizeof(m_szURL));
 
- 	if (lpszURL)
 
- 	{
 
- 		// Store the URL
 
- 		_tcsncpy_s(m_szURL, lpszURL, _MAX_PATH);
 
- 	} // if
 
- 	return BTNST_OK;
 
- } // End of SetURL
 
- // This function 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.
 
- //
 
- #ifndef	BTNST_USE_BCMENU
 
- DWORD CButtonST::SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint)
 
- {
 
- 	HINSTANCE	hInstResource	= NULL;
 
- 	// Destroy any previous menu
 
- 	if (m_hMenu)
 
- 	{
 
- 		::DestroyMenu(m_hMenu);
 
- 		m_hMenu = NULL;
 
- 		m_hParentWndMenu = NULL;
 
- 		m_bMenuDisplayed = FALSE;
 
- 	} // if
 
- 	// Load menu
 
- 	if (nMenu)
 
- 	{
 
- 		// Find correct resource handle
 
- 		hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nMenu), RT_MENU);
 
- 		// Load menu resource
 
- 		m_hMenu = ::LoadMenu(hInstResource, MAKEINTRESOURCE(nMenu));
 
- 		m_hParentWndMenu = hParentWnd;
 
- 		// If something wrong
 
- 		if (m_hMenu == NULL) return BTNST_INVALIDRESOURCE;
 
- 	} // if
 
- 	// Repaint the button
 
- 	if (bRepaint) Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetMenu
 
- #endif
 
- // This function associates a menu to the button.
 
- // The menu will be displayed clicking the button.
 
- // The menu will be handled by the BCMenu class.
 
- //
 
- // 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]	bWinXPStyle
 
- //				If TRUE the menu will be displayed using the new Windows XP style.
 
- //				If FALSE the menu will be displayed using the standard style.
 
- //		[IN]	nToolbarID
 
- //				Resource ID of the toolbar to be associated to the menu.
 
- //		[IN]	sizeToolbarIcon
 
- //				A CSize object indicating the size (in pixels) of each icon into the toolbar.
 
- //				All icons into the toolbar must have the same size.
 
- //		[IN]	crToolbarBk
 
- //				A COLORREF value indicating the color to use as background for the icons into the toolbar.
 
- //				This color will be used as the "transparent" color.
 
- //		[IN]	bRepaint
 
- //				If TRUE the control will be repainted.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //		BTNST_INVALIDRESOURCE
 
- //			Failed loading the specified resource.
 
- //
 
- #ifdef	BTNST_USE_BCMENU
 
- DWORD CButtonST::SetMenu(UINT nMenu, HWND hParentWnd, BOOL bWinXPStyle, UINT nToolbarID, CSize sizeToolbarIcon, COLORREF crToolbarBk, BOOL bRepaint)
 
- {
 
- 	BOOL	bRetValue = FALSE;
 
- 	// Destroy any previous menu
 
- 	if (m_menuPopup.m_hMenu)
 
- 	{
 
- 		m_menuPopup.DestroyMenu();
 
- 		m_hParentWndMenu = NULL;
 
- 		m_bMenuDisplayed = FALSE;
 
- 	} // if
 
- 	// Load menu
 
- 	if (nMenu)
 
- 	{
 
- 		m_menuPopup.SetMenuDrawMode(bWinXPStyle);
 
- 		// Load menu
 
- 		bRetValue = m_menuPopup.LoadMenu(nMenu);
 
- 		// If something wrong
 
- 		if (bRetValue == FALSE) return BTNST_INVALIDRESOURCE;
 
- 		// Load toolbar
 
- 		if (nToolbarID)
 
- 		{
 
- 			m_menuPopup.SetBitmapBackground(crToolbarBk);
 
- 			m_menuPopup.SetIconSize(sizeToolbarIcon.cx, sizeToolbarIcon.cy);
 
- 			bRetValue = m_menuPopup.LoadToolbar(nToolbarID);
 
- 			// If something wrong
 
- 			if (bRetValue == FALSE) 
 
- 			{
 
- 				m_menuPopup.DestroyMenu();
 
- 				return BTNST_INVALIDRESOURCE;
 
- 			} // if
 
- 		} // if
 
- 		m_hParentWndMenu = hParentWnd;
 
- 	} // if
 
- 	// Repaint the button
 
- 	if (bRepaint) Invalidate();
 
- 	return BTNST_OK;
 
- } // End of SetMenu
 
- #endif
 
- // This function sets the callback message that will be sent to the
 
- // specified window just before the menu associated to the button is displayed.
 
- //
 
- // Parameters:
 
- //		[IN]	hWnd
 
- //				Handle of the window that will receive the callback message.
 
- //				Pass NULL to remove any previously specified callback message.
 
- //		[IN]	nMessage
 
- //				Callback message to send to window.
 
- //		[IN]	lParam
 
- //				A 32 bits user specified value that will be passed to the callback function.
 
- //
 
- // Remarks:
 
- //		the callback function must be in the form:
 
- //		LRESULT On_MenuCallback(WPARAM wParam, LPARAM lParam)
 
- //		Where:
 
- //				[IN]	wParam
 
- //						If support for BCMenu is enabled: a pointer to BCMenu
 
- //						else a HMENU handle to the menu that is being to be displayed.
 
- //				[IN]	lParam
 
- //						The 32 bits user specified value.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //
 
- DWORD CButtonST::SetMenuCallback(HWND hWnd, UINT nMessage, LPARAM lParam)
 
- {
 
- 	m_csCallbacks.hWnd = hWnd;
 
- 	m_csCallbacks.nMessage = nMessage;
 
- 	m_csCallbacks.lParam = lParam;
 
- 	return BTNST_OK;
 
- } // End of SetMenuCallback
 
- // This function 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 CButtonST::SizeToContent()
 
- {
 
- 	if (m_csIcons[0].hIcon)
 
- 	{
 
- 		m_ptImageOrg.x = 0;
 
- 		m_ptImageOrg.y = 0;
 
- 	    SetWindowPos(	NULL, -1, -1, m_csIcons[0].dwWidth, m_csIcons[0].dwHeight,
 
- 						SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE);
 
- 	} // if
 
- 	else
 
- 	if (m_csBitmaps[0].hBitmap)
 
- 	{
 
- 		m_ptImageOrg.x = 0;
 
- 		m_ptImageOrg.y = 0;
 
- 	    SetWindowPos(	NULL, -1, -1, m_csBitmaps[0].dwWidth, m_csBitmaps[0].dwHeight,
 
- 						SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE);
 
- 	} // if
 
- } // End of SizeToContent
 
- // This function sets the sound that must be played on particular button states.
 
- //
 
- // Parameters:
 
- //		[IN]	lpszSound
 
- //				A string that specifies the sound to play.
 
- //				If hMod is NULL this string is interpreted as a filename, else it
 
- //				is interpreted as a resource identifier.
 
- //				Pass NULL to remove any previously specified sound.
 
- //		[IN]	hMod
 
- //				Handle to the executable file that contains the resource to be loaded.
 
- //				This parameter must be NULL unless lpszSound specifies a resource identifier.
 
- //		[IN]	bPlayOnClick
 
- //				TRUE if the sound must be played when the button is clicked.
 
- //				FALSE if the sound must be played when the mouse is moved over the button.
 
- //		[IN]	bPlayAsync
 
- //				TRUE if the sound must be played asynchronously.
 
- //				FALSE if the sound must be played synchronously. The application takes control
 
- //				when the sound is completely played.
 
- //
 
- // Return value:
 
- //		BTNST_OK
 
- //			Function executed successfully.
 
- //
 
- #ifdef	BTNST_USE_SOUND
 
- DWORD CButtonST::SetSound(LPCTSTR lpszSound, HMODULE hMod, BOOL bPlayOnClick, BOOL bPlayAsync)
 
- {
 
- 	BYTE	byIndex = bPlayOnClick ? 1 : 0;
 
- 	// Store new sound
 
- 	if (lpszSound)
 
- 	{
 
- 		if (hMod)	// From resource identifier ?
 
- 		{
 
- 			m_csSounds[byIndex].lpszSound = lpszSound;
 
- 		} // if
 
- 		else
 
- 		{
 
- 			_tcscpy_s(m_csSounds[byIndex].szSound, lpszSound);
 
- 			m_csSounds[byIndex].lpszSound = m_csSounds[byIndex].szSound;
 
- 		} // else
 
- 		m_csSounds[byIndex].hMod = hMod;
 
- 		m_csSounds[byIndex].dwFlags = SND_NODEFAULT | SND_NOWAIT;
 
- 		m_csSounds[byIndex].dwFlags |= hMod ? SND_RESOURCE : SND_FILENAME;
 
- 		m_csSounds[byIndex].dwFlags |= bPlayAsync ? SND_ASYNC : SND_SYNC;
 
- 	} // if
 
- 	else
 
- 	{
 
- 		// Or remove any existing
 
- 		::ZeroMemory(&m_csSounds[byIndex], sizeof(STRUCT_SOUND));
 
- 	} // else
 
- 	return BTNST_OK;
 
- } // End of SetSound
 
- #endif
 
- // 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.
 
- //
 
- // 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.
 
- //
 
- DWORD CButtonST::OnDrawBackground(CDC* pDC, CRect* pRect)
 
- {
 
- 	COLORREF	crColor;
 
- 	if (m_bIsFlat == FALSE)
 
- 	{
 
- 		if (m_bIsFocused || m_bIsDefault)
 
- 		{
 
- 			CBrush br(RGB(0,0,0));  
 
- 			pDC->FrameRect(pRect, &br);
 
- 			pRect->DeflateRect(1, 1);
 
- 		} // if
 
- 	} // if
 
- 	if (m_bMouseOnButton || m_bIsPressed)
 
- 		crColor = m_crColors[BTNST_COLOR_BK_IN];
 
- 	else
 
- 	{
 
- 		if (m_bIsFocused)
 
- 			crColor = m_crColors[BTNST_COLOR_BK_FOCUS];
 
- 		else
 
- 			crColor = m_crColors[BTNST_COLOR_BK_OUT];
 
- 	} // else
 
- 	CBrush		brBackground(crColor);
 
- 	pDC->FillRect(pRect, &brBackground);
 
- 	return BTNST_OK;
 
- } // End of OnDrawBackground
 
- // 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.
 
- //
 
- // 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.
 
- //
 
- DWORD CButtonST::OnDrawBorder(CDC* pDC, CRect* pRect)
 
- {
 
- 	// Draw pressed button
 
- 	if (m_bIsPressed)
 
- 	{
 
- 		if (m_bIsFlat)
 
- 		{
 
- 			if (m_bDrawBorder)
 
- 				pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT));
 
- 		}
 
- 		else    
 
- 		{
 
- 			CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
 
- 			pDC->FrameRect(pRect, &brBtnShadow);
 
- 		}
 
- 	}
 
- 	else // ...else draw non pressed button
 
- 	{
 
- 		CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
 
- 		CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
 
- 		CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
 
- 		CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
 
- 		if (m_bIsFlat)
 
- 		{
 
- 			if (m_bMouseOnButton && m_bDrawBorder)
 
- 				pDC->Draw3dRect(pRect, ::GetSysColor(COLOR_BTNHILIGHT), ::GetSysColor(COLOR_BTNSHADOW));
 
- 		}
 
- 		else
 
- 		{
 
- 			// Draw top-left borders
 
- 			// White line
 
- 			CPen* pOldPen = pDC->SelectObject(&penBtnHiLight);
 
- 			pDC->MoveTo(pRect->left, pRect->bottom-1);
 
- 			pDC->LineTo(pRect->left, pRect->top);
 
- 			pDC->LineTo(pRect->right, pRect->top);
 
- 			// Light gray line
 
- 			pDC->SelectObject(pen3DLight);
 
- 			pDC->MoveTo(pRect->left+1, pRect->bottom-1);
 
- 			pDC->LineTo(pRect->left+1, pRect->top+1);
 
- 			pDC->LineTo(pRect->right, pRect->top+1);
 
- 			// Draw bottom-right borders
 
- 			// Black line
 
- 			pDC->SelectObject(pen3DDKShadow);
 
- 			pDC->MoveTo(pRect->left, pRect->bottom-1);
 
- 			pDC->LineTo(pRect->right-1, pRect->bottom-1);
 
- 			pDC->LineTo(pRect->right-1, pRect->top-1);
 
- 			// Dark gray line
 
- 			pDC->SelectObject(penBtnShadow);
 
- 			pDC->MoveTo(pRect->left+1, pRect->bottom-2);
 
- 			pDC->LineTo(pRect->right-2, pRect->bottom-2);
 
- 			pDC->LineTo(pRect->right-2, pRect->top);
 
- 			//
 
- 			pDC->SelectObject(pOldPen);
 
- 		} // else
 
- 	} // else
 
- 	return BTNST_OK;
 
- } // End of OnDrawBorder
 
- #undef BS_TYPEMASK
 
 
  |