WaveDisplay.cpp
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:9k
源码类别:

控制台编程

开发平台:

C/C++

  1. #include "StdAfx.h"
  2. #include ".wavedisplay.h"
  3. //////////////////////////////////////////////////////////////////////////
  4. // class CWaveDisplay
  5. //
  6. // 功能: 实现数据的在GUI上的显示
  7. // 创建人: 陈文凯 (chwkai@gmail.com)
  8. // 创建日期:2005年5月19日
  9. // 修改人:
  10. // 修改日期:
  11. // 版本
  12. CWaveDisplay::CWaveDisplay(HWND hOwner)
  13. : m_nPrecision(0)
  14. {
  15. this->InitDefaultSetting();
  16. // 设定父控件
  17. this->m_hOwner = hOwner;
  18. }
  19. CWaveDisplay::~CWaveDisplay(void)
  20. {
  21. this->Dispose();
  22. }
  23. BEGIN_MESSAGE_MAP(CWaveDisplay, CStatic)
  24. ON_WM_PAINT()
  25. ON_WM_MOUSEWHEEL()
  26. END_MESSAGE_MAP()
  27. //////////////////////////////////////////////////////////////////////////
  28. // 调用默认设置函数,初始化显示区域
  29. void CWaveDisplay::InitDefaultSetting()
  30. {
  31. // 缓冲为空
  32. this->m_pBuffer = NULL;
  33. //// 设置显示参数
  34. this->SetGridWidth();
  35. this->SetCoordinateWidth();
  36. this->SetCellSize();
  37. this->SetLineWidth();
  38. this->SetPrecision();
  39. this->SetLineColor();
  40. this->SetBkColor();
  41. this->SetGridColor();
  42. this->SetCoordinateColor();
  43. this->SetXMetrics();
  44. this->SetYMetrics();
  45. this->SetZoomStep();
  46. }
  47. //////////////////////////////////////////////////////////////////////////
  48. // 进行显示区域初始化,画出背景和网格
  49. void CWaveDisplay::DrawTable(CPaintDC* pDc)
  50. {
  51. CSize size; // 显示区域大小
  52. int curVPos = 0; // 绘制线条处的y
  53. int curHPos = 0; // 绘制线条处的x
  54. CPen linePen(0, this->m_nGridWidth, this->m_refGridColor); // 设置网格线条
  55. CPen coPen(0, this->m_nCoordinateWidth, this->m_refCoordinateColor); // 设置坐标轴线条
  56. CBrush bkBrush(this->m_refBkColor); // 用于设置背景色
  57. // 获取显示区域大小,并设定区域原点位置
  58. this->GetClientRect(&this->m_clientRect);
  59. size = this->m_clientRect.Size();
  60. this->m_ptOrigin.y = (this->m_clientRect.bottom - this->m_clientRect.top) / 2;
  61. this->m_ptOrigin.x = 0;
  62. this->m_ptCurPos = this->m_ptOrigin;
  63. // 填充背景
  64. pDc->FillRect(&this->m_clientRect, &bkBrush);
  65. // 绘制X轴
  66. pDc->SelectObject(coPen);
  67. pDc->MoveTo(this->m_ptOrigin.x, this->m_ptOrigin.y);
  68. pDc->LineTo(this->m_clientRect.right - this->m_clientRect.left, this->m_ptOrigin.y);
  69. // 绘制网格线
  70. pDc->SelectObject(linePen);
  71. // 先绘制纵向线条
  72. curHPos = this->m_ptOrigin.x;
  73. while (curHPos < size.cx)
  74. {
  75. pDc->MoveTo(curHPos, 0);
  76. pDc->LineTo(curHPos, size.cy);
  77. curHPos += this->m_nCellSize;
  78. }
  79. // 再绘制横向线条,先绘制上半轴
  80. curVPos = this->m_ptOrigin.y - this->m_nCellSize;
  81. while (curVPos > 0)
  82. {
  83. pDc->MoveTo(this->m_ptOrigin.x, curVPos);
  84. pDc->LineTo(size.cx, curVPos);
  85. curVPos -= this->m_nCellSize;
  86. }
  87. // 再绘制下半轴
  88. curVPos = this->m_ptOrigin.y + this->m_nCellSize;
  89. while (curVPos < this->m_clientRect.bottom)
  90. {
  91. pDc->MoveTo(this->m_ptOrigin.x, curVPos);
  92. pDc->LineTo(size.cx, curVPos);
  93. curVPos += this->m_nCellSize;
  94. }
  95. }
  96. //////////////////////////////////////////////////////////////////////////
  97. // 按设定的显示精度,绘制数据
  98. void CWaveDisplay::DrawData(CPaintDC* pDc)
  99. {
  100. CPen linePen(0, this->m_nLineWidth, this->m_refLineColor);
  101. UINT nCount = 0;
  102. // 读取缓冲数据
  103. if (this->m_pBuffer != NULL)
  104. {
  105. pDc->SelectObject(linePen);
  106. pDc->MoveTo(this->m_ptCurPos);
  107. for (UINT nCount = 0; 
  108. nCount < this->m_pBuffer->nSize && this->m_ptCurPos.x < this->m_clientRect.right; 
  109. nCount += this->m_nPrecision)
  110. {
  111. // 计算纵坐标
  112. this->m_ptCurPos.y = this->m_pBuffer->lpData[nCount] * this->m_fYMetrics;
  113. this->m_ptCurPos.y = this->m_ptOrigin.y - this->m_ptCurPos.y;
  114. // 对数值进行截取
  115. this->m_ptCurPos.y  = 
  116. (this->m_ptCurPos.y > this->m_clientRect.bottom ? 
  117. this->m_clientRect.bottom : this->m_ptCurPos.y);
  118. this->m_ptCurPos.y  = 
  119. (this->m_ptCurPos.y < this->m_clientRect.top ? 
  120. this->m_clientRect.top : this->m_ptCurPos.y);
  121. pDc->LineTo(this->m_ptCurPos);
  122. //pDc->MoveTo(this->m_ptCurPos);
  123. this->m_ptCurPos.x += this->m_fXMetrics;
  124. }
  125. }
  126. }
  127. //////////////////////////////////////////////////////////////////////////
  128. // 释放所占用的资源
  129. void CWaveDisplay::Dispose()
  130. {
  131. PDisplayChunk lpTemp = NULL;
  132. while (this->m_pBuffer != NULL)
  133. {
  134. lpTemp = this->m_pBuffer;
  135. this->m_pBuffer = this->m_pBuffer->lpNext;
  136. if (lpTemp->lpData != NULL)
  137. {
  138. delete[] lpTemp->lpData;
  139. }
  140. delete[] lpTemp;
  141. }
  142. this->m_pBuffer = NULL;
  143. }
  144. //////////////////////////////////////////////////////////////////////////
  145. // 设定显示数据
  146. void CWaveDisplay::LoadData(double* pData,  unsigned int nSize)
  147. {
  148. BOOL bRet = false; // 设定样本是否成功
  149. PDisplayChunk pChunk = NULL;
  150. if (pData != NULL)
  151. {
  152. // 拷贝显示数据
  153. pChunk = new DisplayChunk;
  154. pChunk->lpData = new double[nSize];
  155. pChunk->nDataReaded = 0;
  156. pChunk->nSize = nSize;
  157. pChunk->lpNext = NULL;
  158. memcpy(pChunk->lpData, pData, sizeof(double) * nSize);
  159. }
  160. this->m_pBuffer = pChunk;
  161. // 画出新数据
  162. this->Invalidate();
  163. }
  164. //////////////////////////////////////////////////////////////////////////
  165. // 加入新的显示缓冲块,维护缓冲块链表
  166. //void CWaveDisplay::AppendBuffer(PDisplayChunk pChunk)
  167. //{
  168. // PDisplayChunk lpTemp = NULL;
  169. //
  170. // if (pChunk != NULL && pChunk->lpData != NULL)
  171. // {
  172. // // 若显示缓冲为空
  173. // if (this->m_pBuffer == NULL)
  174. // {
  175. // this->m_pBuffer = pChunk;
  176. // }
  177. // // 把缓冲添加到链表最后
  178. // else
  179. // {
  180. // lpTemp = this->m_pBuffer;
  181. //
  182. // while (lpTemp->lpNext != NULL)
  183. // {
  184. // lpTemp = lpTemp->lpNext;
  185. // }
  186. //
  187. // lpTemp->lpNext = pChunk;
  188. // }
  189. //
  190. // pChunk->lpNext = NULL;
  191. // }
  192. //}
  193. //////////////////////////////////////////////////////////////////////////
  194. // 设定波形颜色
  195. void CWaveDisplay::SetLineColor( int nRed /* = 0 */, int nGreen /* = 128 */, int nBlack /* = 64 */)
  196. {
  197. this->m_refLineColor = RGB(nRed, nGreen, nBlack);
  198. }
  199. //////////////////////////////////////////////////////////////////////////
  200. // 设定背景颜色
  201. void CWaveDisplay::SetBkColor( int nRed /* = 0 */, int nGreen /* = 0 */, int nBlack /* = 0 */)
  202. {
  203. this->m_refBkColor = RGB(nRed, nGreen, nBlack);
  204. }
  205. //////////////////////////////////////////////////////////////////////////
  206. // 设定坐标轴颜色
  207. void CWaveDisplay::SetCoordinateColor( int nRed /* = 255 */, int nGreen /* = 255 */, int nBlack /* = 0 */)
  208. {
  209. this->m_refCoordinateColor = RGB(nRed, nGreen, nBlack);
  210. }
  211. //////////////////////////////////////////////////////////////////////////
  212. // 设定网格颜色
  213. void CWaveDisplay::SetGridColor( int nRed /* = 0 */, int nGreen /* = 128 */, int nBlack /* = 64s */)
  214. {
  215. this->m_refGridColor = RGB(nRed, nGreen, nBlack);
  216. }
  217. //////////////////////////////////////////////////////////////////////////
  218. // 设定X轴逻辑单元宽度
  219. void CWaveDisplay::SetXMetrics(float fValue /* = 1 */)
  220. {
  221. if (fValue > 0)
  222. {
  223. this->m_fXMetrics = fValue;
  224. }
  225. }
  226. //////////////////////////////////////////////////////////////////////////
  227. // 设定Y轴逻辑单元宽度
  228. void CWaveDisplay::SetYMetrics(float fValue /* = 1 */)
  229. {
  230. if (fValue > 0)
  231. {
  232. this->m_fYMetrics = fValue;
  233. }
  234. }
  235. //////////////////////////////////////////////////////////////////////////
  236. // 设定显示单元格的宽(高)度,以象素为单位
  237. void CWaveDisplay::SetCellSize(UINT nSize /* = 10 */)
  238. {
  239. this->m_nCellSize = nSize;
  240. }
  241. //////////////////////////////////////////////////////////////////////////
  242. // 设定数据线条宽度
  243. void CWaveDisplay::SetLineWidth(UINT nWidth /* = 1 */)
  244. {
  245. this->m_nLineWidth = nWidth;
  246. }
  247. //////////////////////////////////////////////////////////////////////////
  248. // 设定坐标轴宽度
  249. void CWaveDisplay::SetCoordinateWidth(UINT nWidth /* = 1 */)
  250. {
  251. this->m_nCoordinateWidth = nWidth;
  252. }
  253. //////////////////////////////////////////////////////////////////////////
  254. // 设定网格线宽度
  255. void CWaveDisplay::SetGridWidth(UINT nWidth /* = 1 */)
  256. {
  257. this->m_nGridWidth = nWidth;
  258. }
  259. //////////////////////////////////////////////////////////////////////////
  260. // 重载CWnd::OnPaint,绘制波形数据
  261. void CWaveDisplay::OnPaint()
  262. {
  263. CPaintDC dc(this);
  264. this->DrawTable(&dc);
  265. this->DrawData(&dc);
  266. }
  267. //////////////////////////////////////////////////////////////////////////
  268. // 设定显示精度
  269. void CWaveDisplay::SetPrecision(UINT nPrecision)
  270. {
  271. this->m_nPrecision = nPrecision;
  272. }
  273. //////////////////////////////////////////////////////////////////////////
  274. // 用鼠标中键滚动,进行显示微调时的放大倍数
  275. void CWaveDisplay::SetZoomStep(UINT nStep)
  276. {
  277. this->m_nZoomStep = nStep;
  278. }
  279. //////////////////////////////////////////////////////////////////////////
  280. // 在鼠标中间滚动时,进行显示微调
  281. BOOL CWaveDisplay::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
  282. {
  283. // TODO: 在此添加消息处理程序代码和/或调用默认值
  284. // 放大
  285. if (zDelta > 0)
  286. {
  287. this->m_fYMetrics *= this->m_nZoomStep;
  288. }
  289. else
  290. {
  291. this->m_fYMetrics /= this->m_nZoomStep;
  292. }
  293. // 重绘数据
  294. this->Invalidate();
  295. return TRUE;
  296. }
  297. //////////////////////////////////////////////////////////////////////////
  298. // 获取显示微调放大倍数
  299. UINT CWaveDisplay::GetZoomSetp() const
  300. {
  301. return this->m_nZoomStep;
  302. }
  303. //////////////////////////////////////////////////////////////////////////
  304. // 获取Y放大倍数
  305. float CWaveDisplay::GetYMetrics() const
  306. {
  307. return this->m_fYMetrics;
  308. }
  309. //////////////////////////////////////////////////////////////////////////
  310. // 获取X放大倍数
  311. float CWaveDisplay::GetXMetrics() const
  312. {
  313. return this->m_fXMetrics;
  314. }
  315. //////////////////////////////////////////////////////////////////////////
  316. // 获取显示精度
  317. UINT CWaveDisplay::GetPrecision() const
  318. {
  319. return this->m_nPrecision;
  320. }