MsChart 的使用(转载)

    技术2022-05-20  57

    void CMoreDMcode::OnCacluteDelta(int nRow) {m_Chart.SetRedraw(false); m_Chart.SetRow(1);for(int i=1;i<=64;i++){m_Chart.GetDataGrid().SetData(i,1,nDelta[i-1],0);}CRgn rgn; m_Chart.GetUpdateRgn(&rgn);

    m_Chart.SetRedraw(true); m_Chart.InvalidateRgn(&rgn,false) ;}

    void CMoreDMcode::InitChart(){VARIANT var;

    m_Chart.SetColumnCount(1); //设置曲线条数m_Chart.SetRowCount(64); //一条曲线有64个点 m_Chart.SetTitleText("二位形态码t变化趋势");m_Chart.SetChartType(1|2);////m_Chart.SetShowLegend(TRUE);

    //设置Xm_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(8);// 每四刻度一个标注m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(8); // 每刻度一个刻度线

    //m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMaximum(64); // X轴最大刻度m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMinimum(0); // X轴最小刻度m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("二位形态码");

    //设置Ym_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(10); // Y轴刻度10等分m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线//m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("t变化趋势"); // Y轴名称//m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().GetTextLayout().SetOrientation(2);//Y轴名称排列方式

    m_Chart.GetPlot().SetUniformAxis(FALSE);

    }

    void CMoreDMcode::OnMSChartDraw() {

    CString str;int nRow = m_Grid.GetFocusCell().row;if (nRow<0){MessageBox("请在左表选择要排序的行!","操作错误",MB_OK|MB_ICONWARNING);return;}

    for(int i=0;i<64;i++){str = m_Grid.GetItemText(nRow,i+3);nDelta[i] = atoi(str.GetBuffer(0));}

    InitChart();//初始化坐标轴

    // 根据不同的数据设定不同的Y轴最大刻度int m = GetMaxData(nDelta);m=(m/50)*50+50;//取靠近M的比M大的50的倍数str = m_Grid.GetItemText(nRow,0);VARIANT var;m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(m); OnCacluteDelta(nRow);//绘图str = "当前绘制的是第"+str+"期的t变化趋势";m_Tip.SetWindowText(str);}

    函数名字取得不好,大家见笑了,开始取名字错误,后来不想该了,呵呵^_^

    图表由于其直观明了的特性,在实际应用中十分很广泛。我们常常希望数据能通过图表来显示其特性。例如在DelphiC++Builder编程中,我们可以很方便地实现数据图表。MsChart6.05.0版)是Windows系统中Visual studio自带的一个ACTIVEX控件,它功能强大,应用广泛,具有以下特点:

    · 支持随机数据和随机数组,动态显示。 · 支持所有主要的图表类型。 · 支持三维显示。

    MsChart具有45个属性,9个方法,49 事件,可灵活编程,可实现各类表的显示。

    1 MsChart 应用编程 首先插入MsChart 控件,在工程中加入 mschart菜单->Project->Add To Project->Components and Controls->Registered ActiveX Controls->Microsoft Chart Control, version 6.0 (OLEDB)

    1.1 坐标系属性的设置

    a)纵轴初始化属性

    Mschart 默认支持自动标准,将自动调整,可以缺省设置。

    i nclude "mschart.h" //添加相关的头文件i nclude "VcAxis.h"i nclude "VcAxisTitle.h"i nclude "VcTextLayout.h"i nclude "VcDataGrid.h"i nclude "VcPlot.h"i nclude "VcValueScale.h"i nclude "VcSeriesCollection.h"i nclude "VcSeries.h"i nclude "VcPen.h"i nclude "VcCategoryScale.h"i nclude "VcColor.h"i nclude "VcDataGrid.h"i nclude "VcBackdrop.h"i nclude "VcFill.h"i nclude "VcBrush.h"i nclude "VcDataPoints.h"i nclude "VcDataPoint.h"i nclude "VcDataPointLabel.h"i nclude "VcAxisTitle.h"//最好添加全部头函数,CMSChart m_Chart;//m_Chart 为图表变量

    VARIANT var;

    m_Chart.GetPlot().GetAxis(1,var)//获取纵轴

    //设置是否支持自动标准;控件默认支持自动标准。

    m_Chart.GetPlot().GetAxis().GetValuesScale().SetAuto(FALSE);

    //设置最大刻度为M;

    m_Chart.GetPlot().GetAxis().GetValuesScale().SetMaximum(M);

    //设置最小刻度为m;

    m_Chart.GetPlot().GetAxis().GetValuesScale().SetMinimum(m);

    //设置轴的等分数D;

    m_Chart.GetPlot().GetAxis().GetValuesScale().SetMajorDivision(D);

    //设置每等分的刻度线数n;

    m_Chart.GetPlot().GetAxis().GetValuesScale().SetMinorDivision(n);

    b)横轴初始化属性

    VARIANT var;

    m_Chart.GetPlot().GetAxis(0,var)//获取横轴

    其他属性设置跟纵轴相同。

    1.2 数据显示

    a)设置标题栏和标签

    m_Chart.SetTitleText(“标题”);//设置标题栏

    m_Chart.SetRowLabel((“I”);//设置第i行标签

    m_Chart.SetColumnLabel((“j”);//设置第j列标签

    b)行列的显示布局

    MSChart的行列显示布局有其自身的特点:下面显示是一个行列4×3(矩形图),即(四行,三列)的布局示意图。

    m_Chart.SetRowCount(4); //没条曲线三个四个点 (曲线图)

    m_Chart.SetColumnCount(3); //设置曲线条数为三条(曲线图)

    c)行列操作

    // 操作行列第i行、第j

    m_Chart.SetRow(i);// i

    m_Chart.SetColumn(j);//j

    m_Chart.SetRowLabel((“i”);//设置第i行标签

    CString str”90.5”;

    m_Chart.SetData((LPCTSTR(str)); //设置行列,j>的显示数据

    m_Chart.Refresh();//刷新视图

    d)显示方式

    获取当前的显示方式:

    long nType m_Chart.GetChartType()

    设置显示方式:

    m_Chart.SetChartType(0);//3D(三维显示

    m_Chart.SetChartType(1);//2D(二维显示

    m_Chart.Refresh();

    其它常用组合方式为:

    m_Chart.SetChartType(1|0) //2D(),

    m_Chart.SetChartType(0|0) //3D()

    m_Chart.SetChartType(1|2) //2D线条型

    m_Chart.SetChartType(0|2) //3D线条型

    m_Chart.SetChartType(1|4) //2D区域型

    m_Chart.SetChartType(0|4) //3D区域型

    m_Chart.SetChartType(1|6) //2D阶梯型

    m_Chart.SetChartType(0|6) //3D阶梯型

    m_Chart.SetChartType(1|8) //2D()合型

    m_Chart.SetChartType(0|8) //3D()合型

    另外,2D方式中,还有两类:饼型和XY

    m_Chart.SetChartType(14) //2D 饼型

    m_Chart.SetChartType(16) //2DXY

    e)其他

    其他属性,比如设置字体,颜色,对齐方式等。

    //====================================================//VC知识库上的参考文章http://www.vckbase.com/document/viewdoc/?id=959

    3.3 设置 m_Chart void CDemoView::InitChart(){// 设置标题m_Chart.SetTitleText("mschart 示例 by thinkry@263.net");// 下面两句改变背景色m_Chart.GetBackdrop().GetFill().SetStyle(1);m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);// 显示图例m_Chart.SetShowLegend(TRUE);m_Chart.SetColumn(1);m_Chart.SetColumnLabel((LPCTSTR)"1号机");m_Chart.SetColumn(2);m_Chart.SetColumnLabel((LPCTSTR)"2号机");m_Chart.SetColumn(3);m_Chart.SetColumnLabel((LPCTSTR)"3号机");// 栈模式// m_Chart.SetStacking(TRUE);// Y轴设置VARIANT var;m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // Y轴刻度5等分m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("小时"); // Y轴名称// 3条曲线m_Chart.SetColumnCount(3); // 线色m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0);// 线宽(对点线图有效)m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(50);m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100);m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2);// 数据点类型显示数据值的模式(对柱柱状图和点线图有效)// 0: 不显示 1: 显示在柱状图外// 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);} 3.4 设置数据 void CDemoView::DrawChart(){int nRowCount = 6;m_Chart.SetRowCount(nRowCount);VARIANT var;// 不自动标注X轴刻度m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 每刻度一个标注m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个刻度线m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); // X轴名称m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("日期"); char buf[32];srand( (unsigned)time( NULL ) );for(int row = 1; row <= nRowCount; ++row){m_Chart.SetRow(row);sprintf(buf, "%d", row);m_Chart.SetRowLabel((LPCTSTR)buf);m_Chart.GetDataGrid().SetData(row, 1, rand() * 100 / RAND_MAX, 0);//设置第一条曲线的第row个点m_Chart.GetDataGrid().SetData(row, 2, rand() * 100 / RAND_MAX, 0);//设置第二条曲线的第row个点m_Chart.GetDataGrid().SetData(row, 3, rand() * 100 / RAND_MAX, 0);//设置第三条曲线的第row个点}m_Chart.Refresh(); }

     

    3.5 改变显示类型 // 折线图void CDemoView::OnChartLine() {m_Chart.SetChartType(3); DrawChart();}

    // 柱状图 void CDemoView::OnChartCombi() {m_Chart.SetChartType(1); DrawChart();}// 饼状图void CDemoView::OnChartPie() {m_Chart.SetChartType(14); DrawChart();}


    最新回复(0)