CoolButton.cpp
上传用户:ledldq
上传日期:2007-01-04
资源大小:95k
文件大小:5k
源码类别:

打印编程

开发平台:

Visual C++

  1. // CoolButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PrintManager.h"
  5. #include "CoolButton.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CCoolButton
  13. CCoolButton::CCoolButton()
  14. {
  15. bHighlight = bLBtnDown = false;
  16. hHand = AfxGetApp()->LoadCursor(IDC_HANDCUR);
  17. }
  18. CCoolButton::~CCoolButton()
  19. {
  20. if (fUnderline.GetSafeHandle()) fUnderline.DeleteObject();
  21. }
  22. BEGIN_MESSAGE_MAP(CCoolButton, CButton)
  23. //{{AFX_MSG_MAP(CCoolButton)
  24. ON_WM_MOUSEMOVE()
  25. ON_WM_SETCURSOR()
  26. ON_WM_TIMER()
  27. ON_WM_LBUTTONUP()
  28. ON_WM_LBUTTONDOWN()
  29. ON_WM_CREATE()
  30. ON_WM_ERASEBKGND()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CCoolButton message handlers
  35. void CCoolButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  36. {
  37. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  38. CRect rect(lpDrawItemStruct->rcItem);
  39. COLORREF oc = pDC->GetTextColor();
  40. int iObk = pDC->SetBkMode(TRANSPARENT);
  41. UINT state = lpDrawItemStruct->itemState;
  42. CFont * pOldFont = NULL;
  43. int iYOffset = 0, iXOffset = 0;
  44. CString strText;
  45. GetWindowText(strText);
  46. rect.top  += iYOffset;
  47. rect.left += iXOffset;
  48. if (state & ODS_DISABLED)
  49. {
  50. CBrush grayBrush;
  51. grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT));
  52. CSize sz = pDC->GetTextExtent(strText);
  53. int x = rect.left + (rect.Width() - sz.cx)/2;
  54. int y = rect.top + (rect.Height() - sz.cy)/2;
  55. rect.top  += 2;
  56. rect.left += 2;
  57. pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));
  58. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  59. rect.top  -= 2;
  60. rect.left -= 2;
  61. pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
  62. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  63. }
  64. else
  65. {
  66. if (bHighlight)
  67. {
  68. if (state & ODS_SELECTED)
  69. {
  70. pDC->Draw3dRect(rect,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
  71. }
  72. else
  73. {
  74. pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
  75. }
  76. pDC->SetTextColor(RGB(0,0,255));
  77. if (fUnderline.GetSafeHandle() == NULL)
  78. {
  79. CFont * pFont = GetFont();
  80. ASSERT(pFont);
  81. LOGFONT lf;
  82. pFont->GetLogFont(&lf);
  83. lf.lfUnderline = TRUE;
  84. fUnderline.CreateFontIndirect(&lf);
  85. }
  86. pOldFont = pDC->SelectObject(&fUnderline);
  87. }
  88. else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
  89. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  90. if (pOldFont) pDC->SelectObject(pOldFont);
  91. }
  92. }
  93. void CCoolButton::OnMouseMove(UINT nFlags, CPoint point) 
  94. {
  95. SetTimer(1,10,NULL);
  96. CButton::OnMouseMove(nFlags, point);
  97. }
  98. BOOL CCoolButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  99. {
  100. if (bHighlight) 
  101. {
  102. ::SetCursor(hHand);
  103. return true;
  104. }
  105. return CButton::OnSetCursor(pWnd, nHitTest, message);
  106. }
  107. void CCoolButton::OnTimer(UINT nIDEvent) 
  108. {
  109. static bool pPainted = false;
  110. POINT pt;
  111. GetCursorPos(&pt);
  112. CRect rect;
  113. GetWindowRect (rect);
  114. if (bLBtnDown)
  115. {
  116. KillTimer (1);
  117. if (pPainted) InvalidateRect (NULL);
  118. pPainted = FALSE;
  119. return;
  120. }
  121. if (!rect.PtInRect (pt))
  122. {
  123. bHighlight = false;
  124. KillTimer (1);
  125. if (pPainted)
  126. InvalidateRect(NULL);
  127. pPainted = false;
  128. return;
  129. }
  130. else
  131. {
  132. bHighlight = true;
  133. if (!pPainted)
  134. {
  135. pPainted = true;
  136. InvalidateRect(NULL);
  137. }
  138. }
  139. CButton::OnTimer(nIDEvent);
  140. }
  141. void CCoolButton::OnLButtonUp(UINT nFlags, CPoint point) 
  142. {
  143. bLBtnDown = false;
  144. if (bHighlight)
  145. {
  146. bHighlight = false;
  147. InvalidateRect(NULL);
  148. }
  149. CButton::OnLButtonUp(nFlags, point);
  150. }
  151. void CCoolButton::OnLButtonDown(UINT nFlags, CPoint point) 
  152. {
  153. bLBtnDown = true;
  154. CButton::OnLButtonDown(nFlags, point);
  155. }
  156. int CCoolButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  157. {
  158. if (CButton::OnCreate(lpCreateStruct) == -1)
  159. return -1;
  160. CFont * pFont = GetFont();
  161. ASSERT(pFont);
  162. LOGFONT lf;
  163. pFont->GetLogFont(&lf);
  164. lf.lfUnderline = TRUE;
  165. fUnderline.CreateFontIndirect(&lf);
  166. return 0;
  167. }
  168. BOOL CCoolButton::PreCreateWindow(CREATESTRUCT& cs) 
  169. {
  170. cs.style |= BS_OWNERDRAW;
  171. return CButton::PreCreateWindow(cs);
  172. }
  173. BOOL CCoolButton::OnEraseBkgnd(CDC* pDC) 
  174. {
  175. COLORREF cr = GetSysColor(COLOR_3DFACE);
  176. int r = GetRValue(cr);
  177. int g = GetGValue(cr);
  178. int b = GetBValue(cr);
  179. if (r > 1) r -= 2;
  180. if (g > 1) g -= 2;
  181. if (r < 3 && g < 3 && b < 253) b += 2;
  182. COLORREF cr1 = RGB(r,g,b);
  183. CRect rc;
  184. GetClientRect(rc);
  185. pDC->FillSolidRect(rc, cr1);
  186. return true;
  187. }