LineChart.cpp
上传用户:hbytqc8
上传日期:2014-07-31
资源大小:527k
文件大小:8k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. // LineChart.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "LanFlow.h"
  5. #include "LineChart.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CLineChart
  13. CLineChart::CLineChart(CSize cs)
  14. {
  15. mark=true;
  16. legend=true;
  17. percent=false;
  18. xSum=0;
  19. ySum=0;
  20. Count=0;
  21. bkcolor=RGB(250,250,80);
  22. title="My Chart";
  23. xLegend="xLegend";
  24. yLegend="yLegend";
  25. tFont.CreatePointFont(80,"楷体_GB2132",NULL);
  26. ChartSize=cs;
  27. first=0;
  28. srand((unsigned)time(NULL));
  29. LineData ld;
  30. for (int i=0;i<5;i++)
  31. {
  32. ld.x=rand()%100;
  33. ld.y=rand()%50;
  34. ld.xP="";
  35. ld.xP="";
  36. ld.xTime="127.0.0.1";
  37. ld.yTime="127.0.0.1";
  38. ArrayData.Add(ld);
  39. xSum+=ld.x;
  40. ySum+=ld.y;
  41. }
  42. yMax=100;
  43. }
  44. CLineChart::~CLineChart()
  45. {
  46. }
  47. BEGIN_MESSAGE_MAP(CLineChart, CStatic)
  48. //{{AFX_MSG_MAP(CLineChart)
  49. ON_WM_PAINT()
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CLineChart message handlers
  54. void CLineChart::OnPaint() 
  55. {
  56. CPaintDC dc(this); // device context for painting
  57. int height,width;
  58. CPen pen,*pPen;
  59.     CBrush br,*pB;
  60. COLORREF color;
  61.     br.CreateSolidBrush(bkcolor);
  62. pB=dc.SelectObject(&br);
  63. dc.Rectangle(0,0,ChartSize.cx,ChartSize.cy);
  64.     dc.SelectObject(pB);
  65.     br.DeleteObject();
  66.     int n1=dc.SetBkMode(TRANSPARENT);
  67.     CPoint Start,xEnd,yEnd,temp1,temp2;
  68. //确定坐标系,画X轴;
  69. Start.x=60;
  70. Start.y=ChartSize.cy-40;
  71. dc.MoveTo(Start);
  72. xEnd.x=ChartSize.cx-40;
  73.     xEnd.y=Start.y;
  74. width=xEnd.x-Start.x;
  75. dc.LineTo(xEnd.x+5,xEnd.y);
  76. dc.TextOut(xEnd.x+8,xEnd.y-8,"地址");
  77. //画X轴箭头;
  78. dc.LineTo(xEnd.x,xEnd.y-3);
  79. dc.MoveTo(xEnd.x+5,xEnd.y);
  80. dc.LineTo(xEnd.x,xEnd.y+3);
  81. //画Y轴;
  82. dc.MoveTo(Start);
  83. yEnd.y=40;
  84. yEnd.x=Start.x;
  85. height=Start.y-yEnd.y;
  86. //计算Y轴每点对应的数值,取整会影响精度;
  87.     float n=(float)yMax/(height-10);
  88. height=(height-10)/5;
  89. //Y轴以及箭头;
  90. dc.LineTo(yEnd);
  91.     dc.LineTo(yEnd.x-3,yEnd.y+5);
  92. dc.MoveTo(yEnd);
  93. dc.LineTo(yEnd.x+3,yEnd.y+5);
  94. dc.TextOut(yEnd.x-20,yEnd.y-20,"Bytes");
  95.     //画Y轴虚线,标注刻度值;
  96. pen.CreatePen(PS_DOT,1,RGB(0,0,0));
  97.     pPen=dc.SelectObject(&pen);
  98.     dc.TextOut(60-9,Start.y-7,"0");
  99. CString yText;
  100. int yCo;
  101. for (int i=0;i<5;i++)
  102. {
  103. dc.MoveTo(Start.x,Start.y-(i+1)*height);
  104. dc.LineTo(Start.x+ChartSize.cx-100,Start.y-(i+1)*height);
  105. yCo=(i+1)*(yMax/5);
  106. yText.Format("%d",yCo);
  107. dc.TextOut(60-yText.GetLength()*9,Start.y-(i+1)*height-7,yText);
  108. }
  109. //画X轴坐标线;
  110. int xW=(width/5+0.5);
  111. for (i=1;i<=5;i++)
  112. {
  113. dc.MoveTo(Start.x+i*xW,Start.y);
  114. dc.LineTo(Start.x+i*xW,Start.y-5*height);
  115. }
  116.     dc.SelectObject(pPen);
  117. pen.DeleteObject();
  118. //画曲线X;
  119. pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
  120.     pPen=dc.SelectObject(&pen);
  121. color=RGB(0,0,255);
  122. br.CreateSolidBrush(color);
  123. pB=dc.SelectObject(&br);
  124. CString data;
  125. // int n1;
  126. for (i=first;i<first+5;i++)
  127. temp1.x=Start.x+(i-first)*xW+25;
  128. temp1.y=Start.y-(int)(ArrayData[i].x/n+0.5);
  129. temp2.x=temp1.x+20;
  130. temp2.y=Start.y;
  131. dc.Rectangle(temp1.x,temp1.y,temp2.x,temp2.y);
  132. if (mark)
  133. {  
  134. if (percent)
  135. dc.TextOut(temp1.x-5,temp1.y-20,ArrayData[i].xP);
  136. else
  137. {
  138. data.Format("%d",ArrayData[i].x);
  139. dc.TextOut(temp1.x-5,temp1.y-20,data);
  140. }
  141. }
  142. }
  143. dc.SelectObject(pPen);
  144. pen.DeleteObject();
  145. dc.SelectObject(pB);
  146. br.DeleteObject();
  147. pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
  148.     pPen=dc.SelectObject(&pen);
  149. color=RGB(255,0,0);
  150. br.CreateSolidBrush(color);
  151. pB=dc.SelectObject(&br);
  152. //画曲线Y;
  153. // n1=dc.SetBkMode(TRANSPARENT);
  154. for (i=first;i<first+5;i++)
  155. temp1.x=Start.x+(i-first)*xW+45;
  156. temp1.y=Start.y-(int)(ArrayData[i].y/n+0.5);
  157. temp2.x=temp1.x+20;
  158. temp2.y=Start.y;
  159. dc.Rectangle(temp1.x,temp1.y,temp2.x,temp2.y);
  160. if ((ArrayData[i].y!=0)&&(mark))
  161. {
  162.             if (percent)
  163. dc.TextOut(temp1.x+1,temp1.y-20,ArrayData[i].yP);
  164. else
  165.             {
  166. data.Format("%d",ArrayData[i].y);
  167. dc.TextOut(temp1.x+1,temp1.y-20,data);
  168. }
  169. }
  170. }
  171.     dc.SelectObject(pPen);
  172. pen.DeleteObject();
  173.     dc.SelectObject(pB);
  174.     br.DeleteObject();
  175. CFont* pOld=dc.SelectObject(&tFont);
  176. for (i=first;i<first+5;i++)
  177. {
  178. dc.TextOut(Start.x+(i-first)*xW+4,Start.y+8,ArrayData[i].xTime);
  179. if (ArrayData[i].yTime.GetLength()>0)
  180. {
  181. dc.TextOut(Start.x+(i-first)*xW+4,Start.y+20,ArrayData[i].yTime);
  182. }
  183. }   
  184. dc.SelectObject(pOld);
  185. //画标题;  
  186. dc.TextOut(yEnd.x+ChartSize.cx/4,4,title);
  187. if (legend)
  188.     {
  189. pen.CreatePen(PS_SOLID,1,RGB(0,255,0));
  190. pPen=dc.SelectObject(&pen);
  191. dc.MoveTo(yEnd.x+xEnd.x-180,yEnd.y-10);
  192. dc.LineTo(yEnd.x+xEnd.x-160,yEnd.y-10);
  193. dc.TextOut(yEnd.x+xEnd.x-150,yEnd.y-20,yLegend);
  194. dc.SelectObject(pPen);
  195. pen.DeleteObject();
  196. pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
  197. pPen=dc.SelectObject(&pen);
  198. dc.MoveTo(yEnd.x+xEnd.x-260,yEnd.y-10);
  199. dc.LineTo(yEnd.x+xEnd.x-240,yEnd.y-10);
  200. dc.TextOut(yEnd.x+xEnd.x-230,yEnd.y-20,xLegend);
  201. dc.SelectObject(pPen);
  202. pen.DeleteObject();
  203.         dc.SetBkMode(n1);
  204.     }
  205. // Do not call CStatic::OnPaint() for painting messages
  206. }
  207. //增加数据项到队列末尾,原来每个项依次前移一项;增加的
  208. //数据如果超出Y轴目前最大值,则最大值以100为单位递增,直
  209. //到大于输入的数据为止;最后重绘图表;
  210. void CLineChart::Append(int x1,int y1,CString xtt,CString ytt)
  211. {   
  212. int temp;
  213. if (x1>y1)
  214. temp=x1;
  215. else
  216. temp=y1;
  217. while (yMax<temp)
  218. yMax+=100;
  219. LineData ld;
  220. ld.x=x1;
  221. ld.y=y1;
  222. ld.xP="";
  223. ld.yP="";
  224. ld.xTime=xtt;
  225. ld.yTime=ytt;
  226. if (Count<5)
  227. ArrayData[Count]=ld;
  228. else
  229. ArrayData.Add(ld);
  230. Count+=1;
  231. xSum+=x1;
  232. ySum+=y1;
  233. }
  234. //初始化图表数据;
  235. void CLineChart::Init()
  236. {   
  237. yMax=100;
  238. xSum=0;
  239. ySum=0;
  240. Count=0;
  241. //   LineData ld;
  242. // ArrayData.RemoveAll();
  243. for(int i=0;i<5;i++)
  244. {
  245. ArrayData[i].x=0;
  246. ArrayData[i].y=0;
  247. ArrayData[i].xP="";
  248. ArrayData[i].yP="";
  249. ArrayData[i].xTime="";
  250. ArrayData[i].yTime="";
  251. }
  252. ArrayData.RemoveAt(5,ArrayData.GetSize()-5);
  253. // this->Invalidate();
  254. }
  255. void CLineChart::SetTitle(CString str)
  256. {
  257. title=str;
  258. this->Invalidate();
  259. }
  260. void CLineChart::SetLegend(CString xStr,CString yStr)
  261. {
  262. xLegend=xStr;
  263. yLegend=yStr;
  264. this->Invalidate();
  265. }
  266. void CLineChart::SetFirst(bool tf)
  267. {
  268. int n=ArrayData.GetSize();
  269. if ((tf)&&(first<n-5))
  270. first++;
  271. if ((!(tf))&&(first>0))
  272. first--;
  273. this->Invalidate();
  274. }
  275. void CLineChart::SetMark()
  276. {
  277. if (mark)
  278. mark=false;
  279. else
  280. mark=true;
  281. this->Invalidate();
  282. }
  283. void CLineChart::SetLegend()
  284. {
  285. if (legend)
  286. legend=false;
  287. else
  288. legend=true;
  289. this->Invalidate();
  290. }
  291. void CLineChart::SetMyBKColor(COLORREF color)
  292. {
  293. bkcolor=color;
  294.     this->Invalidate();
  295. }
  296. void CLineChart::WorkPercent()
  297. {
  298.     int n;
  299. if ((xSum!=0)&&(ySum!=0))
  300. for (int i=0;i<ArrayData.GetSize();i++)
  301. {
  302. n=(int)(100*ArrayData[i].x/xSum);
  303. ArrayData[i].xP.Format("%d",n);
  304. ArrayData[i].xP+="%";
  305. n=(int)(100*ArrayData[i].y/ySum);
  306. ArrayData[i].yP.Format("%d",n);
  307. ArrayData[i].yP+="%";
  308. }
  309. this->Invalidate();
  310. }
  311. void CLineChart::SetPercent()
  312. {
  313. if (percent)
  314. percent=false;
  315. else
  316. percent=true;
  317. this->Invalidate();
  318. }
  319. CString CLineChart::GetText()
  320. {
  321. CString text,temp,data;
  322. text="";
  323.     for (int i=0;i<ArrayData.GetSize();i++)
  324. {   
  325. temp="";
  326. if (ArrayData[i].xTime.GetLength()!=0)
  327. {
  328. if (ArrayData[i].xTime.Find('.')==-1)
  329. {
  330. temp="地址:"+temp+ArrayData[i].yTime+" Input: ";
  331. data.Format("%d",ArrayData[i].x);
  332. temp=temp+data+" OutPut: ";
  333. data.Format("%d",ArrayData[i].y);
  334. temp+=data;
  335. temp=temp+"  "+ArrayData[i].xP+"  "+ArrayData[i].yP;
  336. temp=temp+"rn";
  337. }
  338. else
  339. {
  340. temp=temp+ArrayData[i].xTime+"-->"+ArrayData[i].yTime;
  341. data.Format("%d",ArrayData[i].x);
  342. temp=temp+"数据: "+data+ArrayData[i].xP+"rn";
  343. }
  344. text+=temp;
  345. }
  346. }
  347. return text;
  348. }