HoverButton.cpp
上传用户:shyhzl888
上传日期:2007-01-07
资源大小:35k
文件大小:6k
源码类别:

行业应用

开发平台:

Visual C++

  1. // HoverButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "HoverButton.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CHoverButton
  12. BEGIN_MESSAGE_MAP(CHoverButton, CBitmapButton)
  13. //{{AFX_MSG_MAP(CHoverButton)
  14. ON_WM_MOUSEMOVE()
  15. ON_WM_LBUTTONUP()
  16. //}}AFX_MSG_MAP
  17. END_MESSAGE_MAP()
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CHoverButton construction / destruction
  20. CHoverButton::CHoverButton()
  21. {
  22. // To start with, the button is switched off and we are NOT tracking the mouse
  23. m_ButtonState = BUTTON_OFF;
  24. m_bMouseTracking = FALSE;
  25. }
  26. CHoverButton::~CHoverButton()
  27. {
  28. }
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CHoverButton message handlers
  31. void CHoverButton::OnMouseMove(UINT nFlags, CPoint point) 
  32. {
  33. CBitmapButton::OnMouseMove(nFlags, point);
  34. // 1. Mouse has moved and we are not tracking this button, or 
  35. // 2. mouse has moved and the cursor was not above this window
  36. // == Is equivalent to WM_MOUSEENTER (for which there is no message)
  37. if((!m_bMouseTracking || GetCapture()!=this) && (m_ButtonState == BUTTON_OFF))
  38. {
  39. OnMouseEnter();
  40. }
  41. else 
  42. {
  43. if(m_ButtonState == BUTTON_OVER)
  44. {
  45. CRect rc;
  46. GetClientRect(&rc);
  47. if(!rc.PtInRect(point)) // The mouse cursor is no longer above this button
  48. OnMouseLeave();
  49. }
  50. }
  51. }
  52. void CHoverButton::OnMouseEnter(void)
  53. {
  54. // We are now tracking the mouse, OVER this button
  55. m_bMouseTracking = TRUE;
  56. m_ButtonState = BUTTON_OVER;
  57. // Ensure that mouse input is sent to the button
  58. SetCapture();
  59. Invalidate();
  60. UpdateWindow();
  61. }
  62. void CHoverButton::OnMouseLeave(void)
  63. {
  64. // We are not tracking the mouse, this button is OFF.
  65. m_ButtonState = BUTTON_OFF;
  66. m_bMouseTracking = FALSE;
  67. // Release mouse capture from the button and restore normal mouse input
  68. Invalidate();
  69. UpdateWindow();
  70. ReleaseCapture();
  71. }
  72. void CHoverButton::OnLButtonUp(UINT nFlags, CPoint point) 
  73. {
  74. SetButtonState(BUTTON_ON); // Highlight button
  75. CBitmapButton::OnLButtonUp(nFlags, point);
  76. }
  77. // Purpose: Set the new state of the button 
  78. // Return: Returns the old state of the button
  79. // Parameters: nState = Either ON or OFF. The default is OFF. This is NOT tri-state button!
  80. BUTTON_STATE CHoverButton::SetButtonState(BUTTON_STATE nState) 
  81. {
  82. BUTTON_STATE nOldState = (BUTTON_STATE)GetCheck();
  83. m_ButtonState = nState;
  84. switch(m_ButtonState)
  85. {
  86. case BUTTON_ON:
  87. EnableWindow(TRUE);
  88. SetState(BUTTON_ON);
  89. break;
  90. case BUTTON_GREYED:
  91. EnableWindow(FALSE);
  92. break;
  93. case BUTTON_OVER:
  94. EnableWindow(TRUE);
  95. SetState(BUTTON_OVER);
  96. break;
  97. default:
  98. EnableWindow(TRUE);
  99. SetState(BUTTON_OFF);
  100. m_ButtonState = BUTTON_OFF;
  101. break;
  102. }
  103. return(nOldState);
  104. }
  105. // Draws the buttons in their relevant state, and text labels
  106. void CHoverButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  107. {
  108. CDC memDC;
  109. CBitmap* pOld=NULL;
  110. CBitmap* pBitmap=NULL;
  111. CDC* pDC;
  112. CRect rc;
  113. int iSaveDC;
  114. pDC= CDC::FromHandle(lpDrawItemStruct->hDC);
  115. memDC.CreateCompatibleDC(pDC);
  116. VERIFY(pDC);
  117. iSaveDC=pDC->SaveDC();
  118. rc.CopyRect(&lpDrawItemStruct->rcItem);
  119. pDC->SetBkMode(TRANSPARENT);
  120. pDC->SetTextColor(GetSysColor(COLOR_WINDOWFRAME));// Black text color
  121. switch(m_ButtonState)
  122. {
  123. case BUTTON_ON:
  124. pBitmap=&m_bmpButtonDown;
  125. break;
  126. case BUTTON_OVER:
  127. pBitmap=&m_bmpButtonFocussed;
  128. break;
  129. case BUTTON_GREYED:
  130. pBitmap=&m_bmpButtonDisabled;
  131. break;
  132. default:
  133. pBitmap=&m_bmpButtonUp;
  134. break;
  135. }
  136. CString strTitle;
  137. GetWindowText(strTitle);
  138. if (pBitmap->m_hObject)
  139. {
  140. CRect rcBitmap(rc);
  141. BITMAP bmpInfo;
  142. CSize size;
  143. // Text
  144. size = pDC->GetTextExtent(strTitle);
  145. rcBitmap.OffsetRect(size.cx+5,0);
  146. // Draw bitmap
  147. if(!pBitmap->GetBitmap(&bmpInfo))
  148. return;
  149. pOld=memDC.SelectObject((CBitmap*) pBitmap);
  150. if (pOld==NULL) 
  151. return; //Destructors will clean up
  152. if(!pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY))
  153. return;
  154. memDC.SelectObject(pOld);
  155. if(memDC==NULL)
  156. return;
  157. }
  158. CRect rcText(rc);
  159. UINT nFormat = DT_CENTER;
  160. if(m_ButtonState == BUTTON_GREYED)
  161. {
  162. rcText.OffsetRect(1,1);
  163. pDC->SetTextColor(GetSysColor(COLOR_BTNHIGHLIGHT));
  164. pDC->DrawText(strTitle,rcText,nFormat);
  165. rcText.OffsetRect(-1,-1);
  166. pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW));
  167. pDC->DrawText(strTitle,rcText,nFormat);
  168. else
  169. pDC->DrawText(strTitle,rcText,nFormat);
  170. pDC->RestoreDC(iSaveDC);
  171. }
  172. BOOL CHoverButton::LoadBitmaps(UINT nBitmapUp, UINT nBitmapDown, 
  173.    UINT nBitmapFocus, UINT nBitmapDisabled)
  174. {
  175. return LoadBitmaps(MAKEINTRESOURCE(nBitmapUp),
  176. MAKEINTRESOURCE(nBitmapDown),
  177. MAKEINTRESOURCE(nBitmapFocus),
  178. MAKEINTRESOURCE(nBitmapDisabled));
  179. }
  180. BOOL CHoverButton::LoadBitmaps(LPCSTR lpszBitmapUp, LPCSTR lpszBitmapDown, 
  181.    LPCSTR lpszBitmapFocus, LPCSTR lpszBitmapDisabled)
  182. {
  183. BOOL bAllLoaded=TRUE;
  184. //Delete old ones
  185. m_bmpButtonDown.DeleteObject();
  186. m_bmpButtonFocussed.DeleteObject();
  187. m_bmpButtonUp.DeleteObject();
  188. m_bmpButtonDisabled.DeleteObject();
  189. if (!m_bmpButtonUp.LoadBitmap(lpszBitmapUp))
  190. {
  191. TRACE0("Failed to load up bitmap of bitmap buttonn");
  192. return FALSE;
  193. }
  194. if (lpszBitmapDown!=NULL)
  195. {
  196. if (!m_bmpButtonDown.LoadBitmap(lpszBitmapDown))
  197. {
  198. TRACE0("Failed to load down bitmap of bitmap buttonn");
  199. return bAllLoaded=FALSE;
  200. }
  201. }
  202. if (lpszBitmapFocus!=NULL)
  203. {
  204. if (!m_bmpButtonFocussed.LoadBitmap(lpszBitmapFocus))
  205. {
  206. TRACE0("Failed to load focussed bitmap of bitmap buttonn");
  207. return bAllLoaded=FALSE;
  208. }
  209. }
  210. if (lpszBitmapDisabled!=NULL)
  211. {
  212. if (!m_bitmapDisabled.LoadBitmap(lpszBitmapDisabled))
  213. {
  214. TRACE0("Failed to load disabled bitmap of bitmap buttonn");
  215. return bAllLoaded=FALSE;
  216. }
  217. }
  218. return bAllLoaded;
  219. }