CHoverButton 类

 HoverButton.h

#if !defined(AFX_HOVERBUTTON_H__16C6D980_BD45_11D3_BDA3_00104B133581__INCLUDED_) #define AFX_HOVERBUTTON_H__16C6D980_BD45_11D3_BDA3_00104B133581__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // HoverButton.h : header file // ///////////////////////////////////////////////////////////////////////////// // CHoverButton by Niek Albers // Thanks to some people for the tooltip. // A cool CBitmapButton derived class with 3 states, // Up/Down/Hover. class CHoverButton : public CBitmapButton { DECLARE_DYNAMIC(CHoverButton); // Construction public: CHoverButton(); void SetToolTipText(CString* spText, BOOL bActivate = TRUE); void SetToolTipText(int nId, BOOL bActivate = TRUE); // Attributes protected: void ActivateTooltip(BOOL bActivate = TRUE); BOOL m_bHover; // indicates if mouse is over the button CSize m_ButtonSize; // width and height of the button CBitmap mybitmap; BOOL m_bTracking; // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHoverButton) protected: virtual BOOL PreTranslateMessage(MSG* pMsg); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); //}}AFX_VIRTUAL // Implementation public: BOOL LoadBitmap(CString bitmapid); virtual ~CHoverButton(); // Generated message map functions protected: CToolTipCtrl m_ToolTip; void InitToolTip(); //{{AFX_MSG(CHoverButton) afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam); afx_msg void OnMouseHover(WPARAM wparam, LPARAM lparam) ; //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_HOVERBUTTON_H__16C6D980_BD45_11D3_BDA3_00104B133581__INCLUDED_)

 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(CString bitmapid) { mybitmap.Attach(::LoadImage(::AfxGetInstanceHandle(),bitmapid, IMAGE_BITMAP,0,0,LR_LOADFROMFILE)); 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; }   

你可能感兴趣的:(CHoverButton 类)