RealTime.cpp
上传用户:mgf822
上传日期:2013-10-03
资源大小:133k
文件大小:15k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. //#include <windows.h>
  3. //#include <stdio.h>
  4. #include "RealTime.h"
  5. CALine::CALine()
  6. m_nColor = RGB(0, 0, 0);
  7. m_nLineStyle = PS_SOLID;
  8. m_nLineWidth = 0;
  9. m_pValues = NULL;
  10. m_sName = "";
  11. m_sDescription = "";
  12. m_sUnit = "";
  13. m_dMin = 0;
  14. m_dMax = 0;
  15. m_dScaleLow = 0;
  16. m_dScaleHigh = 0;
  17. m_nSize = 0; 
  18. }
  19. bool CALine::Reset(DWORD size)
  20. {
  21. assert(size > 0);
  22. if (m_pValues) free(m_pValues);
  23. m_pValues  = (CValue*)calloc((size_t)(size + 1), sizeof(CValue));
  24. if(!m_pValues) 
  25. return false;
  26. m_nSize = size;
  27. return true;
  28. }
  29. void CALine::AddValue(double& value, DWORD begin, DWORD end)
  30. {
  31. if (m_pValues == NULL) return;
  32. if (end == m_nSize)
  33. {
  34. m_pValues[begin].bFlag = 1;
  35. m_pValues[begin].YValue = value;
  36. }
  37. else
  38. {
  39. m_pValues[end].bFlag = 1;
  40. m_pValues[end].YValue = value;
  41. }
  42. }
  43. CRealTime::CRealTime()
  44. {
  45. m_bSetingFailed = true;
  46. m_nMaxPages = 1;
  47. m_nTimeStart = 0;
  48. m_nBegin = 0;
  49. m_nEnd = 0;
  50. m_nTimes = 0;
  51. m_nCounter = 1;
  52. m_nTick = 0;
  53. m_sHigh = 17;
  54. m_nPage = 0;
  55. m_nMaxTime = 0;
  56. m_nCursorTime = 0;
  57. m_pValueTime = NULL;
  58. m_pLineArray = NULL;
  59. m_pCurLine = NULL;
  60. m_wdTickLine = 2;
  61. m_crTickLine = RGB(255, 0, 0);
  62. m_SpeedLevel[0] = 10000;// 10 seconds (0.1 cycle per second)
  63. m_SpeedLevel[1] = 5000; // 5 seconds (0.2 cycle per second)
  64. m_SpeedLevel[2] = 2500; // 2.5 seconds (0.4 cycle per second)
  65. m_SpeedLevel[3] = 2000; // 2 seconds (0.5 cycle per second)
  66. m_SpeedLevel[4] = 1000; // 1 seconds (1 cycle per second)
  67. m_SpeedLevel[5] = 500; // 0.5 seconds (2 cycle per second)
  68. m_SpeedLevel[6] = 250; // 0.4 seconds (4 cycle per second)
  69. m_SpeedLevel[7] = 200; // 0.2 seconds (5 cycle per second)
  70. m_SpeedLevel[8] = 125; // 0.125 seconds(8 cycle per second)
  71. m_SpeedLevel[9] = 100;  // 0.1 second (10 cycle per second)
  72. m_nSysJS=60000;
  73. }
  74. CRealTime::~CRealTime()
  75. {
  76. if (m_pLineArray)
  77. free(m_pLineArray);
  78. if (m_pValueTime)
  79. free(m_pValueTime);
  80. int n = m_LineArray.GetSize();
  81. for(int i = n-1; i >= 0; i --)
  82. m_LineArray.RemoveAt(i);
  83. }
  84. RECT CRealTime::TickBarSize()
  85. {
  86. m_SRect    = m_PlotRect;
  87. m_SRect.top    = m_SRect.top - m_sHigh;
  88. m_SRect.bottom = m_SRect.top  + m_sHigh - 1;
  89. m_SRect.left   = m_SRect.left - 7;
  90. m_SRect.right  = m_SRect.right + 7;
  91. return m_SRect;
  92. }
  93. bool CRealTime::SetRange(double xmin, double ymin, double xmax, double ymax)
  94. {
  95. if (ymax <= ymin)
  96. return false; 
  97. m_Scale.xmin = xmin;
  98.     m_Scale.ymin = ymin;
  99.     m_Scale.xmax = xmax;
  100.     m_Scale.ymax = ymax;
  101. return true; 
  102. }
  103. bool CRealTime::InitialSetting(double CycsPerSec, DWORD StartTime, DWORD TimeSpan,
  104.    DWORD MaxSeconds, int XTick, bool IsForward)
  105. {
  106. if (!IsForward && 1000 * TimeSpan > StartTime)
  107. {
  108. int ret = MessageBox(NULL, "<1000 * TimeSpan - StartTime> must be positive valuenin initial backward drawing."
  109.  " Changed to foreward drawing?", 
  110.  "From InitialSetting() ...", MB_YESNO);
  111. if (ret == IDYES)
  112. IsForward = true;
  113. else
  114. return false;
  115. }
  116. assert(StartTime >= 0);
  117. assert(TimeSpan >= 30);
  118. assert(TimeSpan >= (DWORD)XTick);
  119. assert(MaxSeconds >= TimeSpan);
  120. MaxSeconds = TimeSpan * (MaxSeconds / TimeSpan);
  121. assert(CycsPerSec >= 0.09999 && CycsPerSec <= 10.00001f);
  122. if (MaxSeconds == TimeSpan ) MaxSeconds ++;
  123. m_nDataPerLine = (DWORD)(0.5 + MaxSeconds * CycsPerSec + 1);
  124. m_pValueTime = (DWORD*)calloc(m_nDataPerLine, sizeof(DWORD));
  125. if (!m_pValueTime) return false;
  126. m_nMaxPages = MaxSeconds / TimeSpan;
  127. m_nTimeSpan = TimeSpan;
  128. m_nXTicks = XTick;
  129. m_nCyclesPerSec = CycsPerSec;
  130. m_nCounter = (int)CycsPerSec;
  131. m_bIsForwardDrawing = IsForward;
  132. m_nSTicks = (int)(0.5 + TimeSpan * CycsPerSec);
  133. if (IsForward)
  134. {
  135. m_Scale.xmin = StartTime;
  136. m_Scale.xmax = StartTime + 1000. * TimeSpan;
  137. }
  138. else
  139. {
  140. m_Scale.xmin = StartTime - 1000. * TimeSpan;
  141. m_Scale.xmax = StartTime;
  142. }
  143. assert(m_Scale.xmin >= 0);
  144. assert(m_Scale.xmax >= 0);
  145. assert(m_Scale.xmax - m_Scale.xmin > 0);
  146. m_TimeToDraw = (DWORD)(0.5 + (m_Scale.xmax - m_Scale.xmin) / 1000 * m_nCyclesPerSec + 1);
  147. m_pLineArray = (POINT*)calloc(m_TimeToDraw, sizeof(POINT));
  148. if (!m_pLineArray)
  149. {
  150. free(m_pValueTime);
  151. return false;
  152. }
  153. m_nMin = (DWORD)m_Scale.xmin;
  154. m_nMax = (DWORD)m_Scale.xmax;
  155. SetTimeRange(m_nMin, m_nMax);
  156. m_bAutoScrollX = true;
  157. EnableLegend(false);
  158. m_bLegendShadow = false;
  159. return true;
  160. }
  161. void CRealTime::SetTimeRange(DWORD FromTime, DWORD ToTime)
  162. {
  163. assert(ToTime - FromTime > 0);
  164. m_Scale.xmin = FromTime;
  165. m_Scale.xmax = ToTime;
  166. m_Scale.dx   = (m_Scale.xmax - m_Scale.xmin) / PX;
  167. }
  168. void CRealTime::Reset()
  169. {
  170. if (m_bAutoScrollX)
  171. SetTimeRange(m_nMin, m_nMax);
  172. else
  173. {
  174. if (m_nEnd == m_nDataPerLine)
  175. m_nFrom = m_nBegin + m_nPage * (m_TimeToDraw - 1);
  176. else
  177. m_nFrom = m_nBegin + m_nPage * (m_TimeToDraw - 1); // -1 ;
  178. m_nFrom %= m_nDataPerLine;
  179. m_nTo    = m_nFrom + m_TimeToDraw - 1;
  180. m_nTo   %= m_nDataPerLine;
  181. SetTimeRange(m_pValueTime[m_nFrom], m_pValueTime[m_nTo]);
  182. }
  183. }
  184. bool CRealTime::AddALine(COLORREF color, double low, double high, 
  185.  const char* name, const char* desc, const char* unit, 
  186.  double min, double max, int style, int width)
  187. {
  188. m_LineArray.Add(m_line);
  189. int n = m_LineArray.GetSize() - 1;
  190. // support only three styles : PS_SOLID, PS_DASH, PS_DOT
  191. if (style < PS_SOLID) style = PS_SOLID;
  192. if (style > PS_DOT) style = PS_DOT;
  193. m_LineArray[n].m_nColor = color;
  194. m_LineArray[n].m_dScaleLow = low;
  195. m_LineArray[n].m_dScaleHigh = high;
  196. m_LineArray[n].m_sName = name;
  197. m_LineArray[n].m_sDescription = desc;
  198. m_LineArray[n].m_sUnit = unit;
  199. m_LineArray[n].m_dMin = min;
  200. m_LineArray[n].m_dMax = max;
  201. m_LineArray[n].m_nLineStyle = style;
  202. m_LineArray[n].m_nLineWidth = width;
  203. if (!m_LineArray[n].Reset(m_nDataPerLine))
  204. {
  205. m_LineArray.RemoveAt(n);
  206. return false;
  207. }
  208. return true;
  209. }
  210. bool CRealTime::InsertALine(int index, COLORREF color, double low, double high, 
  211.  const char* name, const char* desc, const char* unit, 
  212.  double min, double max, int style, int width)
  213. {
  214. int n = m_LineArray.GetSize();
  215. if (index < 0 || index > n)
  216. return false;
  217. m_LineArray.InsertAt(index, m_line);
  218. if (style < PS_SOLID) style = PS_SOLID;
  219. if (style > PS_DOT) style = PS_DOT;
  220. m_LineArray[index].m_nColor = color;
  221. m_LineArray[index].m_dScaleLow = low;
  222. m_LineArray[index].m_dScaleHigh = high;
  223. m_LineArray[index].m_sName = name;
  224. m_LineArray[index].m_sDescription = desc;
  225. m_LineArray[index].m_sUnit = unit;
  226. m_LineArray[index].m_dMin = min;
  227. m_LineArray[index].m_dMax = max;
  228. m_LineArray[index].m_nLineStyle = style;
  229. m_LineArray[index].m_nLineWidth = width;
  230. if (!m_LineArray[index].Reset(m_nDataPerLine))
  231. {
  232. m_LineArray.RemoveAt(index);
  233. return false;
  234. }
  235. return true;
  236. }
  237. bool CRealTime::RemoveALine(int Index)
  238. {
  239. int n = m_LineArray.GetSize();
  240. if (n <= 0 || n <= Index)
  241. return false;
  242. m_LineArray.RemoveAt(Index);
  243. return true;
  244. }
  245. void CRealTime::DrawXAxisTimeTicks(int x, int y, DWORD& ticks)
  246. {
  247. sprintf(m_sTempStr, "%d:%d:%d", ticks/3600, (ticks/60)%60, ticks%60);
  248. PrintString(x, y, 0, m_sTempStr);
  249. }
  250. void CRealTime::XAxis()
  251. {
  252. int j=0,k=6;
  253. m_nStep = (m_TimeToDraw > m_nEnd) ? m_nEnd : m_TimeToDraw;
  254. for(int i = 0; i < m_nStep; i ++) 
  255. {
  256. DWORD sec = (DWORD)(m_Scale.xmin + i * 1000 / m_nCyclesPerSec + 0.5);
  257. xb = xe = (int)(GL + (sec - m_Scale.xmin) / m_Scale.dx);
  258. if ((sec % 1000) == 0 && ((sec / 1000) % (m_nTimeSpan / m_nXTicks)) == 0)
  259. {
  260. j++;
  261. if (i == 0)
  262. SetStringAlign(LEFT, TOP);
  263. else if (i >= m_nStep - (int)m_nCyclesPerSec - 1 && m_TimeToDraw <= m_nEnd)
  264. {
  265. SetStringAlign(RIGHT, TOP);
  266. if(j==7) {
  267. m_nSysJS=m_nSysTime;
  268. k=7;
  269. }
  270. }
  271. else
  272. SetStringAlign(CENTER, TOP);
  273. ye = GB + m_bM / 7;
  274. DWORD ticks = (m_nSysJS-m_nSysJG*5*(k-j)+15) / 1000;
  275. DrawXAxisTimeTicks(xb, GB + m_bM / 5, ticks);
  276. }
  277. else 
  278. ye = GB + m_bM / 14;
  279. yb=GB;
  280. if (!(sec % 1000) && i > 0 && i < m_nStep - 1)
  281. DrawLine(xb, yb, xe, ye);
  282. }
  283. PrintTime();
  284. }
  285. void CRealTime::Grid()
  286. {
  287. HPEN hPen = ::CreatePen(PS_DOT, 0, m_nGridColor);
  288. HPEN hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
  289. m_nStep = (m_TimeToDraw > m_nEnd) ? m_nEnd : m_TimeToDraw;
  290. for(int i = 0; i < m_nStep; i ++) 
  291. {
  292. DWORD sec = (DWORD)(m_Scale.xmin + i * 1000 / m_nCyclesPerSec + 0.5);
  293. xb = xe = (int)(GL + (sec - m_Scale.xmin) / m_Scale.dx);
  294. if (xb == GL)
  295. xb = xe = GL + 1;
  296. if ((sec % 1000) == 0 && ((sec / 1000) % (m_nTimeSpan / m_nXTicks)) == 0)
  297. DrawLine(xb, GT + 1, xe, GB - 1);
  298. }
  299. for(i = 1; i < YGridTicks; i ++) 
  300. {
  301. yb = ye = GT + (int)(1.0 * i * (GB-GT) / YGridTicks);
  302. DrawLine(GL + 1, yb, GR - 1, ye);
  303. }
  304. ::SelectObject(m_hDC, hOldPen);
  305. ::DeleteObject(hPen);
  306. }
  307. void CRealTime::DrawRealTimeLines()
  308. {
  309. int n = m_LineArray.GetSize();
  310. if (m_bLegendShadow)
  311. DrawShadow(n);
  312. for(int i = 0; i < n; i ++)
  313. {
  314. m_pCurLine = &m_LineArray[i];
  315. DrawCurrentLine();
  316. if (m_bEnableLegend)
  317. {
  318. m_CurPen = ::CreatePen(m_pCurLine->m_nLineStyle, m_pCurLine->m_nLineWidth, m_pCurLine->m_nColor);
  319. m_OldPen = (HPEN)::SelectObject(m_hDC, m_CurPen);
  320. CGraphics::Legend(m_pCurLine->m_nColor, i + 1, m_pCurLine->m_sName.GetChar());
  321. ::SelectObject(m_hDC, m_OldPen);
  322. ::DeleteObject(m_CurPen);
  323. }
  324. }
  325. DrawTickLine();
  326. }
  327. void CRealTime::DrawCurrentLine()
  328. {
  329. if (m_nEnd < 2)
  330. return;
  331. m_CurPen = ::CreatePen(m_pCurLine->m_nLineStyle, m_pCurLine->m_nLineWidth, m_pCurLine->m_nColor);
  332. m_OldPen = (HPEN)::SelectObject(m_hDC, m_CurPen);
  333. m_nP = 0;
  334. DWORD nB, nE;
  335. if (m_bAutoScrollX)
  336. {
  337. nB = m_nBegin;
  338. nE = m_nEnd;
  339. // forward drawing: something like "*******------" 
  340. // or "------******------", or "------******"
  341. if (nB == 0 && nE <= m_TimeToDraw)
  342. {
  343. m_nTimeStart = nB;
  344. ForwardDraw(nB, nE);
  345. }
  346. else if (nB == 0 && nE > m_TimeToDraw)
  347. {
  348. nB = nE - m_TimeToDraw;
  349. m_nTimeStart = nB;
  350. ForwardDraw(nB, nE);
  351. }
  352. else if (nB >= m_TimeToDraw)
  353. {
  354. m_nTimeStart = nB - m_TimeToDraw;
  355. ForwardDraw(nB - m_TimeToDraw, nB);
  356. }
  357. // backward drawing: something like "******--------******"
  358. else
  359. {
  360. m_nTimeStart = nE - m_TimeToDraw + nB;
  361. BackwardDraw(nB, nE);
  362. }
  363. }
  364. else
  365. {
  366. nB = m_nFrom;
  367. nE = m_nTo + 1;
  368. if (nB <= m_nDataPerLine - m_TimeToDraw)
  369. {
  370. ForwardDraw(nB, nE);
  371. }
  372. else
  373. {
  374. ForwardDraw(nB, m_nDataPerLine);
  375. ForwardDraw(0, nE);
  376. }
  377. }
  378. if(m_nP > 1)
  379. ::Polyline(m_hDC, m_pLineArray, m_nP);
  380. ::SelectObject(m_hDC, m_OldPen);
  381. ::DeleteObject(m_CurPen);
  382. }
  383. int CRealTime::ForwardDraw(int nB, int nE)
  384. {
  385. for(int i = nB; i < nE; i ++)
  386. {
  387. if (m_pCurLine->m_pValues[i].bFlag)
  388. {
  389. m_Pt.x = (int)(GL + ((m_pValueTime[i] - m_Scale.xmin) / m_Scale.dx));
  390. m_Pt.y = (int)(GB - ((m_pCurLine->m_pValues[i].YValue - m_Scale.ymin) / m_Scale.dy));
  391. if(m_Pt.x >= GL && m_Pt.x <= GR)
  392. {
  393. assert(m_nP<m_nDataPerLine);
  394. m_pLineArray[m_nP].x = m_Pt.x;
  395. m_pLineArray[m_nP].y = m_Pt.y;
  396. m_nP++;
  397. }
  398. else // something wrong
  399. assert(false);
  400. }
  401. }
  402. return m_nP;
  403. }
  404. int CRealTime::BackwardDraw(int nB, int nE)
  405. {
  406. //-----------------------------******
  407. ForwardDraw(nE - m_TimeToDraw + nB, nE);
  408. nE = nB;
  409. nB = 0;
  410. //******-----------------------------
  411. ForwardDraw(nB, nE);
  412. return m_nP;
  413. }
  414. void CRealTime::UpdateTimeRange(DWORD& vtime)
  415. {
  416. if ((int)m_nCyclesPerSec == 0)
  417. m_nTimes += (int)(0.5 + 1 / m_nCyclesPerSec);
  418. else
  419. {
  420. if (m_nCounter == (int)m_nCyclesPerSec)
  421. {
  422. m_nTimes ++;
  423. m_nCounter = 1;
  424. }
  425. else
  426. m_nCounter ++;
  427. }
  428. if (m_nEnd == m_nDataPerLine)
  429. {
  430. if (m_nBegin == m_nDataPerLine) m_nBegin = 0;
  431. m_pValueTime[m_nBegin++] = vtime;
  432. }
  433. else
  434. m_pValueTime[m_nEnd++] = vtime;
  435. if (vtime > (DWORD)m_Scale.xmax)
  436. {
  437. DWORD span  = (DWORD)(m_Scale.xmax - m_Scale.xmin);
  438. m_nMin = vtime - span; 
  439. m_nMax = vtime;
  440. }
  441. if(m_bAutoScrollX)
  442. SetTimeRange(m_nMin, m_nMax);
  443. else
  444. {
  445. m_nFrom ++; 
  446. m_nTo ++;
  447. if (m_nFrom == m_nDataPerLine)
  448. m_nFrom = 0;
  449. if (m_nTo == m_nDataPerLine)
  450. m_nTo = 0;
  451. SetTimeRange(m_pValueTime[m_nFrom], m_pValueTime[m_nTo]);
  452. }
  453. }
  454. DWORD CRealTime::GetCursorTime()
  455. {
  456. DWORD time;
  457. if (m_bAutoScrollX)
  458. {
  459. if (m_nEnd < (int)m_TimeToDraw) 
  460. {
  461. time = m_pValueTime[m_nTick];
  462. }
  463. else if (m_nEnd < m_nDataPerLine)
  464. {
  465. time = m_pValueTime[m_nEnd - m_TimeToDraw + m_nTick];
  466. }
  467. else
  468. {
  469. int tv = m_nDataPerLine - m_nSTicks + m_nBegin + m_nTick - 1;
  470. tv %= m_nDataPerLine;
  471. time = m_pValueTime[tv];
  472. }
  473. }
  474. else
  475. {
  476. int tv = m_nFrom % m_nDataPerLine;
  477. tv += m_nTick;
  478. tv %= m_nDataPerLine;
  479. time = m_pValueTime[tv];
  480. }
  481. return time;
  482. }
  483. int CRealTime::GetCursorTimeAndIndex(DWORD& time)
  484. {
  485. int Index;
  486. if (m_bAutoScrollX)
  487. {
  488. if (m_nEnd < (int)m_TimeToDraw) 
  489. {
  490. Index = m_nTick;
  491. time  = m_pValueTime[Index];
  492. }
  493. else if (m_nEnd < m_nDataPerLine)
  494. {
  495. Index = m_nEnd - m_TimeToDraw + m_nTick;
  496. time = m_pValueTime[Index];
  497. }
  498. else
  499. {
  500. int tv = m_nDataPerLine - m_nSTicks + m_nBegin + m_nTick - 1;
  501. tv %= m_nDataPerLine;
  502. Index = tv;
  503. time = m_pValueTime[Index];
  504. }
  505. }
  506. else
  507. {
  508. int tv = m_nFrom % m_nDataPerLine;
  509. tv += m_nTick;
  510. tv %= m_nDataPerLine;
  511. Index = tv;
  512. time = m_pValueTime[Index];
  513. }
  514. return Index;
  515. }
  516. void CRealTime::Redraw(HWND hWnd)
  517. {
  518. RECT rt;
  519. rt.left   = GL;
  520. rt.top    = GT - 1;
  521. rt.right  = GR;
  522. rt.bottom = m_Rect.bottom - 1;
  523. ::InvalidateRect(hWnd, &rt, FALSE);
  524. }
  525. void CRealTime::DrawTickLine()
  526. {
  527. POINT pt;
  528. if (m_nEnd < (int)m_TimeToDraw)
  529. {
  530. if (m_nTick == 0) return;
  531. else if (!m_bIsForwardDrawing)
  532. pt.x = GR - 1;
  533. else
  534. pt.x = GL + PX * (m_nTick - 1) / (m_TimeToDraw - 1);
  535. }
  536. else
  537. pt.x = GL + PX * m_nTick / (m_TimeToDraw - 1);
  538. if (pt.x == GL)
  539. pt.x ++;
  540. if (pt.x == GR)
  541. pt.x --;
  542. pt.y = GT + 1;
  543. m_CurPen = ::CreatePen(PS_SOLID, m_wdTickLine, RGB(0, 0, 0));
  544. m_OldPen = (HPEN)::SelectObject(m_hDC, m_CurPen);
  545. ::MoveToEx(m_hDC, pt.x + 1, pt.y, NULL);
  546. pt.y = GB - 1;
  547. ::LineTo(m_hDC, pt.x + 1, pt.y);
  548. ::SelectObject(m_hDC, m_OldPen);
  549. ::DeleteObject(m_CurPen);
  550. m_CurPen = ::CreatePen(PS_SOLID, m_wdTickLine, m_crTickLine);
  551. m_OldPen = (HPEN)::SelectObject(m_hDC, m_CurPen);
  552. ::MoveToEx(m_hDC, pt.x, pt.y, NULL);
  553. pt.y = GT + 1;
  554. ::LineTo(m_hDC, pt.x, pt.y);
  555. ::SelectObject(m_hDC, m_OldPen);
  556. ::DeleteObject(m_CurPen);
  557. }
  558. void CRealTime::SetPrintTime(DWORD time, int flag)
  559. {
  560. if (flag == MaxTime)
  561. m_nMaxTime = time / 1000;
  562. else
  563. m_nCursorTime = time / 1000;
  564. }
  565. void CRealTime::PrintTime()
  566. {
  567. int n = 5;
  568. if (m_bPrinting) n *= m_nPrintScale;
  569. n = m_Rect.bottom - n - 1;
  570. SetStringAlign(LEFT, BOTTOM);
  571. ShowTime(GL, n, "Cursor time", m_nCursorTime);
  572. SetStringAlign(RIGHT, BOTTOM);
  573. ShowTime(GR, n, "Total lapse time", m_nMaxTime);
  574. }
  575. void CRealTime::ShowTime(int x, int y, const char* Tag, DWORD& cTime)
  576. {
  577. if (m_nCyclesPerSec > 0.9999 && m_nCyclesPerSec < 1.0001)
  578. sprintf(m_sTempStr, "%s (%d:%d:%d)", Tag, 
  579. cTime / 3600, (cTime / 60) % 60, cTime % 60);
  580. else
  581. sprintf(m_sTempStr, "%s (%d:%d:%d / %d:%d:%d)", Tag,
  582.     ((DWORD)(m_nCyclesPerSec * cTime)) / 3600, 
  583. (((DWORD)(m_nCyclesPerSec * cTime)) / 60) % 60, 
  584. ((DWORD)(m_nCyclesPerSec * cTime)) % 60, 
  585. cTime / 3600, (cTime / 60) % 60, cTime % 60);
  586. PrintString(x, y, 0, m_sTempStr);
  587. }