ShadowButton.cpp
上传用户:jinq198
上传日期:2014-05-21
资源大小:111k
文件大小:6k
源码类别:

文件操作

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////
  2. // 类名: CShadowButton
  3. //
  4. // 说明: 类似于原DOS下的阴影效果按钮
  5. //
  6. // 用法:
  7. //       1、把文件shadowbutton.h、shadowbutton.cpp加入工程中
  8. //       2、在使用的对话框中加入头文件,#include shadowbutton.h
  9. //       3、声明要改变的按钮成员变量(可在类向导中进行),如:
  10. //           CShadowButton m_Cancel;
  11. //       4、在OnInitDialog()中加入下面语句,进行初始化
  12. //           m_Cancel.SetDefaultFace();
  13. //           m_Cancel.SetDefaultButton();
  14. //
  15. // 修改: 徐景周, 加入PreSubclassWindow(),实现按钮构造时自绘属性.
  16. /////////////////////////////////////////////////////////////////////
  17. #include "stdafx.h"
  18. #include "shadowbutton.h"
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CShadowButton
  26. CShadowButton::CShadowButton()
  27. {
  28. m_bDefault = FALSE;
  29. }
  30. CShadowButton::~CShadowButton()
  31. {
  32. }
  33. BEGIN_MESSAGE_MAP(CShadowButton, CButton)
  34. //{{AFX_MSG_MAP(CShadowButton)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CShadowButton message handlers
  39. // 加入此涵数,不必手工设置按钮为自绘属性,jingzhou xu
  40. void CShadowButton::PreSubclassWindow() 
  41. {
  42. // 构造默认为自绘按钮属性, jingzhou xu
  43. ModifyStyle(0, BS_OWNERDRAW);
  44. CButton::PreSubclassWindow();
  45. }
  46. void CShadowButton::Redraw()
  47. {
  48. if( m_hWnd != NULL )Invalidate();
  49. }
  50. void CShadowButton::SetBorderSize(int nSize)
  51. {
  52. m_nBorderSize = nSize;
  53. }
  54. void CShadowButton::SetColors(COLORREF crColor, COLORREF crBorder, COLORREF crShadow, COLORREF crText)
  55. {
  56. m_crColor = crColor;
  57. m_crBorderColor = crBorder;
  58. m_crShadowColor = crShadow;
  59. m_crTextColor = crText;
  60. }
  61. BOOL CShadowButton::LoadBitmaps(COLORREF crTransColor, UINT nresNormalBmp, UINT nresDisabledBmp)
  62. {
  63. if(!this->m_bmpNormal.LoadBitmap(nresNormalBmp))return FALSE;
  64. if(!this->m_bmpDisabled.LoadBitmap(nresDisabledBmp))return FALSE;
  65. m_crTransColor = crTransColor;
  66. return TRUE;
  67. }
  68. void CShadowButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  69. {
  70. // TODO: Add your code to draw the specified item
  71. CDC DC, memdc;
  72. CBitmap MemBmp, *pOldBmp; 
  73. CPen *pOldPen;
  74. CBrush *pOldBrush;
  75. CFont *pOldFont;
  76. CRect rect(lpDrawItemStruct->rcItem);
  77. DC.Attach(lpDrawItemStruct->hDC);
  78. if(!memdc.CreateCompatibleDC(&DC))return;
  79. if(!MemBmp.CreateCompatibleBitmap(&DC, rect.Width(), rect.Height()))return;
  80. pOldBmp = memdc.SelectObject(&MemBmp);
  81. pOldBrush = memdc.SelectObject(DC.GetCurrentBrush());
  82. pOldPen = memdc.SelectObject(DC.GetCurrentPen());
  83. pOldFont = memdc.SelectObject(DC.GetCurrentFont());
  84. CBrush brush;
  85. brush.CreateSolidBrush(DC.GetBkColor());//dc.GetBkColor());
  86. memdc.FillRect(&rect, &brush); //FIX
  87. brush.DeleteObject();
  88. if(lpDrawItemStruct->itemState & ODS_SELECTED)DrawDown(&memdc, &rect);//FIX
  89. else DrawUp(&memdc, &rect); //FIX
  90. if(!DC.BitBlt(0, 0, rect.Width(), rect.Height(), &memdc, 0, 0, SRCCOPY))
  91. {
  92. TRACE("CShadow::dc.BitBlt error!!!!n");
  93. return;
  94. }
  95. memdc.SelectObject(pOldPen);
  96. memdc.SelectObject(pOldBrush);
  97. memdc.SelectObject(pOldFont);
  98. memdc.SelectObject(pOldBmp);
  99. MemBmp.DeleteObject();
  100. memdc.DeleteDC();
  101. }
  102. void CShadowButton::SetShadowOffset(int x, int y)
  103. {
  104. this->m_nShadowXOffset = x;
  105. this->m_nShadowYOffset = y;
  106. }
  107. void CShadowButton::DrawUp(CDC *pDC, CRect *pRect)
  108. {
  109. CBrush brush;
  110. //画阴影部分
  111. CRect rectShadow(pRect);
  112. rectShadow.left = m_nShadowXOffset;
  113. rectShadow.top = m_nShadowYOffset;
  114. brush.CreateSolidBrush(m_crShadowColor);
  115. pDC->FillRect(&rectShadow, &brush);
  116. brush.DeleteObject();
  117. DrawClient(pDC, pRect, pRect->left, pRect->top);
  118. }
  119. void CShadowButton::DrawDown(CDC *pDC, CRect *pRect)
  120. {
  121. //画边框与客户区
  122. int x, y;
  123. if(m_sizeShadow.cx > 0)x = m_sizeShadow.cx - 1;else x = pRect->left;
  124. if(m_sizeShadow.cy > 0)y = m_sizeShadow.cy - 1;else y = pRect->top;
  125. DrawClient(pDC, pRect, x, y);
  126. }
  127. void CShadowButton::DrawClient(CDC *pdc, CRect *pRect, int x, int y)
  128. {
  129. CPen pen;
  130. CBrush brush;
  131. CRect rectBorder(*pRect);
  132. rectBorder.right -= m_sizeShadow.cx;
  133. rectBorder.bottom -= m_sizeShadow.cy;
  134. CPen *OldPen;
  135. CBrush *OldBrush;
  136. rectBorder.OffsetRect(x, y);
  137. brush.CreateSolidBrush(m_crColor);
  138. pen.CreatePen(PS_SOLID, m_nBorderSize, m_crBorderColor);
  139. OldPen = pdc->SelectObject(&pen);
  140. OldBrush = pdc->SelectObject(&brush);
  141. pdc->Rectangle(&rectBorder);
  142. pdc->SelectObject(OldPen);
  143. pdc->SelectObject(OldBrush);
  144. pen.DeleteObject();
  145. brush.DeleteObject();
  146. //画图片
  147. int strx, stry;
  148. CString str;
  149. CSize sizeStr;
  150. GetWindowText(str);
  151. pdc->SetTextColor(m_crTextColor);
  152. pdc->SetBkMode(TRANSPARENT);
  153. CFont font, *pOldFont;
  154. LOGFONT logfont;
  155. if(m_bDefault)
  156. {
  157. pdc->GetCurrentFont()->GetLogFont(&logfont);
  158. logfont.lfWeight = FW_BOLD;
  159. font.CreateFontIndirect(&logfont);
  160. pOldFont = pdc->SelectObject(&font);
  161. }
  162. CSize sz;
  163. sz = pdc->GetOutputTextExtent(str);
  164. strx = (rectBorder.Width() - sz.cx) / 2 + rectBorder.left;
  165. stry = (rectBorder.Height() - sz.cy) / 2 + rectBorder.top;
  166. pdc->TextOut(strx, stry, str);
  167. if(m_bDefault)
  168. {
  169. pdc->SelectObject(pOldFont);
  170. font.DeleteObject();
  171. }
  172. }
  173. BOOL CShadowButton::SetDefaultButton(BOOL bState)
  174. {
  175. m_bDefault = bState;
  176. Redraw();
  177. return bState;
  178. }
  179. void CShadowButton::SetDefaultFace()
  180. {
  181. SetBorderSize(1);
  182. SetShadowSize(CSize(5, 5));
  183. SetColors(0, RGB(255, 0, 0), ::GetSysColor(COLOR_BTNSHADOW), RGB(0, 255, 0));
  184. SetShadowOffset(5, 5);
  185. }