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;