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

P2P编程

开发平台:

Visual C++

  1. // GraphHaveData.cpp: implementation of the CGraphHaveData class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "GraphHaveData.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CGraphHaveData::CGraphHaveData()
  16. {
  17. m_lPenWidth = 1;
  18. m_rc = CRect (0, 0, 100, 100);
  19. m_pParent = 0;
  20. }
  21. CGraphHaveData::~CGraphHaveData()
  22. {
  23. }
  24. BOOL CGraphHaveData::Create(CRect rc, CWnd* pParent) 
  25. {
  26. m_pParent = pParent;
  27. m_rc = rc;
  28. return TRUE;
  29. }
  30. void CGraphHaveData::SetData(const vector<bool>& vData) 
  31. {
  32. // m_vData = (const vector<long>& )vData;
  33. m_vData.clear();
  34. for (int i=0; i<vData.size(); i++)
  35. {
  36. m_vData.push_back((long)vData[i]);
  37. }
  38. OnSizeChange();
  39. if (!m_pParent)
  40. {
  41. ASSERT(false);
  42. return;
  43. }
  44. // CClientDC dc(m_pParent);
  45. // Draw(dc);
  46. }
  47. void CGraphHaveData::SetData(const vector<long>& vData) 
  48. {
  49. m_vData = vData;
  50. OnSizeChange();
  51. if (!m_pParent)
  52. {
  53. ASSERT(false);
  54. return;
  55. }
  56. CClientDC dc(m_pParent);
  57. Draw(dc);
  58. }
  59. void CGraphHaveData::SetSize(CRect rc) 
  60. {
  61. m_rc = rc;
  62. OnSizeChange();
  63. if (!m_pParent) return;
  64. CClientDC dc(m_pParent);
  65. Draw(dc);
  66. }
  67. void CGraphHaveData::OnSizeChange() 
  68. {
  69. m_vShowData.clear();
  70. int iCount = m_vData.size();
  71. if (!iCount || m_rc.Width() <= 0) return;
  72. long lSubCount = 1;
  73. m_lPenWidth = 1;
  74. long lOffset = 0;
  75. long lItemCount = 0;
  76. if (iCount <= m_rc.Width())
  77. {
  78. lItemCount = iCount;
  79. m_lPenWidth = m_rc.Width() / iCount;
  80. if (m_rc.Width() % iCount)
  81. lOffset = (m_rc.Width() - (m_rc.Width() % iCount))/ (m_rc.Width() % iCount);
  82. }
  83. else
  84. {
  85. lItemCount = m_rc.Width();
  86. lSubCount = iCount / m_rc.Width();
  87. // if (iCount % rc.Width())
  88. // lSubCount++;
  89. }
  90. int iLeft = 0;
  91. for (int i=0; i<lItemCount; i++)
  92. {
  93. long lValue = 1;
  94. for (int j=0; j<lSubCount; j++)
  95. {
  96. long inx = i*lSubCount + j;
  97. if (m_vData[inx] == 0)
  98. {
  99. lValue = 0;
  100. break;
  101. }
  102. if (m_vData[inx] == 2)
  103. lValue = 2;
  104. }
  105. m_vShowData.push_back(lValue);
  106. if (lOffset && i % lOffset == 0)
  107. {
  108. m_vShowData.push_back(lValue);
  109. }
  110. }
  111. }
  112. void CGraphHaveData::Draw(CDC& dc, CPoint ptOffset) 
  113. {
  114. CRect rc = m_rc;
  115. rc.OffsetRect(ptOffset);
  116. for (int i=0;i<m_vShowData.size(); i++)
  117. {
  118. COLORREF col = RGB(10, 36, 106);
  119. if (m_vShowData[i] == 2)
  120. col = RGB(249, 152, 111);
  121. else if (m_vShowData[i] == 0)
  122. col = RGB(255, 255, 255);
  123. if (m_lPenWidth <= 1)
  124. {
  125. CPen curPen;
  126. curPen.CreatePen(PS_SOLID, m_lPenWidth, col);
  127. CPen* pOldPen = dc.SelectObject(&curPen);
  128. dc.MoveTo(rc.left + i * m_lPenWidth, rc.top );
  129. dc.LineTo(rc.left + i * m_lPenWidth, rc.bottom );
  130. dc.SelectObject(pOldPen);
  131. }
  132. else
  133. {
  134. CRect rcFill = CRect(rc.left + i * m_lPenWidth, rc.top, rc.left + (i+1) * m_lPenWidth, rc.bottom);
  135. // rcFill.DeflateRect(1, 1);
  136. dc.FillRect(rcFill, &CBrush(col));
  137. // dc.Draw3dRect(rc.left + i * m_lPenWidth, rc.top, m_lPenWidth, rc.Height(), col,RGB(0,0,0));
  138. }
  139. }
  140. dc.Draw3dRect(rc, RGB(0,0,0), RGB(0,0,0));
  141. }