HighLightButton.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:7k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 7/24/98 11:59:28 AM
  5.   Comments: HighLightButton.cpp : implementation file
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "HighLightButton.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define IDTIMERCHANGECOLOR 1000
  15. #define WAITTOCHANGECOLOR 25
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CHighLightButton
  18. // Function name : CHighLightButton::CHighLightButton
  19. // Description     : Default contructor of this object
  20. // Return type : 
  21. CHighLightButton::CHighLightButton()
  22. {
  23. SetBkGndColor(GetSysColor(COLOR_BTNFACE));
  24. SetForeGndColor(RGB(0,0,0));
  25. SetForeGndHighLightColor(RGB(0,0,255));
  26. m_rgbCurrentColor = m_rgbForeGnd;
  27. }
  28. // Function name : CHighLightButton::~CHighLightButton
  29. // Description     : Destructor 
  30. // Return type : 
  31. CHighLightButton::~CHighLightButton()
  32. {
  33. }
  34. BEGIN_MESSAGE_MAP(CHighLightButton, CButton)
  35. //{{AFX_MSG_MAP(CHighLightButton)
  36. ON_WM_MOUSEMOVE()
  37. ON_WM_TIMER()
  38. ON_WM_KILLFOCUS()
  39. //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CHighLightButton message handlers
  43. // Function name : CHighLightButton::PreSubclassWindow
  44. // Description     : Change the button style to owner draw.
  45. // Return type : void 
  46. void CHighLightButton::PreSubclassWindow() 
  47. {
  48. ModifyStyle(BS_PUSHBUTTON , BS_OWNERDRAW | BS_TEXT);
  49. CButton::PreSubclassWindow();
  50. }
  51. // Function name : CHighLightButton::Repaint
  52. // Description     : Call this function from Set...Color
  53. // Return type : void 
  54. void CHighLightButton::Repaint()
  55. {
  56. if (IsWindow(m_hWnd))
  57. Invalidate(FALSE);
  58. }
  59. // Function name : CHighLightButton::SetBkGndColor
  60. // Description     : Set the new color of BkGnd, and return old value
  61. // Return type : COLORREF 
  62. // Argument         : COLORREF rgbBKGnd
  63. COLORREF CHighLightButton::SetBkGndColor(COLORREF rgbBKGnd)
  64. {
  65. COLORREF rgbResult = m_rgbBkGnd;
  66. m_rgbBkGnd = rgbBKGnd;
  67. Repaint();
  68. return rgbResult;
  69. }
  70. // Function name : CHighLightButton::SetForeGndHighLightColor
  71. // Description     : Set the new color of ForeGnd when user pass over the button, and return old value
  72. // Return type : COLORREF 
  73. // Argument         : COLORREF rgbForeGnd
  74. COLORREF CHighLightButton::SetForeGndHighLightColor(COLORREF rgbForeGnd)
  75. {
  76. COLORREF rgbResult = rgbForeGnd;
  77. m_rgbForeGndHighLight = rgbForeGnd;
  78. Repaint();
  79. return rgbResult;
  80. }
  81. // Function name : CHighLightButton::SetForeGndColor
  82. // Description     : Set the new color of ForeGnd, and return old value
  83. // Return type : COLORREF 
  84. // Argument         : COLORREF rgbForeGnd
  85. COLORREF CHighLightButton::SetForeGndColor(COLORREF rgbForeGnd)
  86. {
  87. COLORREF rgbResult = m_rgbForeGnd;
  88. m_rgbForeGnd = rgbForeGnd;
  89. Repaint();
  90. return rgbResult;
  91. }
  92. // Function name : CHighLightButton::DrawItem
  93. // Description     : Overidable function to draw the owner draw button
  94. // Return type : void 
  95. // Argument         : LPDRAWITEMSTRUCT lpDrawItemStruct
  96. void CHighLightButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
  97. {
  98. CDC dc, *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  99. CBitmap mBitmap; CRect drawRect(lpDrawItemStruct->rcItem);
  100. if (dc.CreateCompatibleDC(pDC))
  101. if (mBitmap.CreateCompatibleBitmap(pDC, drawRect.Width(), drawRect.Height()))
  102. {
  103. CBitmap* pOldBitmap = dc.SelectObject(&mBitmap);
  104. CBrush brush(m_rgbBkGnd);
  105. CBrush* pOldBrush = dc.SelectObject(&brush);
  106. //Erase the need area
  107. dc.PatBlt(0,0, drawRect.Width(), drawRect.Height(), PATCOPY);
  108. dc.SelectObject(pOldBrush);
  109. CString tButton; GetWindowText(tButton);
  110. dc.SetTextColor(m_rgbCurrentColor);
  111. dc.SetBkMode(TRANSPARENT);
  112. CFont* pOldFont = dc.SelectObject(GetParent()->GetFont());
  113. UINT nStyle = GetStyle();
  114. UINT nAddStyleH = (nStyle & BS_RIGHT ? (nStyle & BS_LEFT ? DT_CENTER : DT_RIGHT) : DT_LEFT);
  115. UINT nAddStyleV = (nStyle & BS_BOTTOM ? (nStyle & BS_TOP ? DT_VCENTER : DT_BOTTOM) : DT_TOP);
  116. CSize d = dc.GetTextExtent(tButton);
  117. dc.DrawText(tButton, drawRect, nAddStyleH | nAddStyleV | DT_SINGLELINE);
  118. if (lpDrawItemStruct->itemState & ODS_FOCUS)
  119. {
  120. // Draw the rect for focus
  121. CPen pen(PS_DOT, 1, RGB(255,255,255));
  122. dc.SelectObject(&pen);
  123. CRect rHigh(CPoint(+drawRect.left, +drawRect.top), d + CSize(4,2));
  124. if ( nAddStyleH != DT_LEFT )
  125. rHigh.OffsetRect((drawRect.right - rHigh.right) / (nAddStyleH == DT_RIGHT ? 1 : 2), 0);
  126. if ( nAddStyleV != DT_TOP )
  127. rHigh.OffsetRect(0, (drawRect.bottom - rHigh.bottom) / (nAddStyleV == DT_BOTTOM ? 1 : 2));
  128. dc.MoveTo(rHigh.TopLeft());dc.LineTo(rHigh.right, rHigh.top);dc.LineTo(rHigh.BottomRight());
  129. dc.LineTo(rHigh.left, rHigh.bottom); dc.LineTo(rHigh.TopLeft());
  130. }
  131. int nSS = lpDrawItemStruct->itemState & ODS_SELECTED ? 1 : 0;
  132. //Copy from memory device to destination device
  133. pDC->BitBlt(drawRect.left + nSS, drawRect.top + nSS, drawRect.Width() , drawRect.Height() , &dc, 0,0, SRCCOPY);
  134. dc.SelectObject(pOldBitmap);
  135. dc.SelectObject(pOldFont);
  136. }
  137. }
  138. // Function name : CHighLightButton::OnMouseMove
  139. // Description     : Change the current color, when user.
  140. // Return type : void 
  141. // Argument         : UINT nFlags
  142. // Argument         : CPoint point
  143. void CHighLightButton::OnMouseMove(UINT nFlags, CPoint point) 
  144. {
  145. if (m_rgbCurrentColor != m_rgbForeGndHighLight)
  146. {
  147. m_rgbCurrentColor = m_rgbForeGndHighLight;
  148. Repaint();
  149. SetTimer(IDTIMERCHANGECOLOR, WAITTOCHANGECOLOR, NULL);
  150. }
  151. CButton::OnMouseMove(nFlags, point);
  152. }
  153. // Function name : CHighLightButton::RemoveCurrentColor
  154. // Description     : Remove the current color if is case.
  155. // Return type : void 
  156. // Argument         : BOOL bCheckPoint
  157. void CHighLightButton::RemoveCurrentColor(BOOL bCheckPoint)
  158. {
  159. CPoint pCursor;
  160. BOOL bRemove = TRUE;
  161. if (bCheckPoint && GetCursorPos(&pCursor))
  162. {
  163. CRect rect; GetWindowRect(&rect);
  164. bRemove = !rect.PtInRect(pCursor);
  165. }
  166. if (bRemove)
  167. if (m_rgbCurrentColor != m_rgbForeGnd)
  168. if (GetCapture() != this)
  169. {
  170. KillTimer(IDTIMERCHANGECOLOR);
  171. m_rgbCurrentColor = m_rgbForeGnd;
  172. Repaint();
  173. }
  174. }
  175. // Function name : CHighLightButton::OnTimer
  176. // Description     : Remove the foreground colore set in OnMouseMove
  177. // Return type : void 
  178. // Argument         : UINT nIDEvent
  179. void CHighLightButton::OnTimer(UINT nIDEvent) 
  180. {
  181. switch (nIDEvent)
  182. {
  183. case IDTIMERCHANGECOLOR:
  184. {
  185. RemoveCurrentColor(TRUE); // check the point at cursor
  186. break;
  187. }
  188. }
  189. CButton::OnTimer(nIDEvent);
  190. }
  191. // Function name : CHighLightButton::OnKillFocus
  192. // Description     : When the user lose focus
  193. // Return type : void 
  194. // Argument         : CWnd* pNewWnd
  195. void CHighLightButton::OnKillFocus(CWnd* pNewWnd) 
  196. {
  197. CButton::OnKillFocus(pNewWnd);
  198. RemoveCurrentColor(FALSE); // do not check the point at cursor
  199. }