MonitorSpeedbase.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // MonitorSpeedbase.cpp: implementation of the CMonitorSpeedbase class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "MonitorSpeedbase.h"
  7. #include "FileBase.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CMonitorSpeedbase::CMonitorSpeedbase()
  17. {
  18. m_pCategoryDownload = 0;
  19. m_lUpRate = 0, m_lDownRate = 0;
  20. m_lGridWidth = 1;
  21. m_lIndex = 0;
  22. memset(m_lValueUp, 0, eCount*sizeof(long));
  23. memset(m_lValueDown, 0, eCount*sizeof(long));
  24. }
  25. CMonitorSpeedbase::~CMonitorSpeedbase()
  26. {
  27. }
  28. void CMonitorSpeedbase::CreateEx(CCategoryDownload* pCategoryDownload, long lFontSize)
  29. {
  30. ASSERT(pCategoryDownload);
  31. m_pCategoryDownload = pCategoryDownload;
  32. m_font.CreateFont(-lFontSize, 0, 0, 0, 400, 0, 0, 0, 134, 0, 0, 0, 2, "宋体");
  33. }
  34. void CMonitorSpeedbase::OnTimer()
  35. {
  36. if (!m_pCategoryDownload)
  37. {
  38. assert(false);
  39. return;
  40. }
  41. long lDownRate = 0, lUpRate = 0;
  42. m_pCategoryDownload->GetRateTotals(lUpRate, lDownRate);
  43. if (lDownRate != m_lDownRate ||  lUpRate != m_lUpRate)
  44. {
  45. m_lDownRate = lDownRate ;
  46. m_lUpRate = lUpRate;
  47. }
  48. if (--m_lIndex < 0)
  49. {
  50. m_lIndex = eCount - 1;
  51. }
  52. // m_lUpRate = rand()%(200*1024);
  53. // m_lDownRate = rand()%(200*1024);
  54. m_lValueUp[m_lIndex] = m_lUpRate/1024;
  55. m_lValueDown[m_lIndex] = m_lDownRate/1024;
  56. }
  57. void CMonitorSpeedbase::OnPaint(CDC& dc, CRect rc, bool bShowText) 
  58. {
  59. //
  60. // Get rect.
  61. //
  62. CRect rcText = rc;
  63. rcText.bottom = rcText .top + 10;
  64. CRect rcUp = rc;
  65. rcUp.top += 2;
  66. if (rc.Width() < 100)
  67. bShowText = false;
  68. if (bShowText)
  69. {
  70. rcUp.bottom -= 20;
  71. }
  72. // rcUp.right = rcUp.left + rcUp.Width()/2;
  73. CRect rcDown = rcUp;
  74. // rcUp.OffsetRect(rcUp.Width(), 0);
  75. CRect rcSpeed = rc;
  76. rcSpeed.top = rcSpeed.bottom - 20;
  77. CRect rcSpeedFrame = rcSpeed;
  78. rcSpeed.right = rcSpeed.left + rcSpeed.Width()/2;
  79. //
  80. // Get max value.
  81. //
  82. int iVisibleCount = rcUp.Width()/m_lGridWidth;
  83. long lMax = 5;
  84. long lRet = GetMaxValue(m_lValueUp, iVisibleCount);
  85. if (lRet > lMax ) lMax = lRet;
  86. lRet = GetMaxValue(m_lValueDown, iVisibleCount);
  87. if (lRet > lMax ) lMax = lRet;
  88. if (lMax %5)
  89. lMax = (lMax/5 + 1) * 5;
  90. assert (lMax > 0);
  91. //
  92. // ShowText
  93. //
  94. dc.SetBkMode(TRANSPARENT);
  95. CFont* pOldFont = dc.SelectObject(&m_font);
  96. // dc.SetROP2(
  97. CString strText;
  98. // strText.Format("D:%s/s, U:%s/s", FormatSize(m_lDownRate).data(), FormatSize(m_lUpRate).data());
  99. if (bShowText)
  100. {
  101. dc.SetTextColor(RGB(125, 172, 249));
  102. strText.Format("D:%s/s ", FormatSize(m_lDownRate).data());
  103. dc.DrawText(strText, rcSpeed, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
  104. rcSpeed.OffsetRect(rcSpeed.Width(), 0);
  105. dc.SetTextColor(RGB(249, 152, 111));
  106. strText.Format("U:%s/s", FormatSize(m_lUpRate).data());
  107. dc.DrawText(strText, rcSpeed, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
  108. }
  109. strText.Format("%dK/S", lMax);
  110. dc.SetTextColor(RGB(0, 0, 0));
  111. dc.DrawText(strText, rcText, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
  112. dc.SelectObject(pOldFont);
  113. //
  114. // draw graph.
  115. //
  116. DrawLine(m_lValueDown, dc, RGB(125, 172, 249), rcDown, lMax , iVisibleCount);
  117. DrawLine(m_lValueUp, dc, RGB(249, 152, 111), rcUp, lMax, iVisibleCount);
  118. //
  119. // draw splitter.
  120. //
  121. CPen curPen;
  122. curPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
  123. CPen* pOldPen = dc.SelectObject(&curPen);
  124. if (bShowText)
  125. {
  126. dc.MoveTo(rcSpeedFrame.left, rcSpeedFrame.top);
  127. dc.LineTo(rcSpeedFrame.right, rcSpeedFrame.top);
  128. }
  129. dc.MoveTo(rcUp.right, rcUp.bottom);
  130. dc.LineTo(rcUp.right, rc.top);
  131. dc.SelectObject(pOldPen);
  132. }
  133. long CMonitorSpeedbase::GetMaxValue( long lValue[], long lCount)
  134. {
  135. long lMax = 5;
  136. long lDone = 0;
  137. for (int i=m_lIndex; i<eCount; i++)
  138. {
  139. if (lValue[i] > lMax)
  140. lMax = lValue[i];
  141. if (++lDone > lCount)
  142. return lMax;
  143. }
  144. for (i=0; i<m_lIndex; i++)
  145. {
  146. if (lValue[i] > lMax)
  147. lMax = lValue[i];
  148. if (++lDone > lCount)
  149. return lMax;
  150. }
  151. return lMax;
  152. }
  153. void CMonitorSpeedbase::DrawLine(long lValue[], CDC& dc, COLORREF cor, CRect& rc, long lMax, long iVisibleCount) 
  154. {
  155. if (lMax <= 0)
  156. {
  157. assert(false);
  158. return;
  159. }
  160. long lDone = 0;
  161. long ileft = rc.left;
  162. int iHeight = rc.Height();
  163. float fUnit = (float)iHeight / lMax ;
  164. if (iHeight < 0)
  165. return;
  166. CPen curPen;
  167. curPen.CreatePen(PS_SOLID, 1, cor);
  168. CPen* pOldPen = dc.SelectObject(&curPen);
  169. dc.MoveTo(ileft, rc.bottom - (long)(lValue[m_lIndex] * fUnit));
  170. ileft += m_lGridWidth;
  171. for (int i=m_lIndex + 1; i<eCount; i++)
  172. {
  173. if (lDone++ > iVisibleCount)
  174. break;
  175. dc.LineTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  176. dc.MoveTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  177. ileft += m_lGridWidth;
  178. }
  179. for (i=0; i<m_lIndex; i++)
  180. {
  181. if (lDone++ > iVisibleCount)
  182. break;
  183. dc.LineTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  184. dc.MoveTo(ileft, rc.bottom - (long)(lValue[i] * fUnit));
  185. ileft += m_lGridWidth;
  186. }
  187. dc.SelectObject(pOldPen);
  188. }