VC6自带控件画坐标曲线

http://blog.csdn.net/youoran/article/details/8460875

说明:本文将网上一些MSChart的使用方法进行了一个总结,按下面的步骤可以实现一个产生三条曲线(每条曲线6个随机数点)的表。

1 在工程中加入 mschart

   MSChart是VC++6.0中自带的一个特殊控件类,用于绘制坐标曲线图。首先建一个基于对话框的MFC程序,插入MsChart 控件,在工程中加入 mschart :

           菜单->Project->AddToProject->ComponentsandControls->RegisteredActiveXControls>MicrosoftChartControl,version6.0(OLEDB)

2   添加头文件

在要使用的类的实现文件中包含如下头文件

第一部分:

[html] view plain copy print ?
  1. #include "VcPlot.h"  
  2. #include "VcAxis.h"                             
  3. #include "VcValueScale.h"  
  4. #include "VcSeriesCollection.h"  
  5. #include "VcSeries.h"  
  6. #include "VcPen.h"  
  7. #include "VcCategoryScale.h"  
  8. #include "VcColor.h"  
  9. #include "VcDataGrid.h"  
  10. #include "VcBackdrop.h"  
  11. #include "VcFill.h"  
  12. #include "VcBrush.h"  
  13. #include "VcDataPoints.h"  
  14. #include "VcDataPoint.h"  
  15. #include "VcDataPointLabel.h"  
  16. #include "VcAxisTitle.h"  
  17. #include "math.h"  


在要使用的类的头文件中包含:

[cpp] view plain copy print ?
  1. #include "mschart.h"   


3    类中定义CMSChart 变量

[cpp] view plain copy print ?
  1. class CMsChartDlgDlg : public CDialog  
  2.   
  3. {  
  4.   
  5.     // Construction  
  6.   
  7.     … …  
  8.   
  9.     private:  
  10.   
  11.          CMSChart m_Chart; //对话框关联的类中定义CMSChart类  
  12.   
  13.     … …  
  14.   
  15. };  

4  创建m_Chart

CMsChartDlgDlg::OnInitDialog()函数中添加如下代码

[cpp] view plain copy print ?
  1. CRect rc;  
  2. GetClientRect(&rc);  
  3. rc.top += 30;  
  4. rc.left += 50;  
  5. rc.bottom -= 80;  
  6. rc.right -= 50;  
  7. m_Chart.Create("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10);  
  8.   
  9. //控件资源初始化  
  10. initmschart();  

 

5 初始化m_Chart

CMsChartDlgDlg中添加函数:

void CMsChartDlgDlg::initmschart(); //初始化

[cpp] view plain copy print ?
  1. //主要设置表的样式:表的XY轴长度色彩等等  
  2.   
  3. void CMsChartDlgDlg::initmschart()  
  4.   
  5. {  
  6.   
  7.        // 设置标题   
  8.         m_Chart.SetTitleText("mschart 示例 by [email protected]");   
  9.   
  10.        // 下面两句改变背景色   
  11.         m_Chart.GetBackdrop().GetFill().SetStyle(1);   
  12.        m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);   
  13.   
  14.        // 显示图例   
  15.   
  16.         m_Chart.SetShowLegend(TRUE);   
  17.        m_Chart.SetColumn(1);   
  18.        m_Chart.SetColumnLabel((LPCTSTR)"1号机");   
  19.        m_Chart.SetColumn(2);   
  20.        m_Chart.SetColumnLabel((LPCTSTR)"2号机");   
  21.        m_Chart.SetColumn(3);   
  22.        m_Chart.SetColumnLabel((LPCTSTR)"3号机");   
  23.   
  24.        // 栈模式   
  25.         //m_Chart.SetStacking(TRUE);   
  26.   
  27.        // Y轴设置   
  28.        VARIANT var;   
  29.        m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度   
  30.        m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度   
  31.        m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度   
  32.        m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // Y轴刻度5等分   
  33.        m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线   
  34.        m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("小时"); // Y轴名称   
  35.   
  36.        // 3条曲线   
  37.        m_Chart.SetColumnCount(3);    
  38.   
  39.        // 线色   
  40.        m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);   
  41.       m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);   
  42.       m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0);   
  43.   
  44.        // 线宽(对点线图有效)   
  45.       m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(50);   
  46.       m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100);   
  47.       m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2);   
  48.   
  49.        // 数据点类型显示数据值的模式(对柱柱状图和点线图有效)   
  50.        // 0: 不显示 1: 显示在柱状图外   
  51.        // 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方   
  52.        m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);   
  53.       m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);   
  54.       m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);  
  55.   
  56. }  

6 设置m_Chart数据

[cpp] view plain copy print ?
  1. //画曲线  
  2.   
  3. void CMsChartDlgDlg::DrawChart()  
  4.   
  5. {  
  6.   
  7.        int nRowCount = 6;   
  8.        m_Chart.SetRowCount(nRowCount);   
  9.   
  10.        VARIANT var;   
  11.        // 不自动标注X轴刻度   
  12.        m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE);        
  13.        // 每刻度一个标注   
  14.        m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);     
  15.        // 每刻度一个刻度线   
  16.        m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1);    
  17.      
  18.        // X轴名称   
  19.        m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("日期");    
  20.        char buf[32];   
  21.        srand( (unsigned)time( NULL ) );   
  22.    
  23.     //随机产生三条曲线的6个点  
  24.        for(int row = 1; row <= nRowCount; ++row)   
  25.        {   
  26.            m_Chart.SetRow(row);   
  27.            sprintf(buf, "%d号", row);   
  28.            m_Chart.SetRowLabel((LPCTSTR)buf);   
  29.            m_Chart.GetDataGrid().SetData(row, 1, rand() * 100 / RAND_MAX, 0);//设置第一条曲线的第row个点   
  30.               m_Chart.GetDataGrid().SetData(row, 2, rand() * 100 / RAND_MAX, 0);//设置第二条曲线的第row个点   
  31.               m_Chart.GetDataGrid().SetData(row, 3, rand() * 100 / RAND_MAX, 0);//设置第三条曲线的第row个点   
  32.        }   
  33.   
  34.     m_Chart.Refresh();  
  35.   
  36. }  

7 添ON_SIZE消息响应函数


在 CMsChartDlgDlg::OnSize 中调整 m_Chart 的大小,使之能随窗口大小变化而变化

[cpp] view plain copy print ?
  1. //添加ON_SIZE消息响应函数  
  2.   
  3. void CMsChartDlgDlg::OnSize(UINT nType, int cx, int cy)  
  4.   
  5. {  
  6.     CDialog::OnSize(nType, cx, cy);  
  7.       
  8.     if( m_Chart.GetSafeHwnd() )   
  9.         m_Chart.MoveWindow( 0, 0, cx, cy );    
  10.     // TODO: Add your message handler code here  
  11.    
  12. }  

8 改变显示类型 

[cpp] view plain copy print ?
  1. // 折线图   
  2. void CDemoView::OnChartLine()    
  3. {     
  4.      m_Chart.SetChartType(3);    
  5.      DrawChart();   
  6. }   
  7.    
  8.    
  9. // 柱状图    
  10. void CDemoView::OnChartCombi()    
  11. {   
  12.      m_Chart.SetChartType(1);    
  13.      DrawChart();   
  14. }   
  15. // 饼状图   
  16. void CDemoView::OnChartPie()    
  17. {   
  18.     m_Chart.SetChartType(14);    
  19.     DrawChart();   
  20. }  

9 程序运行效果图

VC6自带控件画坐标曲线_第1张图片

10 MsChart函数说明:

[cpp] view plain copy print ?
  1. 1.   m_Chart.GetPlot().GetAxis(1,var)//获取纵轴    
  2.   
  3. 2.   //设置是否支持自动标准;控件默认支持自动标准。    
  4.   
  5. 3.   m_Chart.GetPlot().GetAxis().GetValuesScale().SetAuto(FALSE);    
  6.   
  7. 4.   //设置最大刻度为M;    
  8.   
  9. 5.   m_Chart.GetPlot().GetAxis().GetValuesScale().SetMaximum(M);    
  10.   
  11. 6.   //设置最小刻度为m;    
  12.   
  13. 7.   m_Chart.GetPlot().GetAxis().GetValuesScale().SetMinimum(m);    
  14.   
  15. 8.   //设置轴的等分数D;    
  16.   
  17. 9.   m_Chart.GetPlot().GetAxis().GetValuesScale().SetMajorDivision(D);    
  18.   
  19. 10.  //设置每等分的刻度线数n;    
  20.   
  21. 11.  m_Chart.GetPlot().GetAxis().GetValuesScale().SetMinorDivision(n);    
  22.   
  23. 12.  //b)横轴初始化属性    
  24.   
  25. 13.  VARIANT var;    
  26.   
  27. 14.  m_Chart.GetPlot().GetAxis(0,var)//获取横轴    
  28.   
  29. 15.  //其他属性设置跟纵轴相同。    
  30.   
  31. 16.  //1.2 数据显示    
  32.   
  33. 17.  //a)设置标题栏和标签    
  34.   
  35. 18.  m_Chart.SetTitleText(“标题”);//设置标题栏    
  36.   
  37. 19.  m_Chart.SetRowLabel((“第I行”);//设置第i行标签    
  38.   
  39. 20.  m_Chart.SetColumnLabel((“第j列”);//设置第j列标签    
  40.   
  41. 21.  //b)行列的显示布局    
  42.   
  43. 22. // MSChart的行列显示布局有其自身的特点:下面显示是一个行列4×3(矩形图),即(四行,三列)的布局示意图。    
  44.   
  45. 23.  m_Chart.SetRowCount(4); //没条曲线三个四个点 (曲线图)    
  46.   
  47. 24.  m_Chart.SetColumnCount(3); //设置曲线条数为三条(曲线图)    
  48.   
  49. 25.  //c)行列操作    
  50.   
  51. 26.  // 操作行列第i行、第j列    
  52.   
  53. 27.  m_Chart.SetRow(i);// 第i行    
  54.   
  55. 28.  m_Chart.SetColumn(j);//第j列   
  56.   
  57. 29.  m_Chart.SetRowLabel((“第i行”);//设置第i行标签    
  58.   
  59. 30.  CString str=”90.5”;    
  60.   
  61. 31.  m_Chart.SetData((LPCTSTR(str)); //设置行列,j>的显示数据    
  62.   
  63. 32.  m_Chart.Refresh();//刷新视图    
  64.   
  65. 33.  //d)显示方式    
  66.   
  67. 34.  //获取当前的显示方式:    
  68.   
  69. 35.  long nType =m_Chart.GetChartType();    
  70.   
  71. 36.  //设置显示方式:    
  72.   
  73. 37.  m_Chart.SetChartType(0);//3D(三维) 显示    
  74.   
  75. 38.  m_Chart.SetChartType(1);//2D(二维) 显示    
  76.   
  77. 39.  m_Chart.Refresh();    
  78.   
  79. 40.  //其它常用组合方式为:    
  80.   
  81. 41.  m_Chart.SetChartType(1|0) //2D柱(条)形,    
  82.   
  83. 42.  m_Chart.SetChartType(0|0) //3D柱(条)形    
  84.   
  85. 43.  m_Chart.SetChartType(1|2) //2D线条型    
  86.   
  87. 44.  m_Chart.SetChartType(0|2) //3D线条型    
  88.   
  89. 45.  m_Chart.SetChartType(1|4) //2D区域型    
  90.   
  91. 46.  m_Chart.SetChartType(0|4) //3D区域型    
  92.   
  93. 47.  m_Chart.SetChartType(1|6) //2D阶梯型    
  94.   
  95. 48.  m_Chart.SetChartType(0|6) //3D阶梯型    
  96.   
  97. 49.  m_Chart.SetChartType(1|8) //2D复(混)合型    
  98.   
  99. 50.  m_Chart.SetChartType(0|8) //3D复(混)合型    
  100.   
  101. 51.  //另外,在2D方式中,还有两类:饼型和XY型    
  102.   
  103. 52.  m_Chart.SetChartType(14) //2D 饼型    
  104.   
  105. 53.  m_Chart.SetChartType(16) //2DXY型    
  106.   
  107. 54.  //e)其他    
  108.   
  109. 55.  //其他属性,比如设置字体,颜色,对齐方式等。  

参考文章:http://blog.sina.com.cn/s/blog_75f4e17c0100qk44.html

                   http://www.vckbase.com/index.php/wv/711

你可能感兴趣的:(VC6自带控件画坐标曲线)