mschart功能非常强大,可以画曲线、折线、散点、柱子、区域等等图形,详细的资料从网上搜集很多,然而我们要添加我们自定义的功能时需要在PostPaint事件中利用ChartGraphics。例如我们添加横线或竖线,可能需要获取x轴的最大最小值,当chart的x轴的最大最小值属性没有设置为Auto时从PostPaint之外的代码获取为null,只能从PostPaint读取,下边是几个重要的函数:
//
// 摘要:
// 接受 System.Drawing.PointF 对象并将其相对坐标转换为绝对坐标。
//
// 参数:
// point:
// 一个以相对坐标表示的 System.Drawing.PointF 对象。
//
// 返回结果:
// 一个以绝对坐标表示的 System.Drawing.PointF 对象。
public PointF GetAbsolutePoint(PointF point);
//
// 摘要:
// 接受 System.Drawing.RectangleF 对象并将其相对坐标转换为绝对坐标。
//
// 参数:
// rectangle:
// 一个以相对坐标表示的 System.Drawing.RectangleF 对象。
//
// 返回结果:
// 一个以绝对坐标表示的 System.Drawing.RectangleF 对象。
public RectangleF GetAbsoluteRectangle(RectangleF rectangle);
//
// 摘要:
// 接受使用相对坐标的 System.Drawing.SizeF 对象并返回使用绝对坐标的 System.Drawing.SizeF 对象。
//
// 参数:
// size:
// 一个以相对坐标表示的 System.Drawing.SizeF 对象。
//
// 返回结果:
// 一个以绝对坐标表示的 System.Drawing.SizeF 对象。
public SizeF GetAbsoluteSize(SizeF size);
//
// 摘要:
// 接受指定轴的给定轴值并返回相对像素值。
//
// 参数:
// chartAreaName:
// 图表区域名称。
//
// axis:
// 一个标识相关轴的 System.Windows.Forms.DataVisualization.Charting.AxisName 枚举值。
//
// axisValue:
// 要转换为相对像素值的轴值。
//
// 返回结果:
// 一个 string 值,该值表示转换后的轴值(以相对像素坐标表示)。
public double GetPositionFromAxis(string chartAreaName, AxisName axis, double axisValue);
//
// 摘要:
// 接受使用绝对坐标的 System.Drawing.PointF 对象并返回使用相对坐标的 System.Drawing.PointF 对象。
//
// 参数:
// point:
// 一个以绝对坐标表示的 System.Drawing.PointF 对象。
//
// 返回结果:
// 一个以相对坐标表示的 System.Drawing.PointF 对象。
public PointF GetRelativePoint(PointF point);
//
// 摘要:
// 接受使用绝对坐标的 System.Drawing.RectangleF 结构并返回使用相对坐标的 System.Drawing.RectangleF
// 对象。
//
// 参数:
// rectangle:
// 一个以绝对坐标表示的 System.Drawing.RectangleF 结构。
//
// 返回结果:
// 一个以相对坐标表示的 System.Drawing.RectangleF 结构。
public RectangleF GetRelativeRectangle(RectangleF rectangle);
获取鼠标点击的对象:
_sElement = null;
_sAxis = null;
_sChartArea = null;
_sChartElementType = ChartElementType.Nothing;
_sSeries = null;
_sSubObject = null;
HitTestResult result = this._Chart.HitTest(e.X, e.Y);
_sElement = result.Object;
if (_sElement == null)
{
_sElement = this._Chart;
}
_sAxis = result.Axis;
_sChartArea = result.ChartArea;
_sChartElementType = result.ChartElementType;
_sSeries = result.Series;
_sSubObject = result.Object;
为序列设置数据源时我感觉使用DataBindXY不如Points.Add快,尤其上万个点时。
当序列的数据源为空且这个区域只有一个序列的时候,轴的标签总是不显示,这是我们可以给序列添加一个空点:
mySeries.Points.AddY(1);
mySeries.Points[0].IsEmpty = true;