www.pudn.com > WBDraw.rar > BtnST.cpp


#include "stdafx.h" 
#include "BtnST.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CButtonST 
 
CButtonST::CButtonST() 
{ 
	m_MouseOnButton = FALSE; 
 
	m_hIconIn = NULL; 
	m_hIconOut = NULL; 
	m_cxIcon = 0; 
	m_cyIcon = 0; 
	m_hCursor = NULL; 
////////////////////////////////////////////////////////////////////////////////////////// 
	m_iImageInIdx=0; 
	m_iImageOutIdx=0; 
	m_pList=NULL; 
/////////////////////////////////////////////////////////////////////////////////////////// 
	m_pFont=NULL; 
   
	// Default type is "flat" button 
	m_bIsFlat = TRUE;  
   
	// By default draw border in "flat" button  
	m_bDrawBorder = TRUE;  
   
	// By default icon is aligned horizontally 
	m_nAlign = ST_ALIGN_HORIZ;  
   
	// By default show the text button 
	m_bShowText = TRUE;  
   
	// 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; 
 
	SetDefaultInactiveBgColor(); 
	SetDefaultInactiveFgColor(); 
	SetDefaultActiveBgColor(); 
	SetDefaultActiveFgColor(); 
 
	// No tooltip created 
	m_ToolTip.m_hWnd = NULL; 
 
	// Do not draw as a transparent button 
	m_bDrawTransparent = FALSE; 
	m_pbmpOldBk = NULL; 
} // End of CButtonST 
 
 
CButtonST::~CButtonST() 
{ 
	// Restore old bitmap (if any) 
	if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL) 
	{ 
		m_dcBk.SelectObject(m_pbmpOldBk); 
	} 
 
	// Destroy the icons (if any) 
	// Note: the following two lines MUST be here! even if 
	// BoundChecker says they are unnecessary! 
	if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn); 
	if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut); 
	// Destroy the cursor (if any) 
	if (m_hCursor != NULL) ::DestroyCursor(m_hCursor); 
} // End of ~CButtonST 
 
 
BEGIN_MESSAGE_MAP(CButtonST, CButton) 
    //{{AFX_MSG_MAP(CButtonST) 
	ON_WM_CAPTURECHANGED() 
	ON_WM_SETCURSOR() 
	ON_WM_KILLFOCUS() 
	ON_WM_MOUSEMOVE() 
	ON_WM_CTLCOLOR_REFLECT() 
	ON_WM_SYSCOLORCHANGE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
void CButtonST::SetIcon(int nIconInId, int nIconOutId) 
{ 
	HICON hIconIn; 
	HICON hIconOut; 
	HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId), RT_GROUP_ICON); 
 
	// Set icon when the mouse is IN the button 
	hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0); 
  	// Set icon when the mouse is OUT the button 
	hIconOut = (nIconOutId == NULL) ? NULL : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0); 
 
	SetIcon(hIconIn, hIconOut); 
/* 
	// Note: the following two lines MUST be here! even if 
	// BoundChecker says they are unnecessary! 
	if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn); 
	if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut); 
 
	// Set icon when the mouse is IN the button 
	m_hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0); 
  	// Set icon when the mouse is OUT the button 
	m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0); 
   
	ICONINFO ii; 
 
	// Get icon dimension 
	ZeroMemory(&ii, sizeof(ICONINFO)); 
	::GetIconInfo(m_hIconIn, &ii); 
 
	m_cxIcon = (BYTE)(ii.xHotspot * 2); 
	m_cyIcon = (BYTE)(ii.yHotspot * 2); 
    ::DeleteObject(ii.hbmMask); 
	::DeleteObject(ii.hbmColor); 
 
	RedrawWindow(); 
*/ 
} // End of SetIcon 
 
void CButtonST::SetIcon(HICON hIconIn, HICON hIconOut) 
{ 
	// Note: the following two lines MUST be here! even if 
	// BoundChecker says they are unnecessary! 
	if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn); 
	if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut); 
 
	// Set icon when the mouse is IN the button 
	m_hIconIn = hIconIn; 
	// Set icon when the mouse is OUT the button 
	m_hIconOut = (hIconOut == NULL) ? m_hIconIn : hIconOut; 
   
	ICONINFO ii; 
 
	// Get icon dimension 
	ZeroMemory(&ii, sizeof(ICONINFO)); 
	::GetIconInfo(m_hIconIn, &ii); 
 
	m_cxIcon = (BYTE)(ii.xHotspot * 2); 
	m_cyIcon = (BYTE)(ii.yHotspot * 2); 
    ::DeleteObject(ii.hbmMask); 
	::DeleteObject(ii.hbmColor); 
 
	RedrawWindow(); 
} // End of SetIcon 
 
BOOL CButtonST::SetBtnCursor(int nCursorId) 
{ 
	HINSTANCE hInstResource; 
	// Destroy any previous cursor 
	if (m_hCursor != NULL) ::DestroyCursor(m_hCursor); 
	m_hCursor = NULL; 
 
	// If we want a cursor 
	if (nCursorId != -1) 
	{ 
		hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId), 
											RT_GROUP_CURSOR); 
		// Load icon resource 
		m_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0); 
		// If something wrong then return FALSE 
		if (m_hCursor == NULL) return FALSE; 
	} 
 
	return TRUE; 
} // End of SetBtnCursor 
 
void CButtonST::SetImageList(CImageList * pList,int in,int out,int cx,int cy) 
{ 
	m_pList=pList; 
	m_iImageInIdx=in; 
	m_iImageOutIdx=out; 
	m_cyIcon=cy; 
	m_cxIcon=cx; 
 
} 
 
 
void CButtonST::SetFlat(BOOL bState) 
{ 
  m_bIsFlat = bState; 
  Invalidate(); 
} // End of SetFlat 
 
 
BOOL CButtonST::GetFlat() 
{ 
  return m_bIsFlat; 
} // End of GetFlat 
 
 
void CButtonST::SetAlign(int nAlign) 
{ 
  switch (nAlign) 
  {     
    case ST_ALIGN_HORIZ: 
         m_nAlign = ST_ALIGN_HORIZ; 
         break; 
    case ST_ALIGN_HORIZ_RIGHT: 
         m_nAlign = ST_ALIGN_HORIZ_RIGHT; 
         break; 
    case ST_ALIGN_VERT: 
         m_nAlign = ST_ALIGN_VERT; 
         break; 
  } 
  Invalidate(); 
} // End of SetAlign 
 
 
int CButtonST::GetAlign() 
{ 
  return m_nAlign; 
} // End of GetAlign 
 
 
void CButtonST::DrawBorder(BOOL bEnable) 
{ 
  m_bDrawBorder = bEnable; 
} // End of DrawBorder 
 
 
const char* CButtonST::GetVersionC() 
{ 
  return "2.6"; 
} // End of GetVersionC 
 
 
const short CButtonST::GetVersionI() 
{ 
  return 26; // Divide by 10 to get actual version 
} // End of GetVersionI 
 
 
void CButtonST::SetShowText(BOOL bShow) 
{ 
  m_bShowText = bShow; 
  Invalidate(); 
} // End of SetShowText 
 
 
BOOL CButtonST::GetShowText() 
{ 
  return m_bShowText; 
} // End of GetShowText 
 
 
void CButtonST::OnMouseMove(UINT nFlags, CPoint point) 
{ 
	CWnd* pWnd;  // Finestra attiva 
	CWnd* pParent; // Finestra che contiene il bottone 
 
	CButton::OnMouseMove(nFlags, point); 
 
	// If the mouse enter the button with the left button pressed 
	// then do nothing 
	if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return; 
 
	// If our button is not flat then do nothing 
	if (m_bIsFlat == FALSE) return; 
 
	pWnd = GetActiveWindow(); 
	pParent = GetOwner(); 
 
	if ((GetCapture() != this) &&  
		( 
#ifndef ST_LIKEIE 
		pWnd != NULL &&  
#endif 
		pParent != NULL))  
	{ 
		m_MouseOnButton = TRUE; 
		//SetFocus();	// Thanks Ralph! 
		SetCapture(); 
		Invalidate(); 
	} 
	else 
	{ 
		/* 
		CRect rc; 
		GetClientRect(&rc); 
		if (!rc.PtInRect(point)) 
		{ 
		*/ 
 
		POINT p2 = point; 
		ClientToScreen(&p2); 
		CWnd* wndUnderMouse = WindowFromPoint(p2); 
//		if (wndUnderMouse != this) 
		if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd) 
		{ 
			// Redraw only if mouse goes out 
			if (m_MouseOnButton == TRUE) 
			{ 
				m_MouseOnButton = FALSE; 
				Invalidate(); 
			} 
			// If user is NOT pressing left button then release capture! 
			if (!(nFlags & MK_LBUTTON)) ReleaseCapture(); 
		} 
	} 
} // End of OnMouseMove 
 
 
void CButtonST::OnKillFocus(CWnd * pNewWnd) 
{ 
  CButton::OnKillFocus(pNewWnd); 
 
  // If our button is not flat then do nothing 
  if (m_bIsFlat == FALSE) return; 
 
  if (m_MouseOnButton == TRUE) 
  { 
    m_MouseOnButton = FALSE; 
    Invalidate(); 
  } 
} // End of OnKillFocus 
 
 
void CButtonST::OnCaptureChanged(CWnd *pWnd)  
{ 
	if (m_MouseOnButton == TRUE) 
	{ 
		ReleaseCapture(); 
		Invalidate(); 
	} 
 
	// Call base message handler 
	CButton::OnCaptureChanged(pWnd); 
} // End of OnCaptureChanged 
 
 
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
{ 
#ifdef ST_USE_MEMDC 
  CDC  *pdrawDC = CDC::FromHandle(lpDIS->hDC); 
  CDMemDC memDC(pdrawDC); 
  CDC  *pDC = &memDC; 
#else	 
  CDC* pDC = CDC::FromHandle(lpDIS->hDC); 
#endif 
  CPen *pOldPen; 
  BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED); 
  BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS); 
  BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED); 
 
  CRect itemRect = lpDIS->rcItem; 
 
  pDC->SetBkMode(TRANSPARENT); 
 
  if (m_bIsFlat == FALSE) 
  { 
    if (bIsFocused || (GetDefault() == TRUE)) 
    { 
      CBrush br(RGB(0,0,0));   
      pDC->FrameRect(&itemRect, &br); 
      itemRect.DeflateRect(1, 1); 
    } 
  } 
 
  // Prepare draw... paint button's area with background color 
  COLORREF bgColor; 
  if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
    bgColor = GetActiveBgColor(); 
  else 
    bgColor = GetInactiveBgColor(); 
 
	CBrush br(bgColor); 
	// Draw transparent? 
	if (m_bDrawTransparent == TRUE) 
	{ 
		PaintBk(pDC); 
	} 
	else 
	{ 
		pDC->FillRect(&itemRect, &br); 
	} 
 
	// Disegno lo sfondo del bottone 
//CBrush br(GetSysColor(COLOR_BTNFACE));   
//pDC->FillRect(&itemRect, &br); 
 
  // Draw pressed button 
  if (bIsPressed) 
  { 
    if (m_bIsFlat == TRUE) 
    { 
      if (m_bDrawBorder == TRUE) 
      { 
		  pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT)); 
/* 
	    CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco 
        CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro 
 
        // Disegno i bordi a sinistra e in alto 
        // Dark gray line 
        pOldPen = pDC->SelectObject(&penBtnShadow); 
        pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
        pDC->LineTo(itemRect.left, itemRect.top); 
        pDC->LineTo(itemRect.right, itemRect.top); 
        // Disegno i bordi a destra e in basso 
        // White line 
        pDC->SelectObject(penBtnHiLight); 
        pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
        pDC->LineTo(itemRect.right-1, itemRect.bottom-1); 
        pDC->LineTo(itemRect.right-1, itemRect.top-1); 
        // 
        pDC->SelectObject(pOldPen); 
*/ 
      } 
    } 
    else     
    { 
      CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW)); 
      pDC->FrameRect(&itemRect, &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 == TRUE) 
    { 
      if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE) 
      { 
		  pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNHILIGHT), ::GetSysColor(COLOR_BTNSHADOW)); 
/* 
  	    // Disegno i bordi a sinistra e in alto 
        // White line 
        pOldPen = pDC->SelectObject(&penBtnHiLight); 
        pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
        pDC->LineTo(itemRect.left, itemRect.top); 
        pDC->LineTo(itemRect.right, itemRect.top); 
        // Disegno i bordi a destra e in basso 
        // Dark gray line 
        pDC->SelectObject(penBtnShadow); 
        pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
        pDC->LineTo(itemRect.right-1, itemRect.bottom-1); 
        pDC->LineTo(itemRect.right-1, itemRect.top-1); 
        // 
        pDC->SelectObject(pOldPen); 
*/ 
      } 
    } 
    else 
    { 
      // Disegno i bordi a sinistra e in alto 
      // White line 
      pOldPen = pDC->SelectObject(&penBtnHiLight); 
      pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
      pDC->LineTo(itemRect.left, itemRect.top); 
      pDC->LineTo(itemRect.right, itemRect.top); 
      // Light gray line 
      pDC->SelectObject(pen3DLight); 
      pDC->MoveTo(itemRect.left+1, itemRect.bottom-1); 
      pDC->LineTo(itemRect.left+1, itemRect.top+1); 
      pDC->LineTo(itemRect.right, itemRect.top+1); 
      // Disegno i bordi a destra e in basso 
      // Black line 
      pDC->SelectObject(pen3DDKShadow); 
      pDC->MoveTo(itemRect.left, itemRect.bottom-1); 
      pDC->LineTo(itemRect.right-1, itemRect.bottom-1); 
      pDC->LineTo(itemRect.right-1, itemRect.top-1); 
      // Dark gray line 
      pDC->SelectObject(penBtnShadow); 
      pDC->MoveTo(itemRect.left+1, itemRect.bottom-2); 
      pDC->LineTo(itemRect.right-2, itemRect.bottom-2); 
      pDC->LineTo(itemRect.right-2, itemRect.top); 
      // 
      pDC->SelectObject(pOldPen); 
    } 
  } 
 
  // Read the button's title 
  CString sTitle; 
  GetWindowText(sTitle); 
 
  // If we don't want the title displayed 
  if (m_bShowText == FALSE) sTitle.Empty(); 
 
  CRect captionRect = lpDIS->rcItem; 
 
  // Draw the icon 
  if (m_hIconIn != NULL||m_pList!=NULL) 
  { 
    DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled); 
  } 
 
  // Write the button title (if any) 
  if (sTitle.IsEmpty() == FALSE) 
  { 
    // Disegno la caption del bottone 
    // Se il bottone e' premuto muovo la captionRect di conseguenza 
    if (bIsPressed) 
      captionRect.OffsetRect(1, 1); 
     
    // ONLY FOR DEBUG  
    // Evidenzia il rettangolo in cui verra' centrata la caption  
    //CBrush brBtnShadow(RGB(255, 0, 0)); 
    //pDC->FrameRect(&captionRect, &brBtnShadow); 
 
#ifdef ST_USE_MEMDC 
	// Get dialog's font 
    CFont *pCurrentFont = GetFont();  
    CFont *pOldFont = pDC->SelectObject(pCurrentFont); 
#endif 
	CFont *pocf=NULL; 
//	cf.CreateFont(12,6,0,0,0,0,0,0,0,0,0,0,0,"ËÎÌå"); 
	if(m_pFont) 
		pocf=pDC->SelectObject(m_pFont); 
    if ((m_MouseOnButton == TRUE) || (bIsPressed))  
	{ 
      pDC->SetTextColor(GetActiveFgColor()); 
      pDC->SetBkColor(GetActiveBgColor()); 
    }  
	else  
	{ 
      pDC->SetTextColor(GetInactiveFgColor()); 
      pDC->SetBkColor(GetInactiveBgColor()); 
    } 
    // Center text 
    CRect centerRect = captionRect; 
    pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT); 
    captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2); 
	/* RFU 
    captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2); 
    captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2); 
	*/ 
 
	pDC->SetBkMode(TRANSPARENT); 
    pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL),  
                   TRUE, 0, (CBrush*)NULL); 
	if(m_pFont) 
		pDC->SelectObject(pocf); 
#ifdef ST_USE_MEMDC 
    pDC->SelectObject(pOldFont); 
#endif 
  } 
 
  if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE)) 
  { 
    // Draw the focus rect 
    if (bIsFocused) 
    { 
      CRect focusRect = itemRect; 
      focusRect.DeflateRect(3, 3); 
      pDC->DrawFocusRect(&focusRect); 
    } 
  } 
} // End of DrawItem 
 
void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled) 
{ 
	CRect iconRect = rcItem; 
	CRect btnRect; 
 
  switch (m_nAlign) 
  { 
    case ST_ALIGN_HORIZ: 
         if (title->IsEmpty()) 
         { 
           // Center the icon horizontally 
           iconRect.left += ((iconRect.Width() - m_cxIcon)/2); 
         } 
         else 
         { 
           // L'icona deve vedersi subito dentro il focus rect 
           iconRect.left += 3;   
           captionRect->left += m_cxIcon + 3; 
         } 
         // Center the icon vertically 
         iconRect.top += ((iconRect.Height() - m_cyIcon)/2); 
         break; 
	case ST_ALIGN_HORIZ_RIGHT: 
			GetClientRect(&btnRect); 
			if (title->IsEmpty()) 
			{ 
				// Center the icon horizontally 
				iconRect.left += ((iconRect.Width() - m_cxIcon)/2); 
			} 
			else 
			{ 
				// L'icona deve vedersi subito dentro il focus rect 
				captionRect->right = captionRect->Width() - m_cxIcon - 3; 
				captionRect->left = 3; 
				iconRect.left = btnRect.right - m_cxIcon - 3; 
				// Center the icon vertically 
				iconRect.top += ((iconRect.Height() - m_cyIcon)/2); 
			} 
	break; 
    case ST_ALIGN_VERT: 
         // Center the icon horizontally 
         iconRect.left += ((iconRect.Width() - m_cxIcon)/2); 
         if (title->IsEmpty()) 
         { 
           // Center the icon vertically 
           iconRect.top += ((iconRect.Height() - m_cyIcon)/2);            
         } 
         else 
         { 
           captionRect->top += m_cyIcon; 
         } 
         break; 
  } 
     
  // If button is pressed then press the icon also 
  if (IsPressed) iconRect.OffsetRect(1, 1); 
  // Ole'! 
  if(m_pList) 
	  m_pList->DrawIndirect(pDC,(m_MouseOnButton == TRUE || IsPressed) ? m_iImageInIdx : m_iImageOutIdx,iconRect.TopLeft(),iconRect.Size(),CPoint(0,0),(IsDisabled ? ILD_MASK : ILD_NORMAL)); 
  else  
	  pDC->DrawState(	iconRect.TopLeft(), 
					iconRect.Size(),  
					(m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut,  
					(IsDisabled ? DSS_DISABLED : DSS_NORMAL),  
					(CBrush*)NULL); 
   
} // End of DrawTheIcon 
 
 
void CButtonST::PreSubclassWindow()  
{ 
	UINT nBS; 
 
	nBS = GetButtonStyle(); 
 
	// Check if this is the default button 
	if (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE; 
 
	// Add BS_OWNERDRAW style 
	SetButtonStyle(nBS | BS_OWNERDRAW); 
 
	CButton::PreSubclassWindow(); 
} // End of PreSubclassWindow 
 
 
BOOL CButtonST::PreTranslateMessage(MSG* pMsg)  
{ 
	InitToolTip(); 
	m_ToolTip.RelayEvent(pMsg); 
	 
	return CButton::PreTranslateMessage(pMsg); 
} // End of PreTranslateMessage 
 
 
LRESULT CButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	if (message == WM_LBUTTONDBLCLK) 
	{ 
		message = WM_LBUTTONDOWN; 
	} 
	return CButton::DefWindowProc(message, wParam, lParam); 
} // End of DefWindowProc 
 
 
void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint) 
{ 
	m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE);  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetDefaultInactiveBgColor 
 
 
void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint) 
{ 
	m_crInactiveBg = crNew;  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetInactiveBgColor 
 
 
const COLORREF CButtonST::GetInactiveBgColor() 
{ 
	return m_crInactiveBg; 
} // End of GetInactiveBgColor 
 
 
void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint) 
{ 
	m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT);  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetDefaultInactiveFgColor 
 
 
void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint) 
{ 
	m_crInactiveFg = crNew;  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetInactiveFgColor 
 
 
const COLORREF CButtonST::GetInactiveFgColor() 
{ 
	return m_crInactiveFg; 
} // End of GetInactiveFgColor 
 
 
void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint) 
{ 
	m_crActiveBg = ::GetSysColor(COLOR_BTNFACE);  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetDefaultActiveBgColor 
 
 
void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint) 
{ 
	m_crActiveBg = crNew;  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetActiveBgColor 
 
 
const COLORREF CButtonST::GetActiveBgColor() 
{ 
	return m_crActiveBg; 
} // End of GetActiveBgColor 
 
 
void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint) 
{ 
	m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT);  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetDefaultActiveFgColor 
 
 
void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint) 
{ 
	m_crActiveFg = crNew;  
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetActiveFgColor 
 
 
const COLORREF CButtonST::GetActiveFgColor() 
{ 
	return m_crActiveFg; 
} // End of GetActiveFgColor 
 
 
void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint) 
{ 
	m_bDrawFlatFocus = bDrawFlatFocus; 
	 
	// Repaint the button 
	if (bRepaint == TRUE) Invalidate(); 
} // End of SetFlatFocus 
 
 
BOOL CButtonST::GetFlatFocus() 
{ 
	return m_bDrawFlatFocus; 
} // End of GetFlatFocus 
 
 
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; 
	} 
 
	return CButton::OnSetCursor(pWnd, nHitTest, message); 
} // End of OnSetCursor 
 
 
void CButtonST::SetTooltipText(CString* spText, BOOL bActivate) 
{ 
	// We cannot accept NULL pointer 
	if (spText == 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, (LPCTSTR)*spText, rectBtn, 1); 
	} 
 
	// Set text for tooltip 
	m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1); 
	m_ToolTip.Activate(bActivate); 
} // End of SetTooltipText 
 
 
void CButtonST::SetTooltipText(int nId, BOOL bActivate) 
{ 
	CString sText; 
 
	// load string resource 
	sText.LoadString(nId); 
	// If string resource is not empty 
	if (sText.IsEmpty() == FALSE) SetTooltipText(&sText, bActivate); 
} // End of SetTooltipText 
 
 
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 
 
 
BOOL CButtonST::GetDefault() 
{ 
	return m_bIsDefault; 
} // End of GetDefault 
 
 
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); 
	} 
 
	m_bmpBk.Detach(); 
	m_dcBk.Detach(); 
 
	// Repaint the button 
	if (bRepaint == TRUE) Invalidate(); 
} // End of DrawTransparent 
 
 
void CButtonST::InitToolTip() 
{ 
	if (m_ToolTip.m_hWnd == NULL) 
	{ 
		// Create ToolTip control 
		m_ToolTip.Create(this); 
		// Create inactive 
		m_ToolTip.Activate(FALSE); 
	} 
} // End of InitToolTip 
 
 
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); 
	} 
 
	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY); 
} // End of PaintBk 
 
 
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();	 
} // End of OnSysColorChange 
 
 
#undef ST_USE_MEMDC 
#undef ST_LIKEIE