StaticDataCurve.cpp
上传用户:shmeyee
上传日期:2015-06-28
资源大小:108k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // StaticDataCurve.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "BlueToothExc.h"
  5. #include "StaticDataCurve.h"
  6. #include "DlgDataShow.h"
  7. // CStaticDataCurve
  8. IMPLEMENT_DYNAMIC(CStaticDataCurve, CStatic)
  9. CStaticDataCurve::CStaticDataCurve()
  10. : m_data ( NULL )
  11. , m_size ( 0 )
  12. , m_nCurScale ( 100 )
  13. , m_nCurStartPos(0)
  14. , m_nDynamicStep ( 1 )
  15. {
  16. m_clrLinePallid = RGB(0,128,0);
  17. m_clrLineHighlight = RGB(0,255,0);
  18. }
  19. CStaticDataCurve::~CStaticDataCurve()
  20. {
  21. if ( m_brsBkGnd.GetSafeHandle() )
  22. {
  23. m_brsBkGnd.DeleteObject();
  24. }
  25. if ( m_data ) delete[] m_data;
  26. m_data = NULL;
  27. }
  28. BEGIN_MESSAGE_MAP(CStaticDataCurve, CStatic)
  29. ON_WM_PAINT()
  30. ON_WM_ERASEBKGND()
  31. ON_WM_TIMER()
  32. END_MESSAGE_MAP()
  33. BOOL CStaticDataCurve::OnEraseBkgnd(CDC* pDC) 
  34. {
  35. if ( m_brsBkGnd.GetSafeHandle() )
  36. {
  37. CRect rcClient(0,0,0,0);
  38. GetClientRect ( &rcClient );
  39. pDC->FillRect ( &rcClient, &m_brsBkGnd );
  40. }
  41. return TRUE;
  42. }
  43. // CStaticDataCurve 消息处理程序
  44. void CStaticDataCurve::DrawDataCurve(BYTE* data, int size)
  45. {
  46. if ( m_data && size==m_size && memcmp(m_data,data,size)==0 )
  47. {
  48. TRACE ( _T("Not changedn") );
  49. }
  50. else
  51. {
  52. if ( m_data ) delete[] m_data;
  53. m_data = new BYTE[size];
  54. memcpy ( m_data, data, size );
  55. m_size = size;
  56. }
  57. if ( IsWindow(m_hWnd) )
  58. {
  59. Invalidate ();
  60. }
  61. }
  62. void CStaticDataCurve::OnPaint() 
  63. {
  64. CPaintDC dc(this); // device context for painting
  65. CDC *pDC = &dc;
  66. CRect rcClient(0,0,0,0);
  67. GetClientRect ( &rcClient );
  68. // 画数据曲线
  69. int size = 0;
  70. BYTE *data = GetSingleDrawingData ( rcClient, size );
  71. if ( data )
  72. {
  73. rcClient.DeflateRect ( 4, 4 );
  74. DrawCurveByDataBuffer ( &dc, rcClient, m_clrLineHighlight, data, size, CELL_SIZE );
  75. delete[] data;
  76. data = NULL;
  77. }
  78. }
  79. void CStaticDataCurve::SetBkColor(COLORREF clr)
  80. {
  81. if ( m_brsBkGnd.GetSafeHandle() )
  82. {
  83. m_brsBkGnd.DeleteObject();
  84. }
  85. m_brsBkGnd.CreateSolidBrush ( clr );
  86. if ( ::IsWindow ( m_hWnd ) )
  87. Invalidate ();
  88. }
  89. void CStaticDataCurve::PreSubclassWindow() 
  90. {
  91. CStatic::PreSubclassWindow();
  92. SetBkColor ( RGB(0,0,0) );
  93. }
  94. //
  95. // 设置前景线条和文字的颜色
  96. //
  97. void CStaticDataCurve::SetForeColor(COLORREF clrLinePallid, COLORREF clrLineHighlight)
  98. {
  99. m_clrLinePallid = clrLinePallid;
  100. m_clrLineHighlight = clrLineHighlight;
  101. if ( ::IsWindow ( m_hWnd ) )
  102. Invalidate ();
  103. }
  104. //
  105. // 计算当前的X轴步长
  106. //
  107. float CStaticDataCurve::CalcStepX(void)
  108. {
  109. ASSERT ( m_nCurScale > 0 );
  110. float fStepX = (float)m_nCurScale * (float)NORMAL_SCALE_STEP_X / (float)100;
  111. if ( fStepX < 1.0 ) fStepX = 1.0;
  112. return fStepX;
  113. }
  114. //
  115. // 设置显示比例
  116. //
  117. BOOL CStaticDataCurve::SetScale(int nScale)
  118. {
  119. if ( nScale < 10 || nScale > 1000 ) return FALSE;
  120. if ( nScale == m_nCurScale ) return TRUE;
  121. m_nCurScale = nScale;
  122. if ( ::IsWindow ( m_hWnd ) )
  123. Invalidate ();
  124. return TRUE;
  125. }
  126. //
  127. // 计算当前可以显示多少个字节的数据
  128. //
  129. int CStaticDataCurve::CalcShowDataBytes(CRect& rcClient, float fStepX)
  130. {
  131. ASSERT ( fStepX > 0.0 );
  132. return (int)((float)CELL_SIZE * (float)rcClient.Width() / fStepX);
  133. }
  134. //
  135. // 得到单次用来画线的数据,注意:及时用 delete[] 删除返回的数据
  136. //
  137. BYTE* CStaticDataCurve::GetSingleDrawingData(CRect &rcClient, OUT int& size)
  138. {
  139. if ( m_size <= 0 ) return NULL;
  140. ASSERT ( m_nCurStartPos < m_size );
  141. float fStepX = CalcStepX ();
  142. ASSERT ( fStepX > 0.0 );
  143. int nShowDataBytes = CalcShowDataBytes ( rcClient, fStepX );
  144. BYTE *data = new BYTE[nShowDataBytes];
  145. if ( !data ) return NULL;
  146. // 先从 m_nCurStartPos 开始处取尾部的数据
  147. size = nShowDataBytes;
  148. int nCopyBytes = m_size - m_nCurStartPos;
  149. if ( nCopyBytes > nShowDataBytes )
  150. nCopyBytes = nShowDataBytes;
  151. memcpy ( data, m_data+m_nCurStartPos, nCopyBytes );
  152. if ( nCopyBytes >= nShowDataBytes ) return data;
  153. // 数据不够时循环使用前面的数据接上来使用
  154. while ( nShowDataBytes - nCopyBytes > 0 )
  155. {
  156. int nCanCopyBytes = MIN(m_size,nShowDataBytes - nCopyBytes);
  157. memcpy ( data+nCopyBytes, m_data, nCanCopyBytes );
  158. nCopyBytes += nCanCopyBytes;
  159. }
  160. return data;
  161. }
  162. //
  163. // 设置当前起始位置
  164. //
  165. BOOL CStaticDataCurve::SetCurStartPos(int nCurStartPos)
  166. {
  167. if ( m_size < 1 ) return FALSE;
  168. if ( nCurStartPos < 0 )
  169. return FALSE;
  170. nCurStartPos %= m_size;
  171. if ( m_nCurStartPos == nCurStartPos )
  172. return TRUE;
  173. m_nCurStartPos = nCurStartPos;
  174. if ( ::IsWindow ( m_hWnd ) )
  175. Invalidate ();
  176. return TRUE;
  177. }
  178. void CStaticDataCurve::OnTimer(UINT_PTR nIDEvent)
  179. {
  180. if ( nIDEvent == 1 )
  181. {
  182. if ( !SetCurStartPos ( m_nCurStartPos+m_nDynamicStep ) )
  183. m_nCurStartPos = 0;
  184. ( (CDlgDataShow*)GetParent() )->ShowCurStartPos ( m_nCurStartPos );
  185. }
  186. CStatic::OnTimer(nIDEvent);
  187. }
  188. void CStaticDataCurve::Dynamic(int speed)
  189. {
  190. if ( m_size < 1 ) return;
  191. KillTimer ( 1 );
  192. SetTimer ( 1, speed, NULL );
  193. }
  194. void CStaticDataCurve::StopDynamic(void)
  195. {
  196. KillTimer ( 1 );
  197. }
  198. BOOL CStaticDataCurve::SetDynamicStep(int nDynamicStep)
  199. {
  200. if ( nDynamicStep < 1 || nDynamicStep >= m_size )
  201. return FALSE;
  202. m_nDynamicStep = nDynamicStep;
  203. return TRUE;
  204. }