DataShow.cpp
上传用户:shdibao
上传日期:2022-07-20
资源大小:3385k
文件大小:42k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // DataShow.cpp : implementation file
  2. //
  3. /************************************************************************/
  4. /* 数据显示类:
  5.    作者:南京航空航天大学能源与动力学院 庄三少
  6.                                    2009年1月11日  
  7.    Email:viualsan@yahoo.cn
  8.      tel:13512524413 
  9.  友情发布:http://www.codefans.net
  10.    说明:
  11.       本类无任何限制,可自由改动传播。只需附上该段说明。                                                                  */
  12. /************************************************************************/
  13. #include "stdafx.h"
  14. #include "DataShow.h"
  15. #include <math.h>
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CDataShow
  23. CDataShow::CDataShow()
  24. {
  25. m_IsTimeShow=true;
  26. m_time_color=RGB(255,0,255);
  27. m_IsNoteOn=true;
  28. m_sNote_text="南京航空航天大学创建于 1952 年 10 月,座落于六朝古都南京。目前有两校区.";
  29. m_IsEnlargeClose=false;
  30. m_IsSelect_enlarge=false;
  31. m_IsEnlarge=false;
  32. m_IsMove=false;
  33.     m_captureNum=0;
  34. m_IsCaptureSaveBMP=3;
  35. m_IsCaptureSaveBMP=false;
  36. m_numofData=0;
  37. m_numOfBMP=0;
  38. m_lineStyle=0;
  39. m_lineWide=0;
  40. m_color_note=RGB(0,200,180);
  41. title_color=RGB(0,250,230);
  42. text_color=RGB(255,255,255);
  43. m_cross_color=RGB(0,255,255);
  44. m_selectRect_color=RGB(250,0,0);
  45. m_pMousePoint.x=0;
  46. m_pMousePoint.y=0;
  47. m_dNumOfData=0;
  48. m_selectRect_color=RGB(122,30,200);
  49. //初始化主框画笔
  50. m_pdc_framRect.new_brush.CreateSolidBrush(RGB(0,100,100));
  51. m_pdc_framRect.new_pen.CreatePen(0,0,RGB(255,255,0));
  52. //初始化数据框画笔
  53. m_pdc_data.new_brush.CreateSolidBrush(RGB(0,100,100));
  54. m_pdc_data.new_pen.CreatePen(0,0,RGB(255,255,0));
  55. m_datacolor=RGB(255,255,0);
  56. //参数化数据框画笔
  57. m_pdc_childRect.new_brush.CreateSolidBrush(RGB(0,0,0));
  58. m_pdc_childRect.new_pen.CreatePen(0,0,RGB(255,255,0));
  59. m_pdc_childRect.c=RGB(0,0,0);
  60. //参数化轴画笔
  61. m_pdc_axis.new_brush.CreateSolidBrush(RGB(0,100,100));
  62. m_pdc_axis.new_pen.CreatePen(0,0,RGB(255,255,0));
  63. //初始化网格画笔
  64. m_pdc_grid.new_pen.CreatePen(2,0,RGB(0,255,255));
  65. m_High=500;
  66. m_Low=0;
  67. m_Top=500;
  68. m_Bottom=0;
  69. ///////////////////
  70. double dx=m_High/200.0;
  71. for (int i=0;i<200;i++)
  72. {
  73. m_Data_x[i]=dx*i;
  74. m_Data_y[i]=sin(m_Data_x[i]/30)*150;
  75. m_dNumOfData++;
  76. }
  77. m_start_POINT.x=m_Data_x[0];
  78. m_start_POINT.y=m_Data_y[0];
  79. m_end_point.x=m_Data_x[m_dNumOfData-1];
  80. m_end_point.y=m_Data_y[m_dNumOfData-1];
  81. m_IsCrossMove=true;
  82. m_sTitle_str="visualsan@yahoo.cn  TEL:13512524413 南京航空航天大学——庄三少";
  83. m_sAxis_xstr="时间轴";
  84. m_sAxis_ystr="数据轴";
  85. m_dNum=(m_High - m_Low)/10;
  86. m_dnum_top_bottom=(m_Top - m_Bottom)/10;
  87. m_bIsGridOn=false;
  88. m_GridControl=5;
  89. m_x_start=-100;
  90. m_y_start=-100;
  91. m_x_end=500;
  92. m_y_end=500;
  93. m_xFactor=(m_x_end-m_x_start)/double(m_High-m_Low);
  94. m_yFactor=(m_y_end-m_y_start)/double(m_Top-m_Bottom);
  95. m_pdc_data.c=m_pdc_childRect.c;
  96. m_pdc_data.new_brush.DeleteObject();
  97. m_pdc_data.new_brush.CreateSolidBrush(RGB(0,0,0));
  98. for (int i=0;i<20;i++)
  99. {
  100. m_Text[i]="love";
  101. }
  102. }
  103. CDataShow::~CDataShow()
  104. {
  105. }
  106. BEGIN_MESSAGE_MAP(CDataShow, CStatic)
  107. //{{AFX_MSG_MAP(CDataShow)
  108. ON_WM_TIMER()
  109. ON_WM_MOUSEMOVE()
  110. ON_WM_PAINT()
  111. ON_WM_CREATE()
  112. ON_WM_ERASEBKGND()
  113. ON_WM_LBUTTONDOWN()
  114. ON_WM_LBUTTONUP()
  115. ON_WM_RBUTTONDOWN()
  116. ON_WM_RBUTTONUP()
  117. ON_WM_MBUTTONDOWN()
  118. ON_WM_MBUTTONUP()
  119. ON_WM_LBUTTONDBLCLK()
  120. ON_WM_RBUTTONDBLCLK()
  121. ON_COMMAND(IDC_SAVE_BMP, OnSaveBmp)
  122. ON_COMMAND(IDC_SAVE_DATA, OnSaveData)
  123.     ON_COMMAND(IDC_SET_DATA_COLOR,OnSetDataColor)
  124. ON_COMMAND(IDC_SET_AXIS_COLOR,OnSetAxisColor)
  125. ON_COMMAND(IDC_SET_XYLEBAL_COLOR,OnSetXYlebalColor)
  126. ON_COMMAND(IDC_SET_GRID_COLOR,OnSetGridColor)
  127. ON_COMMAND(IDC_SET_BK_COLOR,OnSetBKColor)
  128. ON_COMMAND(IDC_SET_TITLE_COLOR,OnSetTitleColor)
  129. ON_COMMAND(IDC_SET_CROSSLINE_COLOR,OnSetCrossLineColor)
  130. ON_COMMAND(IDC_SET_FACE_COLOR,OnSetFaceColor)
  131. ON_COMMAND(IDC_DATA_INPUT,OnSetDataInput)
  132. ON_COMMAND(IDC_SET_GRID_ON_OFF,OnSetGridOnOff)
  133. ON_COMMAND(IDC_SET_NOTE_ON_OFF,OnSetNoteOnOff)
  134.     ON_COMMAND(IDC_SET_NOTE_COLOR,OnSetNoteColor)
  135. ON_COMMAND(IDB_SET_TIME_SHOW,OnSetTimeShow)
  136.     ON_COMMAND(IDB_SET_TIME_TEXT_COLOR,OnSetTimeColor)
  137. //}}AFX_MSG_MAP
  138. END_MESSAGE_MAP()
  139. /////////////////////////////////////////////////////////////////////////////
  140. // CDataShow message handlers
  141. void CDataShow::OnTimer(UINT nIDEvent) 
  142. {
  143. // TODO: Add your message handler code here and/or call default
  144. if (nIDEvent==0)
  145. {
  146. Invalidate();
  147. }
  148. if (nIDEvent==1)
  149. {
  150. SaveBmpWithTheOfTime();
  151. if (m_numOfBMP>1000)
  152. {
  153. m_numOfBMP=0;
  154. }
  155. }
  156. if (nIDEvent==2)
  157. {
  158. SaveDateAuto();
  159. if (m_numofData>1000)
  160. {
  161. m_numofData=0;
  162. }
  163. }
  164. /*if ((m_IsCaptureSaveBMP)&&m_captureNum<=m_max_CapturePictre
  165. )
  166. {
  167. CTime st=GetCurrentTime();
  168. CString filename,str;
  169. str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
  170. filename.Format("Num%d",m_numOfBMP++);
  171. filename=filename+",Time "+str+".bmp";
  172. CaptureSaveBMP(filename);
  173. m_captureNum++;
  174. }*/
  175. CStatic::OnTimer(nIDEvent);
  176. }
  177. void CDataShow::OnSetDataColor()
  178. {
  179. SetColor("data");
  180. }
  181. void CDataShow::OnSetTimeColor()
  182. {
  183. SetColor("time");
  184. }
  185. void CDataShow::OnMouseMove(UINT nFlags, CPoint point) 
  186. {
  187. // TODO: Add your message handler code here and/or call default
  188. if(m_IsSelect_enlarge&&!m_IsEnlargeClose)
  189. {
  190. if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围
  191. {
  192. m_Select_Enlarge_p2=point;
  193. }
  194. }
  195. SetTimer(0,10,NULL);
  196. SetDataRect();
  197. Move(point);
  198. Enlarge(point);
  199. if (m_dataRect.left<point.x&&point.x<m_dataRect.right
  200. &&point.y>m_dataRect.top&&point.y<m_dataRect.bottom)
  201. {
  202. if (m_IsCrossMove)
  203. {
  204. if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
  205. {
  206. SetNearMousePoint();
  207. }
  208. else{
  209. m_pMousePoint.x=point.x;
  210. m_pMousePoint.y=point.y;
  211. }
  212. }
  213. }
  214. Move(point);
  215. CStatic::OnMouseMove(nFlags, point);
  216. }
  217. void CDataShow::OnPaint() 
  218. {
  219. CPaintDC dc(this); // device context for painting
  220. m_High=(m_dataRect.right-m_dataRect.left);
  221. m_Low=0;
  222. m_Top=(-m_dataRect.top+m_dataRect.bottom-2*h);
  223. m_Bottom=0;
  224. m_dNum=(m_High - m_Low)/10;
  225. m_dnum_top_bottom=(m_Top - m_Bottom)/10;
  226. //CDC *pDC;
  227. //pDC=GetDC();
  228. GetClientRect(m_frameRect);
  229. CBitmap bitmap;
  230. bitmap.CreateCompatibleBitmap(&dc, m_frameRect.Width(), m_frameRect.Height());//生成空间的内存位图
  231. CDC me;
  232. me.CreateCompatibleDC(NULL);//生成内存cd
  233. me.SelectObject(&bitmap);
  234. me.SetBkMode(TRANSPARENT);//设置透明字体
  235. me.SetTextColor(RGB(255,0,0));
  236. ////////////////////////添加绘图函数
  237. // EnlargeSelectLarge();
  238. SetAxisChange();
  239. Draw_frameRect(&me);
  240. Draw_childRect(&me);
  241. Draw_SelectArea(&me);
  242. Draw_MousePoint(&me);
  243. Draw_Title(&me);
  244. Draw_Axis(&me);
  245. Draw_Axis_xyLebal(&me);
  246. Draw_Data(&me);
  247. Draw_CrossLine(&me);
  248. Draw_Grid(&me);
  249. Draw_SelectRect(&me);
  250. Draw_NoteWord(&me);
  251. // TextControl(&me);
  252.     
  253. ///////////////////////////////////////////////////////////////////////////
  254. me.SetROP2(R2_WHITE);
  255. dc.BitBlt(0, 0, m_frameRect.Width(), m_frameRect.Height(), &me, 0, 0, SRCCOPY);//拷备
  256. bitmap.DeleteObject();
  257. me.DeleteDC();
  258. // pDC->DeleteDC();
  259. // Do not call CStatic::OnPaint() for painting messages
  260. }
  261. int CDataShow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  262. {
  263. if (CStatic::OnCreate(lpCreateStruct) == -1)
  264. return -1;
  265. // TODO: Add your specialized creation code here
  266. GetClientRect(m_frameRect);
  267. return 0;
  268. }
  269. BOOL CDataShow::OnEraseBkgnd(CDC* pDC) 
  270. {
  271. // TODO: Add your message handler code here and/or call default
  272. return FALSE;
  273. }
  274. void CDataShow::Draw_frameRect(CDC *dc)
  275. {
  276. GetClientRect(m_frameRect);
  277. dc->FillRect(m_frameRect,&m_pdc_framRect.new_brush);
  278. }
  279. //DEL void pdc::SetOldObject()
  280. //DEL {
  281. //DEL  pDC->SelectObject(old_brush);
  282. //DEL  pDC->SelectObject(old_pen);
  283. //DEL 
  284. //DEL }
  285. //DEL void pdc::SetNewObject()
  286. //DEL {
  287. //DEL  old_pen=pDC->SelectObject(&new_pen);
  288. //DEL  old_brush=pDC->SelectObject(&new_brush);
  289. //DEL 
  290. //DEL }
  291. //DEL pdc::~pdc()
  292. //DEL {
  293. //DEL  SetOldObject();
  294. //DEL }
  295. //DEL pdc::pdc()
  296. //DEL {
  297. //DEL 
  298. //DEL 
  299. //DEL }
  300. void CDataShow::Draw_childRect(CDC *dc)
  301. {
  302. GetClientRect(m_frameRect);
  303. SetDataRect();
  304. // SetChildRectColor(RGB(0,0,0));
  305. dc->FillRect(m_dataRect,&m_pdc_childRect.new_brush);
  306. }
  307. void CDataShow::SetDataRect()
  308. {
  309. w=m_frameRect.Width()/10.0;
  310. h=m_frameRect.Height()/10.0;
  311. if (w>20)
  312. {
  313. w=20;
  314. }
  315. if (h>10)
  316. {
  317. h=10;
  318. }
  319. if (w<10)
  320. {
  321. w=10;
  322. }
  323. if (h<5)
  324. {
  325. h=5;
  326. }
  327. m_dataRect.left=m_frameRect.left+w*3;
  328. m_dataRect.right=m_frameRect.right-w;
  329. m_dataRect.top=m_frameRect.top+h;
  330. m_dataRect.bottom=m_frameRect.bottom-h;
  331. }
  332. void CDataShow::SetFrameColor(COLORREF C)
  333. {
  334. m_pdc_framRect.new_brush.DeleteObject();
  335. m_pdc_framRect.new_brush.CreateSolidBrush(C);
  336. }
  337. void CDataShow::SetChildRectColor(COLORREF C)
  338. {
  339. m_pdc_childRect.new_brush.DeleteObject();
  340. m_pdc_childRect.new_brush.CreateSolidBrush(C);
  341. m_pdc_childRect.c=C;
  342. m_pdc_data.new_brush.DeleteObject();
  343. m_pdc_data.new_brush.CreateSolidBrush(C);
  344. }
  345. void CDataShow::Draw_MousePoint(CDC *pdc)
  346. {
  347. CString str;
  348. str.Format("x=%.1f",double((m_pMousePoint.x-m_pOrth.x)*m_xFactor+m_x_start));
  349. pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-30,str);
  350. str.Format("y=%.1f",double((-m_pMousePoint.y+m_pOrth.y)*m_yFactor+m_y_start));
  351. pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-50,str);
  352. if (m_IsTimeShow)
  353. {
  354. pdc->SetTextColor(m_time_color);
  355. pdc->TextOut(m_dataRect.right-120,m_pOrth.y-30,GetTimeFormat());
  356. }
  357. }
  358. void CDataShow::Draw_Title(CDC *pdc)
  359. {
  360. CPen p;
  361. p.CreatePen(0,0,title_color);
  362. SetTitlePosition();
  363. pdc->SetTextColor(title_color);
  364. pdc->TextOut(m_pTextPosition.x,m_pTextPosition.y,m_sTitle_str);
  365. p.DeleteObject();
  366. }
  367. void CDataShow::SetTitlePosition()
  368. {
  369. SetDataRect();
  370. /* CPaintDC dc(this);
  371. TEXTMETRIC tm;
  372. dc.GetTextMetrics(&tm);
  373.     int text_height_ ,text_width_,l;
  374. l=m_sTitle_str.GetLength();
  375. text_height_ = tm.tmHeight + tm.tmExternalLeading; // Height of font
  376.     text_width_ = tm.tmMaxCharWidth; // width of widest char in font
  377. if (l<100)
  378. {
  379.         for (int i=0;i<=l*text_width_/m_dataRect.Width();i++)
  380.         {*/
  381. m_pTextPosition.x=(m_dataRect.left+m_dataRect.right)/2-4*m_sTitle_str.GetLength();//((text_width_*m_sTitle_str.GetLength())/(l*text_width_/m_dataRect.Width()+1))/2*text_width_;
  382. m_pTextPosition.y=m_dataRect.top+h;//+text_height_*i;
  383. /* }
  384. }
  385. else
  386. {
  387. }*/
  388. }
  389. void  CDataShow::Draw_Axis(CDC*pDC)
  390. {
  391. pDC->SetTextColor(text_color);
  392. pDC->SelectObject(&m_pdc_axis.new_pen);
  393. CRect rect;
  394. SetDataRect();
  395. rect=m_dataRect;
  396. CString str;
  397. int i;
  398. int m_left,m_top,m_right,m_bottom;
  399.     int m_Interval = (m_High - m_Low)/10;
  400. m_dNum=m_Interval;
  401. if (m_Interval < 1)  m_Interval = 1;
  402.     m_left = rect.left+20;
  403. m_top = rect.top+10;
  404. m_right = rect.right-10;
  405. m_bottom = rect.bottom-40;
  406. int m_IntervalPan = (m_right - m_left)/10;
  407. if (m_IntervalPan < 1 ) m_IntervalPan =1;
  408. // 选中当前红色画笔,并保存以前的画笔
  409. // CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
  410. // 绘制坐标轴
  411. pDC->MoveTo(m_left,m_top);
  412. // 垂直轴
  413. pDC->LineTo(m_left,m_bottom);
  414. // 水平轴
  415. pDC->LineTo(m_right,m_bottom);
  416. m_pOrth.x=m_left;
  417. m_pOrth.y=m_bottom;
  418. // 写X轴刻度值
  419. for(i=0;i<10;i++)
  420. {
  421. //str.Format(_T("%d"),m_Min+i*m_Interval);
  422. str.Format(_T("%.1f"),GetAxisPosition(i,"x"));
  423. pDC->TextOut(m_left+double(i*m_IntervalPan),m_bottom+3,str);
  424. }
  425. //str.Format(_T("%d"),m_Max);
  426. str.Format(_T("%.1f"),m_x_end);
  427. pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);
  428. //////////////////////////////////////////////////////////////////
  429. m_Interval = (m_High - m_Low)/10;
  430. // 绘制X轴刻度
  431. for (i = 0; i < 20; i ++)
  432. {
  433. if ((i%2) == 0)
  434. {
  435. // 10的倍数
  436. pDC->MoveTo(i*m_Interval/2 + m_pOrth.x, m_bottom);
  437. pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+8);
  438. }
  439. else
  440. {
  441. // 10的倍数
  442. pDC->MoveTo(i*m_Interval/2 +m_pOrth.x, m_bottom);
  443. pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+3);
  444. }
  445. }
  446. // 绘制Y轴箭头
  447. pDC->MoveTo(m_right-5,m_bottom-5);
  448. pDC->LineTo(m_right,m_bottom);
  449. pDC->LineTo(m_right-5,m_bottom+5);
  450. // 绘制X轴箭头
  451. pDC->MoveTo(m_left-5,m_top+5);
  452. pDC->LineTo(m_left,m_top);
  453. pDC->LineTo(m_left+5,m_top+5);
  454. // 绘制Y轴网格 选择绿色画笔
  455.    // pDC->SelectObject(pPenGreen);
  456.     //
  457. //////////////////////////////////////////////////////////////////
  458.     //数组赋值
  459. m_Interval=(-m_Bottom+m_Top)/10;
  460. m_dnum_top_bottom=m_Interval;
  461. CFont* pFont = pDC->GetCurrentFont();
  462. LOGFONT logFont ;
  463. pFont->GetLogFont(&logFont);
  464. logFont.lfEscapement = 900 ;//900/10 = 90
  465. HFONT   hFont=CreateFontIndirect(&logFont);   
  466. pDC->SelectObject(hFont);
  467. // 写y轴刻度值
  468. for(i=0;i<10;i++)
  469. {
  470. //str.Format(_T("%d"),m_Min+i*m_Interval);
  471. str.Format(_T("%.1f"),GetAxisPosition(i,"y"));
  472. pDC->TextOut(m_pOrth.x-20,m_bottom-(i)*m_Interval+10,str);
  473. }
  474.     
  475. // 绘制y轴刻度
  476. for (i=0;i<20;i++)
  477. {
  478. if (i%2 == 0)
  479. {
  480. // 10的倍数
  481. pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2);
  482. pDC->LineTo(m_pOrth.x-8, m_Bottom+i*m_Interval/2);
  483. }
  484. else
  485. {
  486. pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2);
  487. pDC->LineTo(m_pOrth.x-5, m_Bottom+i*m_Interval/2);
  488. }
  489. }
  490. DeleteObject(hFont);
  491. pDC->SelectObject(pFont);
  492. pFont->DeleteObject();
  493. }
  494. void CDataShow::SetAxisColor(COLORREF C)
  495. {
  496. m_pdc_axis.new_pen.DeleteObject();
  497. m_pdc_axis.new_pen.CreatePen(0,0,C);
  498. }
  499. void CDataShow::SetXYLebalColor(COLORREF C)
  500. {
  501. m_axis_xyLebal.new_pen.DeleteObject();
  502. m_axis_xyLebal.new_pen.CreatePen(0,0,C);
  503. }
  504. void CDataShow::Draw_Axis_xyLebal(CDC *pdc)
  505. {
  506. SetDataRect();
  507. CFont* pFont = pdc->GetCurrentFont();
  508. LOGFONT logFont ;
  509. pFont->GetLogFont(&logFont);
  510. logFont.lfEscapement = 900 ;//900/10 = 90
  511. HFONT   hFont=CreateFontIndirect(&logFont);   
  512. ///////////////x轴文字输出
  513. pdc->TextOut((m_dataRect.left+m_dataRect.right)/2-4*m_sAxis_xstr.GetLength(),m_pOrth.y+h+20,m_sAxis_xstr);
  514. ////////////////////y轴文字输出
  515. pdc->SelectObject(hFont);
  516.     pdc->TextOut(m_pOrth.x+5,(m_dataRect.bottom+m_dataRect.top)/2.5+4*m_sAxis_ystr.GetLength(),m_sAxis_ystr);
  517. DeleteObject(hFont);
  518. pdc->SelectObject(pFont);
  519. pFont->DeleteObject();
  520. // delete hFont;
  521. }
  522. void CDataShow::Draw_Data(CDC *pDC)
  523. {
  524. int a,b;
  525. pDC->SelectObject(&m_pdc_data.new_pen);
  526. pDC->SetTextColor(m_datacolor);
  527. pDC->SelectObject(&m_pdc_data.new_brush);
  528. if (m_lineStyle>=4)
  529. {
  530. m_pdc_data.new_pen.DeleteObject();
  531. m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor);
  532. pDC->SelectObject(&m_pdc_data.new_pen);
  533. }
  534. bool bs=true;
  535. int m_i=0;
  536. while ((m_i<m_dNumOfData)) 
  537. {
  538. if (!IsDataOut(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]))
  539. {
  540. pDC->MoveTo(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]);
  541. break;
  542. }
  543. m_i++;
  544. }
  545. // pDC->MoveTo(m_pOrth.x+m_Data_x[0],m_pOrth.y-m_Data_y[0]);
  546. for (int i=m_i;i<m_dNumOfData;i++)
  547. {
  548. if(!IsDataOut(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]))
  549. {
  550. switch (m_lineStyle)
  551. {
  552.     case 0:
  553.      pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
  554.       break;
  555. case 1:
  556. pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,m_pOrth.y-m_Data_y[i]-1,"*");
  557.      break;
  558.     
  559. case 2:
  560. pDC->Ellipse(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
  561. ,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);
  562. //pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,
  563. // m_pOrth.y-m_Data_y[i]-1,"0");
  564.     break;
  565. case 3:
  566. pDC->Rectangle(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
  567. ,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);
  568. break;
  569. case 4:
  570. case 5:
  571. case 6:
  572. pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
  573. break;
  574. }
  575. //
  576.     
  577.     
  578. }
  579. //
  580. }
  581. }
  582. bool CDataShow::IsDataOut(double x,double y)
  583. {
  584. if (x>m_dataRect.right||x<m_dataRect.left||y<m_dataRect.top||y>m_dataRect.bottom)
  585. {
  586. return true;
  587. }
  588. return false;
  589. }
  590. void CDataShow::Draw_CrossLine(CDC *pDC)
  591. {
  592. CPen p;
  593. p.CreatePen(0,0,m_cross_color);
  594. pDC->SelectObject(&p);
  595. int x,y;
  596. x=m_pMousePoint.x;
  597. y=m_pMousePoint.y;
  598. CPoint w_s,w_e,h_s,h_e;
  599. w_s.x=m_pOrth.x;
  600. w_s.y=y;
  601. w_e.x=m_dataRect.right-w;
  602. w_e.y=y;
  603. h_s.x=x;
  604. h_s.y=m_pOrth.y;
  605. h_e.x=x;
  606. h_e.y=m_dataRect.top+h;
  607. pDC->MoveTo(w_s);
  608. pDC->LineTo(w_e);
  609. pDC->MoveTo(h_s);
  610. pDC->LineTo(h_e);
  611. p.DeleteObject();
  612. }
  613. double CDataShow::GetDistance(CPoint p, double x, double y)
  614. {
  615. return sqrtl((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
  616. }
  617. int CDataShow::GetNearPoint()
  618. {
  619. for (int i=0;i<m_dNumOfData;i++)
  620. {
  621. double x,y;
  622. x=m_Data_x[i];
  623. y=m_Data_y[i];
  624. // x=(x-m_x_start)/m_xFactor;
  625. // y=(y-m_y_start)/m_yFactor;
  626. if (abs(GetDistance(m_pMousePoint,double(x+m_pOrth.x),double(-y+m_pOrth.y)))<5)
  627. {
  628. return i;
  629. }
  630. }
  631. return -1;
  632. }
  633. void CDataShow::SetNearMousePoint()
  634. {
  635. if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
  636. {
  637. m_pMousePoint.x=double(m_Data_x[GetNearPoint()])+m_pOrth.x;
  638. m_pMousePoint.y=double(m_Data_y[GetNearPoint()])+m_pOrth.y;
  639. }
  640. CString s;
  641. s.Format("%d",GetNearPoint());
  642. //GetDC()->TextOut(0,0,s);
  643. }
  644. void CDataShow::OnLButtonDown(UINT nFlags, CPoint point) 
  645. {
  646. // TODO: Add your message handler code here and/or call default
  647. if (m_IsSelect_enlarge==false)
  648. {
  649.     m_pMousePoint=point;
  650. m_IsCrossMove=true;
  651.         
  652. }
  653. if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围
  654. {
  655. m_Select_Enlarge_p1=point;
  656. }
  657. m_IsEnlargeClose=false;
  658. CStatic::OnLButtonDown(nFlags, point);
  659. }
  660. void CDataShow::OnLButtonUp(UINT nFlags, CPoint point) 
  661. {
  662. // TODO: Add your message handler code here and/or call default
  663. if (m_IsSelect_enlarge==false)
  664. {
  665. m_IsCrossMove=false;
  666. }
  667. m_IsEnlargeClose=true;
  668. CStatic::OnLButtonUp(nFlags, point);
  669. }
  670. void CDataShow::SetText(CString str, CString name)
  671. {
  672. if (name=="x")
  673. {
  674. m_sAxis_xstr=str;
  675. }
  676. else
  677. if (name=="y")
  678. {
  679. m_sAxis_ystr=str;
  680. }
  681. else
  682. {
  683. m_sTitle_str=str;
  684. }
  685. }
  686. bool CDataShow::SaveBmp()
  687. {
  688. //定义图形大小
  689. CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  690. "bmp文件(*.bmp)|*.bmp|",
  691. NULL);
  692. char title[]= {"保存数据文件"};
  693. dlg.m_ofn.lpstrTitle= title;
  694. if (dlg.DoModal()!= IDOK) return false;
  695. CString filename = dlg.GetFileName() + ".bmp";
  696. int iWidth = m_frameRect.Width();
  697. int iHeight = m_frameRect.Height();
  698.     int iPixel  = 16;
  699. //图形格式参数
  700.     LPBITMAPINFO lpbmih = new BITMAPINFO;
  701.     lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  702.     lpbmih->bmiHeader.biWidth = iWidth;
  703.     lpbmih->bmiHeader.biHeight = iHeight;
  704.     lpbmih->bmiHeader.biPlanes = 1;
  705.     lpbmih->bmiHeader.biBitCount = iPixel;
  706.     lpbmih->bmiHeader.biCompression = BI_RGB;
  707.     lpbmih->bmiHeader.biSizeImage = 0;
  708.     lpbmih->bmiHeader.biXPelsPerMeter = 0;
  709.     lpbmih->bmiHeader.biYPelsPerMeter = 0;
  710.     lpbmih->bmiHeader.biClrUsed = 0;
  711.     lpbmih->bmiHeader.biClrImportant = 0;
  712.     //创建位图数据
  713.     HDC hdc,hdcMem;
  714.     HBITMAP hBitMap = NULL;
  715.     CBitmap *pBitMap = NULL;
  716.     CDC *pMemDC =NULL;
  717.     BYTE *pBits;
  718.     hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
  719.     hdcMem = CreateCompatibleDC(hdc);
  720.     hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
  721.     pBitMap = new CBitmap;
  722.     pBitMap->Attach(hBitMap);
  723.     //pMemDC = new CDC;
  724. pMemDC=new CDC;
  725.     pMemDC->Attach(hdcMem);
  726.     pMemDC->SelectObject(pBitMap);
  727. //
  728. CRect rc(0,0,iWidth,iHeight);
  729.     //添加自绘图形 
  730. pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
  731. pMemDC->SetTextColor(RGB(255,0,0));
  732. Draw_frameRect(pMemDC);
  733. Draw_childRect(pMemDC);
  734. Draw_SelectArea(pMemDC);
  735. Draw_MousePoint(pMemDC);
  736. Draw_Title(pMemDC);
  737. Draw_Axis(pMemDC);
  738. Draw_Axis_xyLebal(pMemDC);
  739. Draw_Data(pMemDC);
  740. Draw_CrossLine(pMemDC);
  741. Draw_SelectRect(pMemDC);
  742.     Draw_Grid(pMemDC);
  743. Draw_NoteWord(pMemDC);
  744.     //保存到文件并创建位图结构
  745.     BITMAPFILEHEADER bmfh;
  746.     ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
  747.     *((char *)&bmfh.bfType) = 'B';
  748.     *(((char *)&bmfh.bfType) + 1) = 'M';
  749.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  750.     bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
  751.     TCHAR szBMPFileName[128];
  752.     int iBMPBytes = iWidth * iHeight * iPixel / 8;
  753.     strcpy(szBMPFileName,filename);
  754.     CFile file;
  755.     if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
  756.     {
  757.         file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
  758.         file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
  759.         file.Write(pBits,iBMPBytes);
  760.         file.Close();
  761.     }
  762.     pMemDC->DeleteDC();
  763.     delete pMemDC; pMemDC  = NULL;
  764.     delete pBitMap; pBitMap = NULL;
  765.     delete lpbmih;  lpbmih  = NULL;
  766. return true;
  767. }
  768. void CDataShow::LoadData()
  769. {
  770. CFileDialog dlg(true,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  771. "data文件(*.data)|*.data|",
  772. NULL);
  773. char title[]= {"打开数据文件"};
  774. dlg.m_ofn.lpstrTitle= title;
  775. if (dlg.DoModal()!= IDOK) return;
  776. CString filename = dlg.GetFileName() ;
  777. FILE *f;
  778. f=fopen(filename,"r");
  779. if (f==NULL)
  780. {
  781. AfxMessageBox("打开文件错误");
  782. return;
  783. }
  784. fscanf(f,"%d",&m_dNumOfData);
  785. for (int i=0;i<m_dNumOfData;i++)
  786. {
  787. fscanf(f,"%f",&m_Data_x[i]);
  788. fscanf(f,"%f",&m_Data_y[i]);
  789. }
  790.     fclose(f);
  791. m_start_POINT.x=m_Data_x[0];
  792. m_start_POINT.y=m_Data_y[0];
  793. m_end_point.x=m_Data_x[m_dNumOfData-1];
  794. m_end_point.y=m_Data_y[m_dNumOfData-1];
  795. DataChange("in");
  796. }
  797. void CDataShow::SaveData()
  798. {
  799. DataChange("out");
  800. KillTimer(0);
  801. FILE *f;
  802. CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  803. "data文件(*.data)|*.data|",
  804. NULL);
  805. char title[]= {"保存数据文件"};
  806. dlg.m_ofn.lpstrTitle= title;
  807. if (dlg.DoModal()!= IDOK)
  808. {
  809. DataChange("in");
  810. return;
  811. }
  812. CString filename = dlg.GetFileName() + ".data";
  813. f=fopen(filename,"w");
  814. fprintf(f,"%dn",m_dNumOfData);
  815. for(int i=0;i<m_dNumOfData;i++)
  816. {
  817. fprintf(f,"%f  %fn",m_Data_x[i],m_Data_y[i]);
  818. }
  819. fclose(f);
  820. DataChange("in");
  821. SetTimer(0,100,NULL);
  822. }
  823. void CDataShow::Grid(CString IsOn)
  824. {
  825. if (IsOn=="on"||IsOn=="oN"||IsOn=="On")
  826. {
  827. m_bIsGridOn=true;
  828. }
  829. else
  830. {
  831. m_bIsGridOn=false;
  832. }
  833. }
  834. void CDataShow::Draw_Grid(CDC *pDC)
  835. {
  836. if (m_bIsGridOn)
  837. {
  838. pDC->SelectObject(m_pdc_grid.new_pen);
  839.         double x,y;
  840. for (int i=1;i<=m_dNum;i++)
  841. {
  842. if((i%m_GridControl)==0)
  843. {
  844. x=i*10+m_pOrth.x;
  845.       y=m_pOrth.y;
  846.      pDC->MoveTo(x,y);
  847.      x=i*10+m_pOrth.x;
  848.      y=m_dataRect.top+h;
  849.      pDC->LineTo(x,y);
  850. }
  851. }
  852. for (int i=1;i<=m_dnum_top_bottom;i++)
  853. {
  854. if((i%m_GridControl)==0)
  855. {
  856. x=m_pOrth.x;
  857.      y=m_pOrth.y-i*10;
  858.      pDC->MoveTo(x,y);
  859.      x=m_dataRect.right-w;
  860.      pDC->LineTo(x,y);
  861. }
  862. }
  863. }
  864. }
  865. void CDataShow::SetGridDensity(int density)
  866. {
  867. if (density>0)
  868. m_GridControl=density;
  869. }
  870. void CDataShow::SetGridColor(COLORREF C)
  871. {
  872. m_pdc_grid.new_pen.DeleteObject();
  873. m_pdc_grid.new_pen.CreatePen(2,0,C);
  874. }
  875. void CDataShow::OnSetNoteOnOff()
  876. {
  877. if (m_IsNoteOn)
  878. {
  879. SetNoteWordOn(true);
  880. m_IsNoteOn=false;
  881. }
  882. else
  883. {
  884.    SetNoteWordOn(false);
  885.    m_IsNoteOn=true;
  886.   }
  887. }
  888. void CDataShow::OnSetTimeShow()
  889. {
  890. if (m_IsTimeShow)
  891. {
  892. SetTimeShow(true);
  893. m_IsTimeShow=false;
  894. }
  895. else
  896. {
  897. SetTimeShow(false);
  898. m_IsTimeShow=true;
  899. }
  900. }
  901. void CDataShow::SetDataColor(COLORREF C)
  902. {
  903. m_pdc_data.new_pen.DeleteObject();
  904. m_pdc_data.new_pen.CreatePen(0,m_lineWide,C);
  905. m_pdc_data.c=C;
  906. m_pdc_data.new_brush.DeleteObject();
  907. m_pdc_data.new_brush.CreateSolidBrush(m_pdc_childRect.c);
  908. m_datacolor=C;
  909. }
  910. void CDataShow::SetTextColor(COLORREF C)
  911. {
  912. text_color=C;
  913. }
  914. void CDataShow::SetCrossColor(COLORREF C)
  915. {
  916. m_cross_color=C;
  917. }
  918. void CDataShow::SetTitleColor(COLORREF C)
  919. {
  920. title_color=C;
  921. }
  922. void CDataShow::SetData(double *x, double *y, int n)
  923. {
  924. if (n<=2000)
  925. {
  926. m_dNumOfData=n;
  927. for (int i=0;i<m_dNumOfData;i++)
  928. {
  929. m_Data_x[i]=x[i];
  930. m_Data_y[i]=y[i];
  931. }
  932. DataChange("in");
  933. }
  934. }
  935. void CDataShow::Init()
  936. {
  937. SetTimer(0,10,NULL);
  938. // Invalidate();
  939. }
  940. void CDataShow::SetAxisChange()
  941. {
  942. m_xFactor=double(m_x_end-m_x_start)/double(m_High-m_Low);
  943. m_yFactor=double(m_y_end-m_y_start)/double(m_Top-m_Bottom);
  944. }
  945. void CDataShow::Draw_SelectRect(CDC *pdc)
  946. {
  947. if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
  948. {
  949. CPen p;
  950. CBrush b;
  951. b.CreateSolidBrush(m_selectRect_color);
  952. p.CreatePen(0,0,m_selectRect_color);
  953. pdc->SelectObject(&p);
  954. pdc->SelectObject(&b);
  955. pdc->Rectangle(m_pMousePoint.x-3,m_pMousePoint.y-3,m_pMousePoint.x+3,m_pMousePoint.y+3);
  956. p.DeleteObject();
  957. b.DeleteObject();
  958. m_IsCaptureSaveBMP=true;
  959. }
  960. else
  961.      m_IsCaptureSaveBMP=false;
  962. }
  963. int CDataShow::SetDrawLineStyle(int style,int lineWide)
  964. {
  965. m_lineStyle=style;
  966. m_lineWide=lineWide;
  967. if ((style<0||style>=7))
  968. {
  969. m_lineStyle=0;
  970. }
  971. if ((lineWide<0||lineWide>20))
  972. {
  973. m_lineWide=0;
  974. }
  975. m_pdc_data.new_pen.DeleteObject();
  976. if (style>=4)
  977. {
  978. m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor);
  979. }
  980. else
  981. m_pdc_data.new_pen.CreatePen(0,m_lineWide,m_datacolor);
  982. return style;
  983. }
  984. void CDataShow::SaveBmp(double second,bool stop)
  985. {
  986. if (stop==true)
  987. {
  988. KillTimer(1);
  989. }
  990. else
  991. {
  992. SetTimer(1,second*1000,NULL);
  993. }
  994. SaveBmpWithTheOfTime();
  995. }
  996. void CDataShow::SaveBmpWithTheOfTime()
  997. {
  998. KillTimer(0);
  999. CTime st=CTime::GetCurrentTime();
  1000. CString filename,str;
  1001. str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
  1002. filename.Format("Num%d",m_numOfBMP++);
  1003. filename=filename+",Time "+str+".bmp";
  1004. int iWidth = m_frameRect.Width();
  1005. int iHeight = m_frameRect.Height();
  1006.     int iPixel  = 16;
  1007. //图形格式参数
  1008.     LPBITMAPINFO lpbmih = new BITMAPINFO;
  1009.     lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  1010.     lpbmih->bmiHeader.biWidth = iWidth;
  1011.     lpbmih->bmiHeader.biHeight = iHeight;
  1012.     lpbmih->bmiHeader.biPlanes = 1;
  1013.     lpbmih->bmiHeader.biBitCount = iPixel;
  1014.     lpbmih->bmiHeader.biCompression = BI_RGB;
  1015.     lpbmih->bmiHeader.biSizeImage = 0;
  1016.     lpbmih->bmiHeader.biXPelsPerMeter = 0;
  1017.     lpbmih->bmiHeader.biYPelsPerMeter = 0;
  1018.     lpbmih->bmiHeader.biClrUsed = 0;
  1019.     lpbmih->bmiHeader.biClrImportant = 0;
  1020.     //创建位图数据
  1021.     HDC hdc,hdcMem;
  1022.     HBITMAP hBitMap = NULL;
  1023.     CBitmap *pBitMap = NULL;
  1024.     CDC *pMemDC =NULL;
  1025.     BYTE *pBits;
  1026.     hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
  1027.     hdcMem = CreateCompatibleDC(hdc);
  1028.     hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
  1029.     pBitMap = new CBitmap;
  1030.     pBitMap->Attach(hBitMap);
  1031.     //pMemDC = new CDC;
  1032. pMemDC=new CDC;
  1033.     pMemDC->Attach(hdcMem);
  1034.     pMemDC->SelectObject(pBitMap);
  1035. //
  1036. CRect rc(0,0,iWidth,iHeight);
  1037.     //添加自绘图形 
  1038. pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
  1039. pMemDC->SetTextColor(RGB(255,0,0));
  1040. Draw_frameRect(pMemDC);
  1041. Draw_childRect(pMemDC);
  1042. Draw_SelectArea(pMemDC);
  1043. Draw_MousePoint(pMemDC);
  1044. Draw_Title(pMemDC);
  1045. Draw_Axis(pMemDC);
  1046. Draw_Axis_xyLebal(pMemDC);
  1047. Draw_Data(pMemDC);
  1048. Draw_CrossLine(pMemDC);
  1049. Draw_SelectRect(pMemDC);
  1050.     Draw_Grid(pMemDC);
  1051. Draw_NoteWord(pMemDC);
  1052.     //保存到文件并创建位图结构
  1053.     BITMAPFILEHEADER bmfh;
  1054.     ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
  1055.     *((char *)&bmfh.bfType) = 'B';
  1056.     *(((char *)&bmfh.bfType) + 1) = 'M';
  1057.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  1058.     bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
  1059.     TCHAR szBMPFileName[128];
  1060.     int iBMPBytes = iWidth * iHeight * iPixel / 8;
  1061.     strcpy(szBMPFileName,filename);
  1062.     CFile file;
  1063.     if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
  1064.     {
  1065.         file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
  1066.         file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
  1067.         file.Write(pBits,iBMPBytes);
  1068.         file.Close();
  1069.     }
  1070.     pMemDC->DeleteDC();
  1071.     delete pMemDC; pMemDC  = NULL;
  1072.     delete pBitMap; pBitMap = NULL;
  1073.     delete lpbmih;  lpbmih  = NULL;
  1074. Sleep(200);
  1075. SetTimer(0,100,NULL);
  1076. }
  1077. void CDataShow::SaveData(double second, bool stop)
  1078. {
  1079. if (stop==true)
  1080. {
  1081. KillTimer(2);
  1082. }
  1083. else
  1084. {
  1085. if (second<=0)
  1086. {
  1087. second=0;
  1088. }
  1089. SetTimer(2,second*1000,NULL);
  1090. }
  1091. }
  1092. void CDataShow::SaveDateAuto()
  1093. {
  1094. KillTimer(0);
  1095. DataChange("out");
  1096. FILE *f;
  1097. CTime st=GetCurrentTime();
  1098. CString filename,str;
  1099. str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
  1100. filename.Format("Num%d",m_numofData++);
  1101. filename=filename+",Time "+str+".data";
  1102. f=fopen(filename,"w");
  1103. if (f==NULL)
  1104. {
  1105. AfxMessageBox("文件保存失败!");
  1106. DataChange("in");
  1107. return;
  1108. }
  1109. fprintf(f,"%dn",m_dNumOfData);
  1110. for(int i=0;i<m_dNumOfData;i++)
  1111. {
  1112. fprintf(f,"%f  %fn",m_Data_x[i],m_Data_y[i]);
  1113. }
  1114. fclose(f);
  1115. DataChange("in");
  1116. Sleep(200);
  1117. SetTimer(0,100,NULL);
  1118. }
  1119. double CDataShow::GetAxisPosition(int n, CString name)
  1120. {
  1121. if (name=="x")
  1122. {
  1123. double dx;
  1124. dx=(m_x_end-m_x_start)/10;
  1125. return m_x_start+dx*n;
  1126. }
  1127. else
  1128. {
  1129. double dy;
  1130. dy=(m_y_end-m_y_start)/10;
  1131. return m_y_start+dy*n;
  1132. }
  1133. }
  1134. void CDataShow::SetAxisRange(double start, double ed, CString name)
  1135. {
  1136. DataChange("out");
  1137. if (name=="x")
  1138. {
  1139. m_x_start=start;
  1140. m_x_end=ed;
  1141. }
  1142. else
  1143. {
  1144. m_y_start=start;
  1145. m_y_end=ed;
  1146. }
  1147. SetAxisChange();
  1148. DataChange("in");
  1149. }
  1150. void CDataShow::DataChange(CString name)
  1151. {
  1152. if (name=="in")//写入除变换因子
  1153. {
  1154. for (int i=0;i<m_dNumOfData;i++)
  1155. {
  1156. m_Data_x[i]=(m_Data_x[i]-m_x_start)/m_xFactor;
  1157. m_Data_y[i]=(m_Data_y[i]-m_y_start)/m_yFactor;
  1158. }
  1159. }
  1160. else//读出时恢复
  1161. {
  1162. for (int i=0;i<m_dNumOfData;i++)
  1163. {
  1164. m_Data_x[i]=(m_Data_x[i])*m_xFactor+m_x_start;
  1165. m_Data_y[i]=(m_Data_y[i])*m_yFactor+m_y_start;
  1166. }
  1167. }
  1168. }
  1169. void CDataShow::CaptureSaveBMP(CString filename)
  1170. {
  1171. int iWidth = m_frameRect.Width();
  1172. int iHeight = m_frameRect.Height();
  1173.     int iPixel  = 16;
  1174. //图形格式参数
  1175.     LPBITMAPINFO lpbmih = new BITMAPINFO;
  1176.     lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  1177.     lpbmih->bmiHeader.biWidth = iWidth;
  1178.     lpbmih->bmiHeader.biHeight = iHeight;
  1179.     lpbmih->bmiHeader.biPlanes = 1;
  1180.     lpbmih->bmiHeader.biBitCount = iPixel;
  1181.     lpbmih->bmiHeader.biCompression = BI_RGB;
  1182.     lpbmih->bmiHeader.biSizeImage = 0;
  1183.     lpbmih->bmiHeader.biXPelsPerMeter = 0;
  1184.     lpbmih->bmiHeader.biYPelsPerMeter = 0;
  1185.     lpbmih->bmiHeader.biClrUsed = 0;
  1186.     lpbmih->bmiHeader.biClrImportant = 0;
  1187.     //创建位图数据
  1188.     HDC hdc,hdcMem;
  1189.     HBITMAP hBitMap = NULL;
  1190.     CBitmap *pBitMap = NULL;
  1191.     CDC *pMemDC =NULL;
  1192.     BYTE *pBits;
  1193.     hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
  1194.     hdcMem = CreateCompatibleDC(hdc);
  1195.     hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
  1196.     pBitMap = new CBitmap;
  1197.     pBitMap->Attach(hBitMap);
  1198.     //pMemDC = new CDC;
  1199. pMemDC=new CDC;
  1200.     pMemDC->Attach(hdcMem);
  1201.     pMemDC->SelectObject(pBitMap);
  1202. //
  1203. CRect rc(0,0,iWidth,iHeight);
  1204.     //添加自绘图形 
  1205. pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
  1206. pMemDC->SetTextColor(RGB(255,0,0));
  1207. Draw_frameRect(pMemDC);
  1208. Draw_childRect(pMemDC);
  1209. Draw_MousePoint(pMemDC);
  1210. Draw_Title(pMemDC);
  1211. Draw_Axis(pMemDC);
  1212. Draw_Axis_xyLebal(pMemDC);
  1213. Draw_Data(pMemDC);
  1214. Draw_CrossLine(pMemDC);
  1215. Draw_SelectRect(pMemDC);
  1216.     Draw_Grid(pMemDC);
  1217.     //保存到文件并创建位图结构
  1218.     BITMAPFILEHEADER bmfh;
  1219.     ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
  1220.     *((char *)&bmfh.bfType) = 'B';
  1221.     *(((char *)&bmfh.bfType) + 1) = 'M';
  1222.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  1223.     bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
  1224.     TCHAR szBMPFileName[128];
  1225.     int iBMPBytes = iWidth * iHeight * iPixel / 8;
  1226.     strcpy(szBMPFileName,filename);
  1227.     CFile file;
  1228.     if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
  1229.     {
  1230.         file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
  1231.         file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
  1232.         file.Write(pBits,iBMPBytes);
  1233.         file.Close();
  1234.     }
  1235.     pMemDC->DeleteDC();
  1236.     delete pMemDC; pMemDC  = NULL;
  1237.     delete pBitMap; pBitMap = NULL;
  1238.     delete lpbmih;  lpbmih  = NULL;
  1239. }
  1240. void CDataShow::SetMaxCapturePicture(int max_p)
  1241. {
  1242. if (max_p<=0)
  1243. {
  1244. m_max_CapturePictre=1;
  1245. }
  1246. else
  1247. m_max_CapturePictre=max_p;
  1248. }
  1249. void CDataShow::Move(CPoint p)
  1250. {
  1251. if (m_IsMove)
  1252. {
  1253. double dx,dy;
  1254. dx=(p.x-m_move_formerpoint.x)*m_xFactor/50;
  1255. dy=(-p.y+m_move_formerpoint.y)*m_yFactor/50;
  1256. SetAxisRange(m_x_start-dx,m_x_end-dx,"x");
  1257. SetAxisRange(m_y_start-dy,m_y_end-dy,"y");
  1258. }
  1259. }
  1260. void CDataShow::OnRButtonDown(UINT nFlags, CPoint point) 
  1261. {
  1262. // TODO: Add your message handler code here and/or call default
  1263. // m_IsSelect_enlarge=FALSE;
  1264. m_move_formerpoint=point;
  1265. m_IsMove=true;
  1266. CStatic::OnRButtonDown(nFlags, point);
  1267. }
  1268. void CDataShow::OnRButtonUp(UINT nFlags, CPoint point) 
  1269. {
  1270. // TODO: Add your message handler code here and/or call default
  1271. m_move_formerpoint=m_pOrth;
  1272. m_IsMove=false;
  1273. CStatic::OnRButtonUp(nFlags, point);
  1274. }
  1275. void CDataShow::OnMButtonDown(UINT nFlags, CPoint point) 
  1276. {
  1277. // TODO: Add your message handler code here and/or call default
  1278. m_enlarge_point=point;
  1279. m_IsEnlarge=true;
  1280. CStatic::OnMButtonDown(nFlags, point);
  1281. }
  1282. void CDataShow::OnMButtonUp(UINT nFlags, CPoint point) 
  1283. {
  1284. // TODO: Add your message handler code here and/or call default
  1285. m_IsEnlarge=false;
  1286. CStatic::OnMButtonUp(nFlags, point);
  1287. }
  1288. void CDataShow::Enlarge(CPoint p)
  1289. {
  1290. if (m_IsEnlarge)
  1291. {
  1292. double dx,dy;
  1293. dx=(p.x-m_enlarge_point.x);
  1294. dy=(-p.y+m_enlarge_point.y);
  1295. if (dx<0)
  1296. {
  1297. SetAxisRange(m_x_start*(1+0.005),m_x_end*(1+0.005),"x");
  1298. }
  1299. else
  1300. SetAxisRange(m_x_start*(1-0.005),m_x_end*(1-0.005),"x");
  1301. if (dy<0)
  1302. {
  1303. SetAxisRange(m_y_start*(1+0.005),m_y_end*(1+0.005),"y");
  1304. }
  1305. else
  1306. SetAxisRange(m_y_start*(1-0.005),m_y_end*(1-0.005),"y");
  1307. }
  1308. }
  1309. void CDataShow::OnLButtonDblClk(UINT nFlags, CPoint point) 
  1310. {
  1311. // TODO: Add your message handler code here and/or call default
  1312. if (m_IsSelect_enlarge==true)
  1313. {
  1314. m_IsSelect_enlarge=false;
  1315. }
  1316. else
  1317. m_IsSelect_enlarge=true;
  1318. m_Select_Enlarge_p1=point;
  1319. m_Select_Enlarge_p2=point;
  1320. CStatic::OnLButtonDblClk(nFlags, point);
  1321. }
  1322. void CDataShow::Draw_SelectArea(CDC *pDC)
  1323. {
  1324. if (m_IsSelect_enlarge)
  1325. {
  1326. CPen P;
  1327. P.CreatePen(0,0,m_selectRect_color);
  1328. CBrush b;
  1329. b.CreateSolidBrush(m_pdc_childRect.c);
  1330.      pDC->SelectObject(&b);
  1331.      pDC->SelectObject(&P);
  1332.      pDC->Rectangle(m_Select_Enlarge_p1.x,m_Select_Enlarge_p1.y,m_Select_Enlarge_p2.x,m_Select_Enlarge_p2.y);
  1333. P.DeleteObject();
  1334. b.DeleteObject();
  1335. // AfxMessageBox("dr_c");
  1336. }
  1337. }
  1338. void CDataShow::SetSelectRectColor(COLORREF C)
  1339. {
  1340. m_selectRect_color=C;
  1341. }
  1342. void CDataShow::EnlargeSelectLarge()
  1343. {
  1344.     if (m_IsSelect_enlarge&&m_IsEnlargeClose)
  1345.     {
  1346.    
  1347. double x1,x2,y1,y2;
  1348. x1=m_Select_Enlarge_p1.x-m_pOrth.x;
  1349. y1=m_Select_Enlarge_p1.y-m_pOrth.x;
  1350. x2=m_Select_Enlarge_p2.x-m_pOrth.y;
  1351. y2=m_Select_Enlarge_p2.y-m_pOrth.y;
  1352. x1=(x1)*m_xFactor+m_x_start;
  1353. y1=(y1)*m_yFactor+m_y_start;
  1354. x2=(x2)*m_xFactor+m_x_start;
  1355. y2=(y2)*m_yFactor+m_y_start;
  1356. SetAxisRange(y1,y2,"y");
  1357. SetAxisRange(x1,x2,"x");
  1358. m_IsEnlargeClose=false;
  1359. }
  1360. }
  1361. void CDataShow::OnRButtonDblClk(UINT nFlags, CPoint point) 
  1362. {
  1363. // TODO: Add your message handler code here and/or call default
  1364. // m_IsEnlargeClose=true;
  1365. CMenu PopupMenu;
  1366. POINT curPos;
  1367. GetCursorPos(&curPos);
  1368. PopupMenu.CreatePopupMenu();
  1369. PopupMenu.AppendMenu(MF_ENABLED, IDC_DATA_INPUT, _T("&I数据导入"));
  1370. PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_DATA, _T("&D保存数据"));
  1371. PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_BMP, _T("&B保存当前图片"));
  1372. if (!m_bIsGridOn)
  1373. {
  1374. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:on"));
  1375. }
  1376. else
  1377. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:off"));
  1378. if (!m_IsNoteOn)
  1379. {
  1380. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:on"));
  1381. }
  1382. else
  1383. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:off"));
  1384. if (!m_IsTimeShow)
  1385. {
  1386. PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:on"));
  1387. }
  1388. else
  1389. PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:off"));
  1390. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_TITLE_COLOR, _T("&T颜色:标题"));
  1391. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_AXIS_COLOR, _T("&A颜色:坐标轴"));
  1392. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_COLOR, _T("&G颜色:网格"));
  1393. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_DATA_COLOR, _T("&Q颜色:数据曲线"));
  1394. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_XYLEBAL_COLOR, _T("&X颜色:坐标文字"));
  1395. PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_BK_COLOR, _T("&G颜色:主框背景"));
  1396.     PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_FACE_COLOR, _T("&F颜色:曲线背景"));
  1397.     PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_CROSSLINE_COLOR, _T("&S颜色:十字线"));
  1398.     PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_COLOR, _T("&W颜色:说明文字"));
  1399. PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_TEXT_COLOR, _T("&W颜色:时间显示"));
  1400. PopupMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, curPos.x, curPos.y, this);
  1401. PopupMenu.DestroyMenu();
  1402. CString str;
  1403. //str.Format("%d",PopupMenu.GetMenuState)
  1404. CStatic::OnRButtonDblClk(nFlags, point);
  1405. }
  1406. void CDataShow::Draw_Text(CDC*pDC,CString str)
  1407. {
  1408. pDC->SetBkMode(TRANSPARENT);
  1409. pDC->SelectObject(m_pdc_data.new_pen);
  1410. pDC->TextOut(m_text_point[m_numOf_Text++].x,m_text_point[m_numOf_Text].y,str);
  1411. }
  1412. void CDataShow::TextControl(CDC *pDC)
  1413. {
  1414. for (int i=0;i<m_numOf_Text;i++)
  1415. {
  1416. Draw_Text(pDC,m_Text[i]);
  1417. }
  1418. }
  1419. //DEL void CDataShow::DataOutputControl(double n,CString in_or_out)
  1420. //DEL {
  1421. //DEL 
  1422. //DEL  if (in_or_out=="in")
  1423. //DEL  {
  1424. //DEL  for (int i=0;i<m_dNumOfData;i++)
  1425. //DEL  {
  1426. //DEL  m_Data_x[i]=m_Data_x[i]*n;
  1427. //DEL  m_Data_y[i]=m_Data_y[i]*n;
  1428. //DEL 
  1429. //DEL  }
  1430. //DEL  m_High=m_High*n;
  1431. //DEL  m_Low=m_Low*n;
  1432. //DEL  m_Top=m_Top*n;
  1433. //DEL  m_Bottom=m_Bottom*n;
  1434. //DEL 
  1435. //DEL  m_dataRect.right=m_dataRect.Width()*n;
  1436. //DEL  m_dataRect.bottom=m_dataRect.Height()*n;
  1437. //DEL  m_frameRect.right=m_frameRect.Width()*n;
  1438. //DEL  m_frameRect.bottom=m_frameRect.Height()*n;
  1439. //DEL  h*=n;
  1440. //DEL  w*=n;
  1441. //DEL  }
  1442. //DEL  else
  1443. //DEL  {
  1444. //DEL  for (int i=0;i<m_dNumOfData;i++)
  1445. //DEL  {
  1446. //DEL  m_Data_x[i]=m_Data_x[i]/n;
  1447. //DEL  m_Data_y[i]=m_Data_y[i]/n;
  1448. //DEL 
  1449. //DEL  }
  1450. //DEL  m_High=m_High/n;
  1451. //DEL  m_Low=m_Low/n;
  1452. //DEL  m_Top=m_Top/n;
  1453. //DEL  m_Bottom=m_Bottom/n;
  1454. //DEL  m_dataRect.right+=m_dataRect.Width()*n;
  1455. //DEL  m_dataRect.bottom+=m_dataRect.Height()*n;
  1456. //DEL  m_frameRect.right+=m_frameRect.Width()*n;
  1457. //DEL  m_frameRect.bottom+=m_frameRect.Height()*n;
  1458. //DEL  h*=n;
  1459. //DEL      w*=n;
  1460. //DEL 
  1461. //DEL  }
  1462. //DEL 
  1463. //DEL }
  1464. void CDataShow::OnSetAxisColor()
  1465. {
  1466. SetColor("axis");
  1467. }
  1468. void CDataShow::OnSetXYlebalColor()
  1469. {
  1470. SetColor("xy");
  1471. }
  1472. void CDataShow::OnSetGridColor()
  1473. {
  1474. SetColor("grid");
  1475. }
  1476. void CDataShow::OnSetBKColor(){
  1477. SetColor("bk");
  1478. }
  1479. void CDataShow::OnSetTitleColor()
  1480. {
  1481. SetColor("title");
  1482. }
  1483.  void CDataShow::OnSetCrossLineColor()
  1484. {
  1485.  SetColor("crossline");
  1486. }
  1487. void CDataShow::OnSetFaceColor()
  1488. {
  1489. SetColor("face");
  1490. }
  1491.   void CDataShow::OnSetDataInput()
  1492. {
  1493. LoadData();
  1494. }
  1495.   void CDataShow::OnSetNoteColor()
  1496.   {
  1497.  SetColor("note");
  1498.   }
  1499. void CDataShow::OnSetGridOnOff()
  1500. {
  1501. if (m_bIsGridOn)
  1502. {
  1503. Grid("off");
  1504. m_bIsGridOn=false;
  1505. }
  1506. else{
  1507. Grid("off");
  1508. m_bIsGridOn=true;
  1509. }
  1510. }
  1511. void CDataShow::OnSaveBmp() 
  1512. {
  1513. // TODO: Add your command handler code here
  1514. SaveBmp();
  1515. }
  1516. void CDataShow::OnSaveData() 
  1517. {
  1518. // TODO: Add your command handler code here
  1519. SaveData();
  1520. }
  1521. void CDataShow::SetColor(CString name)
  1522. {
  1523. CColorDialog dlg;
  1524. if (dlg.DoModal()==IDOK)
  1525. {
  1526. if (name=="data")
  1527. SetDataColor(dlg.GetColor());
  1528. if (name=="axis")
  1529. SetAxisColor(dlg.GetColor());
  1530. if (name=="xy")
  1531. {
  1532. SetTextColor(dlg.GetColor());
  1533. }
  1534. if (name=="face")
  1535. {
  1536. SetChildRectColor(dlg.GetColor());
  1537. }
  1538. if (name=="crossline")
  1539. {
  1540. SetCrossColor(dlg.GetColor());
  1541. }
  1542. if (name=="title")
  1543. {
  1544. SetTitleColor(dlg.GetColor());
  1545. }
  1546. if (name=="bk")
  1547. {
  1548. SetFrameColor(dlg.GetColor());
  1549. }
  1550. if (name=="grid")
  1551. {
  1552. SetGridColor(dlg.GetColor());
  1553. }
  1554. if (name=="note")
  1555. {
  1556. SetNoteColor(dlg.GetColor());
  1557. }
  1558. if (name=="time")
  1559. {
  1560. SetTimeTextColor(dlg.GetColor());
  1561. }
  1562. }
  1563. }
  1564. void CDataShow::Draw_NoteWord(CDC *pDC)
  1565. {
  1566. SetNotePoint();
  1567. if (m_IsNoteOn)
  1568. {
  1569. CString in[100],out,st;
  1570. out=m_sNote_text;
  1571. st=out;
  1572. int n;
  1573. n=(m_dataRect.right-m_pNote_point.x)/8;
  1574. pDC->SetTextColor(m_color_note);
  1575. pDC->TextOut(m_pNote_point.x+13*5,m_pNote_point.y-20,"NOTE");
  1576. int len=m_sNote_text.GetLength();
  1577. int count=len/n;
  1578. for(int i=0;i<count;i++)
  1579. {   
  1580. in[i]="";
  1581.      for(int j=i*n;j<=i*n+n-2;j=j+2)
  1582. {
  1583.        in[i]=in[i]+st.GetAt(j)+st.GetAt(j+1);
  1584.         out.Delete(0,2);
  1585.    }
  1586.   
  1587. }
  1588. in[count]=out;
  1589.     for(int i=0;i<=count;i++)
  1590. pDC->TextOut(m_pNote_point.x,m_pNote_point.y+2*h*i,in[i]);
  1591. }
  1592. }
  1593. void CDataShow::SetNoteText(CString note)
  1594. {
  1595. m_sNote_text=note;
  1596. }
  1597. void CDataShow::SetNotePoint()
  1598. {
  1599. double x,y;
  1600. x=m_dataRect.right-m_dataRect.Width()/2.5;
  1601. y=m_dataRect.top+8*h;
  1602. m_pNote_point.x=x;
  1603. m_pNote_point.y=y;
  1604. }
  1605. void CDataShow::SetNoteWordOn(bool IsOn)
  1606. {
  1607. m_IsNoteOn=IsOn;
  1608. }
  1609. void CDataShow::SetNoteColor(COLORREF C)
  1610. {
  1611. m_color_note=C;
  1612. }
  1613. CString CDataShow::GetTimeFormat()
  1614. {
  1615. CTime t;
  1616. t=CTime::GetCurrentTime();
  1617. CString y,mo,h,m,s;
  1618. int x;
  1619. x=t.GetHour();
  1620. h.Format("%d",t.GetHour());
  1621. if (x<10)
  1622. {
  1623. h="0"+h;
  1624. }
  1625. m.Format("%d",t.GetMinute());
  1626. if (t.GetMinute()<10)
  1627. {
  1628. m="0"+m;
  1629. }
  1630. s.Format("%d",t.GetSecond());
  1631. if (t.GetSecond()<10)
  1632. {
  1633. s="0"+s;
  1634. }
  1635. y.Format("%d",t.GetYear());
  1636. mo.Format("%d",t.GetMonth());
  1637. if (t.GetMonth()<10)
  1638. {
  1639. mo="0"+mo;
  1640. }
  1641. return y+"-"+mo+"-"+h+":"+m+":"+s;
  1642. }
  1643. void CDataShow::SetTimeTextColor(COLORREF C)
  1644. {
  1645. m_time_color=C;
  1646. }
  1647. void CDataShow::SetTimeShow(bool IsShow)
  1648. {
  1649. m_IsTimeShow=IsShow;
  1650. }