搜档网
当前位置:搜档网 › [COM]微软MSChart图表控件使用方法

[COM]微软MSChart图表控件使用方法

■■MSChart控件详细说明■■
将电子书文件 VBAGR10.CHM复制到OFFICE安装目录D:\Program Files\Microsoft Office\OFFICE11\2052即可

*********************************************************************

MSChart应用描绘X,Y坐标点

在一个温度采集系统中,希望把采集来的各项温度值实时显示,用msChart控件绘制曲线走势图:
温度项用曲线表示; 横坐标为时间,纵坐标为温度值,均要求滚动显示;随着时间的增长,把采集来的温度显示出来,在每次采样完成后,刷新屏幕。
----------------------------------------------------------------------
代码很长!其实有好多都是系统自己加的,不过你们应该看的懂!
经过很多次的测试没有一点问题!
下面第一个问题如何加:AxMSChart20Lib到自己的C#系统上(很多人都问了,所以告诉大家很简单的)
在[工具]->[添加/移出工具箱]->鼠标单击->选择[COM组件]
找到Mcrosoft Chart Control 6.0(SP4)(oledb) 选中,然后[确定],你会发现你的工具箱里面有了一个这样的控件了!然后接着开始写代码!

//设计原理,由于axMSChart1的数据是直接可以接受一个二为数组的,
//所以我把事先读好的数据放到一个数组里
//注意数据库对应二为数组,是这样的行是一位,列是二位;
//所以我们看看就这样做
//由于楼主提出以时间(第2列)为横坐标,压力(第4列)为纵坐标的曲线图
//所以我们要把时间放在数组里的第一位,而压力放在第2位
//因为在axMSChart里数组第一位代表横坐标
//最后我们申明一个2纬数组,由于2纬数组一位代表行
//所以我们可以用ds.Tables["newtb"].Rows.Count取得行的总数
//而我们只要2列就可以了,所以我们是直接知道2纬数组的第2位的值,也就是2
//最后也是最关键的,也就是axMSChart需要数组里的第一个值来描述坐标点的说明 (★经过HEDDA测试,此处放屁。第一行也是数据行 mschart 2.0)
//所以我们就要空出一个位的数组来做描述
//因此数组真正的长度为ds.Tables["newtb"].Rows.Count+1
Object[,] myay=new Object[ds.Tables["newtb"].Rows.Count+1,2];
myay[0,0]=(Object)"时间描述";//这里可以不用写什么
myay[0,1]=(Object)"压力描述";//这里是描述坐标点的压力
for(int i=1;i<=ds.Tables["newtb"].Rows.Count;i++)
{
//这里是个重点,为什么要加上"["+"]"
//其实这个axMSChart1玩意很有意识的,如果你的字符串是数字类型的描述
//就算是字符串类型也不会当成横坐标哦!!
//嘿嘿有意识把,本人曾经为了这个问题搞了几天的!
myay[i,0]=(Object)"["+ds.Tables["newtb"].Rows[i-1]["st"].ToString()+"]";
myay[i,1]=(Object)ds.Tables["newtb"].Rows[i-1]["yl"].ToString();
}
//设计axMSChart1的数据
axMSChart1.ChartData = myay;
//设计图表的

表头名称和对齐方式
axMSChart1.Title.Text = "这里是一个图表";
axMSChart1.Legend.Location.LocationType = MSChart20Lib.VtChLocationType.VtChLocationTypeRight;
axMSChart1.Legend.Location.Visible = true;
//设计X轴名称
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdX, null).AxisTitle.Text = "这里是时间描述";

//设计Y轴名称
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdY, null).AxisTitle.Text = "这里是压力描述";
//设计图表形状的描述方式,是并图还是线图等等
//axMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType2dLine;
}

数据结构型如:
//V-I
d[0,0] = "V"; d[0,1] = "I";
//---------------------------
d[1,0] = "0"; d[1,1] = "5";
d[2,0] = "1"; d[2,1] = "5";
d[3,0] = "2"; d[3,1] = "3";
d[4,0] = "3"; d[4,1] = "1";
d[5,0] = "4"; d[5,1] = "0";

**********************************************************************
MSChart示例

3.3 设置 m_Chart void CDemoView::InitChart()
{
// 设置标题
m_Chart.SetTitleText("mschart 示例 by thinkry@https://www.sodocs.net/doc/4417467517.html,");
// 下面两句改变背景色
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();
}

/*
SetData (row, column, dataPoint, nullFlag)

SetData 方法语法包括以下组成部分:


row Integer 类型。标识包含数据点值的行。
column Integer 类型。标识包含数据点值的列。
dataPoint Double 类型。数据点值。
nullFlag Integer 类型。指示数据点值是否为空
*/

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();
}


相关主题