XPButton.cpp
上传用户:smsj_tj
上传日期:2022-05-05
资源大小:187k
文件大小:6k
源码类别:

打印编程

开发平台:

Visual C++

  1. //====================================================================
  2. //==============XP Style Button=============
  3. //Author Ma811
  4. //Date 2002-7-19
  5. //Version 0.50
  6. //E-mail ma811@yeah.net
  7. //====================================================================
  8. ////////////////////////////////////////////////////////////////////
  9. // XPButton.cpp : implementation file
  10. //
  11. #include "stdafx.h"
  12. #include "XPButton.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CXPButton
  20. CXPButton::CXPButton()
  21. {
  22. m_bIsMouseMove = 0;
  23. m_NormalTextColor = RGB(255, 255, 255);
  24. m_SelectTextColor = RGB(255, 255, 255);
  25. m_ActiveTextColor = RGB(255, 255, 255);
  26. m_ActiveColor = RGB(255, 120, 80);
  27. m_NormalColorTop = RGB(255, 255, 255);
  28. m_NormalColorBottom = RGB(0, 128, 255);
  29. m_FrameColor = RGB(0, 64, 128);
  30. m_FrameHeight = RGB(230, 230, 230);
  31. m_FrameShadow = RGB(128, 128, 128);
  32. }
  33. CXPButton::~CXPButton()
  34. {
  35. }
  36. BEGIN_MESSAGE_MAP(CXPButton, CButton)
  37. //{{AFX_MSG_MAP(CXPButton)
  38. ON_WM_MOUSEMOVE()
  39. //}}AFX_MSG_MAP
  40. ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CXPButton message handlers
  44. void CXPButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
  45. {
  46. //*
  47. CDC* pDC      = CDC::FromHandle(lpDrawItemStruct->hDC);
  48. DWORD nState  = lpDrawItemStruct->itemState;
  49. DWORD nAction = lpDrawItemStruct->itemAction; 
  50. CRect rc   = lpDrawItemStruct->rcItem;
  51. UINT uStyle   = DFCS_BUTTONPUSH;
  52. pDC->SetBkMode(TRANSPARENT);
  53. CString strText;
  54. GetWindowText(strText);
  55. if( nState & ODS_SELECTED )
  56. {
  57. m_bIsMouseMove = 0;
  58. DrawFace(m_NormalColorBottom, m_NormalColorTop, rc, rc, pDC);
  59. DrawFrame(m_FrameShadow, m_FrameShadow, m_FrameColor, rc, pDC);
  60. //pDC->Draw3dRect(rc, RGB(0,0,0), RGB(0,0,0));
  61. pDC->SetTextColor(m_SelectTextColor);
  62. }
  63. else //Normal
  64. {
  65. DrawFace(m_NormalColorTop, m_NormalColorBottom, rc, rc, pDC);
  66. DrawFrame(m_FrameHeight, m_FrameShadow, m_FrameColor, rc, pDC);
  67. pDC->SetTextColor(m_NormalTextColor);
  68. }
  69. if( m_bIsMouseMove )
  70. {
  71. CRect rc2(rc);
  72. rc2.DeflateRect(2, 2, 2, 2);
  73. DrawFace(RGB(GetRValue(m_ActiveColor), GetGValue(m_ActiveColor)+100, GetBValue(m_ActiveColor)+100),
  74. m_ActiveColor, rc, rc, pDC);
  75. DrawFace(m_NormalColorTop, m_NormalColorBottom, rc2, rc, pDC);
  76. CBrush NullBrush;
  77. NullBrush.CreateStockObject(NULL_BRUSH);
  78. CBrush* pOldBrush = pDC->SelectObject(&NullBrush);
  79. CPen Pen;
  80. Pen.CreatePen(PS_SOLID, 1, m_FrameColor);
  81. CPen* pOldPen = pDC->SelectObject(&Pen);
  82. rc.InflateRect(1,1,1,1);
  83. pDC->RoundRect(rc, CPoint(3, 3));
  84. //rc.DeflateRect(1, 1, 1, 1); 
  85. //pDC->Draw3dRect(rc, HeightLight, ShadowLight);
  86. pDC->SelectObject(pOldPen);
  87. pDC->SelectObject(pOldBrush);
  88. pDC->SetTextColor(m_ActiveTextColor);
  89. }
  90. pDC->DrawText(strText, strText.GetLength(), 
  91. &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
  92. //*///
  93. }
  94. void CXPButton::OnMouseMove(UINT nFlags, CPoint point) 
  95. {
  96. // TODO: Add your message handler code here and/or call default
  97. if( m_bIsMouseMove == 0 )
  98. {
  99. m_bIsMouseMove = 1;
  100. Invalidate();
  101. TRACKMOUSEEVENT trackmouseevent;
  102. trackmouseevent.cbSize = sizeof(trackmouseevent);
  103. trackmouseevent.dwFlags = TME_LEAVE;
  104. trackmouseevent.hwndTrack = GetSafeHwnd();
  105. trackmouseevent.dwHoverTime = HOVER_DEFAULT;
  106. _TrackMouseEvent(&trackmouseevent);
  107. }
  108. CButton::OnMouseMove(nFlags, point);
  109. }
  110. LONG CXPButton::OnMouseLeave(WPARAM, LPARAM)
  111. {
  112. m_bIsMouseMove = 0;
  113. Invalidate();
  114. return 0;
  115. }
  116. void CXPButton::PreSubclassWindow() 
  117. {
  118. // TODO: Add your specialized code here and/or call the base class
  119. UINT nBS = GetButtonStyle();
  120. // Add BS_OWNERDRAW style
  121. SetButtonStyle(nBS | BS_OWNERDRAW);
  122. CButton::PreSubclassWindow();
  123. }
  124. void CXPButton::DrawFace(COLORREF Top, COLORREF Bottom, CRect& rc, CRect CalRc, CDC* pDC)
  125. {
  126. CPen Pen;
  127. CPen* pOldPen = pDC->SelectObject(&Pen);
  128. int R, G, B;
  129. R = (GetRValue(Top) - GetRValue(Bottom)) / CalRc.Height();
  130. G = (GetGValue(Top) - GetGValue(Bottom)) / CalRc.Height();
  131. B = (GetBValue(Top) - GetBValue(Bottom)) / CalRc.Height();
  132. //R = R>0 ? R : -R;
  133. //G = G>0 ? G : -G;
  134. //B = B>0 ? B : -B;
  135. int ColR = GetRValue(Top), ColG = GetGValue(Top), ColB = GetBValue(Top);
  136. COLORREF ColMax = Top > Bottom ? Top : Bottom;
  137. COLORREF ColMin = Top > Bottom ? Bottom: Top;
  138. for(int i=0; i<rc.Height(); i++)
  139. {
  140. ColR -= R;
  141. ColG -= G;
  142. ColB -= B;
  143. /*
  144. if( ColR >= GetRValue(ColMax) || ColR <= GetRValue(ColMin) ||
  145. ColG >= GetGValue(ColMax) || ColG <= GetGValue(ColMin) ||
  146. ColB >= GetBValue(ColMax) || ColB <= GetBValue(ColMin) )
  147. {
  148. R = G = B = 0;
  149. }///*/
  150. Pen.DeleteObject();
  151. Pen.CreatePen(PS_SOLID, 1, RGB(ColR, ColG, ColB));
  152. pDC->SelectObject(&Pen);
  153. pDC->MoveTo(rc.left, rc.top+i);
  154. pDC->LineTo(rc.right, rc.top+i);
  155. }
  156. pDC->SelectObject(pOldPen);
  157. }
  158. void CXPButton::DrawFrame(COLORREF HeightLight, COLORREF ShadowLight, COLORREF FrameColor, CRect& rc, CDC* pDC)
  159. {
  160. CBrush NullBrush;
  161. NullBrush.CreateStockObject(NULL_BRUSH);
  162. CBrush* pOldBrush = pDC->SelectObject(&NullBrush);
  163. CPen Pen;
  164. Pen.CreatePen(PS_SOLID, 1, FrameColor);
  165. CPen* pOldPen = pDC->SelectObject(&Pen);
  166. pDC->RoundRect(rc, CPoint(3, 3));
  167. rc.DeflateRect(1, 1, 1, 1); 
  168. pDC->Draw3dRect(rc, HeightLight, ShadowLight);
  169. pDC->SelectObject(pOldPen);
  170. pDC->SelectObject(pOldBrush);
  171. }