GradientProgressCtrl.cpp
上传用户:cn05999
上传日期:2020-06-29
资源大小:84k
文件大小:4k
源码类别:

Static控件

开发平台:

Visual C++

  1. // GradientProgressCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CProgressCtrl.h"
  5. #include "GradientProgressCtrl.h"
  6. #include "MemDC.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CGradientProgressCtrl
  14. CGradientProgressCtrl::CGradientProgressCtrl()
  15. {
  16. m_nLower=0;
  17. m_nUpper=100;
  18. m_nCurrentPosition=0;
  19. m_nStep=10;
  20. //Initial Color of show
  21. m_clrStart= COLORREF(RGB(255,0,0));
  22. m_clrEnd= COLORREF(RGB(0,0,255));
  23. m_clrBkGround=::GetSysColor(COLOR_3DFACE);
  24. m_clrText=COLORREF(RGB(255,255,255));
  25. //Not show Word
  26. m_bShowPercent=FALSE;
  27. }
  28. CGradientProgressCtrl::~CGradientProgressCtrl()
  29. {
  30. }
  31. BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)
  32. //{{AFX_MSG_MAP(CGradientProgressCtrl)
  33. ON_WM_ERASEBKGND()
  34. ON_WM_PAINT()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CGradientProgressCtrl message handlers
  39. void CGradientProgressCtrl::SetRange(int nLower,int nUpper)
  40. {
  41. //This Function is to Set Range of the progress 
  42. m_nLower=nLower;
  43. m_nUpper=nUpper;
  44. m_nCurrentPosition=nLower;
  45. CProgressCtrl::SetRange(nLower,nUpper);
  46. }
  47. int CGradientProgressCtrl::SetStep(int nStep)
  48. {
  49. m_nStep=nStep;
  50. return (CProgressCtrl::SetStep(nStep));
  51. }
  52. BOOL CGradientProgressCtrl::OnEraseBkgnd(CDC* pDC) 
  53. {
  54. // TODO: Add your message handler code here and/or call default
  55. return TRUE;//CProgressCtrl::OnEraseBkgnd(pDC);
  56. }
  57. void CGradientProgressCtrl::DrawGradient(CPaintDC *pDC, const RECT &rectClient, const int &nMaxWidth)
  58. {
  59. RECT rectFill; //显示区域
  60. float fStep; //每一步的幅宽
  61. CBrush brush; //显示的颜色画刷
  62. CMemDC memDC(pDC);
  63. int r,g,b;
  64. float rStep,gStep,bStep;
  65. //得到不同颜色并相减,返回颜色之间的最大差值
  66. r=(GetRValue(m_clrEnd)-GetRValue(m_clrStart));
  67. g=(GetGValue(m_clrEnd)-GetGValue(m_clrStart));
  68. b=(GetBValue(m_clrEnd)-GetBValue(m_clrStart));
  69. //使进程条显示的总数 等于最大的颜色差值
  70. int nSteps=max(abs(r),max(abs(g),abs(b)));
  71. //确定每一颜色填充多大的矩形区域
  72. fStep=(float)rectClient.right/(float)nSteps;
  73. //设置每一颜色填充的步数
  74. rStep=r/(float)nSteps;
  75. gStep=g/(float)nSteps;
  76. bStep=b/(float)nSteps;
  77. r=GetRValue(m_clrStart);
  78. g=GetGValue(m_clrStart);
  79. b=GetBValue(m_clrStart);
  80. //绘制颜色渐变的进程条
  81. for(int iOnBand=0;iOnBand<nSteps;iOnBand++)
  82. {
  83. ::SetRect(&rectFill,
  84. //以下为填充矩形区域的左上角x,y和右下角x,y
  85. (int)(iOnBand*fStep),
  86. 0,
  87. (int)((iOnBand+1)*fStep),
  88. rectClient.bottom+1);
  89. VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand,g+gStep*iOnBand,b+bStep*iOnBand)));
  90. memDC.FillRect(&rectFill,&brush);
  91. VERIFY(brush.DeleteObject());
  92. //在结束绘制之前,使用背景色填充乘下的的客户区域
  93. if(rectFill.right>nMaxWidth)
  94. {
  95. ::SetRect(&rectFill,rectFill.right,0,rectClient.right,rectClient.bottom);
  96. VERIFY(brush.CreateSolidBrush(m_clrBkGround));
  97. memDC.FillRect(&rectFill,&brush);
  98. VERIFY(brush.DeleteObject());
  99. return;
  100. }
  101. }
  102. }
  103. void CGradientProgressCtrl::OnPaint() 
  104. {
  105. CPaintDC dc(this); // device context for painting
  106. // TODO: Add your message handler code here
  107. if(m_nCurrentPosition<=m_nLower||m_nCurrentPosition>=m_nUpper)
  108. {
  109. CRect rect;
  110. GetClientRect(rect);
  111. CBrush brush;
  112. brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
  113. dc.FillRect(&rect,&brush);
  114. VERIFY(brush.DeleteObject());
  115. return;
  116. }
  117. CRect rectClient;
  118. GetClientRect(rectClient);
  119. float maxWidth((float)m_nCurrentPosition/(float)m_nUpper*(float)rectClient.right);
  120. //绘制
  121. DrawGradient(&dc,rectClient,(int)maxWidth);
  122. //显示进程条进度文字
  123. if(m_bShowPercent)
  124. {
  125. CString percent;
  126. percent.Format("%d%%",(int)(100*(float)m_nCurrentPosition/m_nUpper));
  127. dc.SetTextColor(m_clrText);
  128. dc.SetBkMode(TRANSPARENT);
  129. dc.DrawText(percent,&rectClient,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
  130. }
  131. // Do not call CProgressCtrl::OnPaint() for painting messages
  132. }
  133. int CGradientProgressCtrl::SetPos(int nPos)
  134. {
  135. //Set the Position of the Progress
  136. m_nCurrentPosition=nPos;
  137. return (CProgressCtrl::SetPos(nPos));
  138. }