www.pudn.com > SafeClean.rar > HoverButton.cpp


// HoverButton.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "HoverButton.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CHoverButton 
 
CHoverButton::CHoverButton() 
{ 
	m_bHover = FALSE; 
	m_bTracking = FALSE; 
 
} 
 
CHoverButton::~CHoverButton() 
{ 
} 
IMPLEMENT_DYNAMIC(CHoverButton, CBitmapButton) 
 
BEGIN_MESSAGE_MAP(CHoverButton, CBitmapButton) 
	//{{AFX_MSG_MAP(CHoverButton) 
	ON_WM_MOUSEMOVE() 
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) 
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////// 
 //	CHoverButton message handlers 
		 
void CHoverButton::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	//	TODO: Add your message handler code here and/or call default 
 
	if (!m_bTracking) 
	{ 
		TRACKMOUSEEVENT tme; 
		 
		tme.cbSize = sizeof(tme); 
		tme.hwndTrack = m_hWnd; 
		tme.dwFlags = TME_LEAVE|TME_HOVER; 
		tme.dwHoverTime = 1; 
		m_bTracking = _TrackMouseEvent(&tme); 
		 
	} 
	CBitmapButton::OnMouseMove(nFlags, point); 
} 
 
BOOL CHoverButton::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	InitToolTip(); 
	m_ToolTip.RelayEvent(pMsg);		 
	return CButton::PreTranslateMessage(pMsg); 
} 
 
// Set the tooltip with a string resource 
void CHoverButton::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); 
 
} 
 
// Set the tooltip with a CString 
void CHoverButton::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); 
} 
 
void CHoverButton::InitToolTip() 
{ 
	if (m_ToolTip.m_hWnd == NULL) 
	{ 
		// Create ToolTip control 
		m_ToolTip.Create(this); 
		// Create inactive 
		m_ToolTip.Activate(FALSE); 
	} 
} // End of InitToolTip 
 
// Activate the tooltip 
void CHoverButton::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 
 
 
 
 
 
 
void CHoverButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
{ 
	// TODO: Add your code to draw the specified item 
 
	CDC *mydc=CDC::FromHandle(lpDrawItemStruct->hDC); 
 
	CDC * pMemDC = new CDC; 
	pMemDC -> CreateCompatibleDC(mydc); 
 
 
 
	CBitmap * pOldBitmap; 
	pOldBitmap = pMemDC -> SelectObject(&mybitmap); 
	 
	CPoint point(0,0);	 
		 
	if(lpDrawItemStruct->itemState & ODS_SELECTED) 
	{ 
		// 
		mydc->BitBlt(0,0,m_ButtonSize.cx,m_ButtonSize.cy,pMemDC,m_ButtonSize.cx,0,SRCCOPY); 
	}    
	else 
	{ 
		if(m_bHover) 
		{ 
			mydc->BitBlt(0,0,m_ButtonSize.cx,m_ButtonSize.cy,pMemDC,m_ButtonSize.cx*2,0,SRCCOPY); 
		}else 
		{ 
			mydc->BitBlt(0,0,m_ButtonSize.cx,m_ButtonSize.cy,pMemDC,0,0,SRCCOPY); 
		}	 
	} 
 
	// clean up 
	pMemDC -> SelectObject(pOldBitmap); 
	delete pMemDC; 
} 
 
// Load a bitmap from the resources in the button, the bitmap has to have 3 buttonsstates next to each other: Up/Down/Hover 
BOOL CHoverButton::LoadBitmap(UINT bitmapid) 
{ 
	mybitmap.Attach(::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(bitmapid), IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS)); 
	BITMAP	bitmapbits; 
	mybitmap.GetBitmap(&bitmapbits); 
	m_ButtonSize.cy=bitmapbits.bmHeight; 
	m_ButtonSize.cx=bitmapbits.bmWidth/3; 
	SetWindowPos( NULL, 0,0, m_ButtonSize.cx,m_ButtonSize.cy,SWP_NOMOVE   |SWP_NOOWNERZORDER   ); 
	return TRUE; 
} 
 
 
 
void CHoverButton::OnMouseHover(WPARAM wparam, LPARAM lparam)  
{ 
	// TODO: Add your message handler code here and/or call default 
	m_bHover=TRUE; 
	Invalidate(); 
	 
} 
 
 
LRESULT CHoverButton::OnMouseLeave(WPARAM wparam, LPARAM lparam) 
{ 
 
	m_bTracking = FALSE; 
	m_bHover=FALSE; 
	Invalidate(); 
	return 0; 
}