在MSChart控件上绘图

3

我有一个简单的折线图,我想通过在线条周围绘制矩形来突出显示某些部分(最好是带透明度的填充矩形...)。我不知道是否可以使用MS图表控件实现这一点?

Translated: 我有一个简单的折线图,想要用矩形框住线条的某些部分以突出显示(最好是透明度较高的填充矩形)。我不确定是否能够通过MS图表控件实现这一功能。

使用控件的PostPaint事件。 - Hans Passant
3个回答

3

我建议您从微软的代码示例下载并查看注释部分。在那里,您会找到所有所需的文档以实现您所描述的内容:

private void AddRectangleAnnotation()
{
RectangleAnnotation annotation = new RectangleAnnotation();
annotation.AnchorDataPoint = Chart1.Series[0].Points[2];
annotation.Text = "I am a\nRectangleAnnotation";
annotation.ForeColor = Color.Black;
annotation.Font = new Font("Arial", 12);;
annotation.LineWidth = 2;
annotation.BackColor = Color.PaleYellow;
annotation.LineDashStyle = ChartDashStyle.Dash;

Chart1.Annotations.Add(annotation);
}

厉害!你有没有想法如何偏移矩形,使得左下角成为锚点? - GuillaumeA
最终我没有使用AnchorOffset属性,因为它的行为不连贯(设置x偏移会导致y偏移...??)。相反,我使用了X和Y属性来设置位置,而没有进行锚定,这在我的情况下不是问题。 - GuillaumeA
你有没有想过如何偏移矩形,使左下角成为锚点?我认为你可以设置一个负高度来实现这一点。 - TaW

0

您的意思是:

using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
    using(Brush brush = new SolidBrush(your_color))
    {
        g.FillRectangle(brush , x, y, width, height);
    }
}

或者你可以使用

Brush brush = new SolidBrush(Color.FromArgb(alpha, red, green, blue))

alpha 取值从 0255,因此 alpha 值为 128 时,透明度为 50%


我是指使用控件System.Windows.Forms.DataVisualiztion.Charting.Chart并叠加一个矩形。 - GuillaumeA

0

当您想要在图表上绘制时,您可以添加LineAnnotation或RectangleAnnotation。然而,如果您想要更多控制,可以使用图表的PrePaint和PostPaint事件。如果您能够绘画,那么您可以绘制任何内容。同时使用此功能将使图表的“打印”和“导出”看起来与您绘制的内容相同。在屏幕上更改图表的位置时,覆盖它会看起来很奇怪,因此请始终在其中进行绘制。

假设您有一个交易图表,并且需要绘制一条线表示您变得有利可图的地方,或者绘制正方形以指示您“到达某个目标”,那么只需添加从哪里到哪里的坐标即可。

enter image description here

MS Chart示例项目展示了如何使用以下代码实现此功能(也提供vb.net版本):

using System.Windows.Forms.DataVisualization.Charting;
...

private void chart1_PostPaint(object sender, System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs e)
{
    if(sender is ChartArea)
    {

        ChartArea area = (ChartArea)sender;
        if(area.Name == "Default")
        {
            // If Connection line is not checked return
            if( !ConnectionLine.Checked )
                return;

            double max;
            double min;
            double xMax;
            double xMin;

            // Find Minimum and Maximum values
            FindMaxMin( out max, out min, out xMax, out xMin );

            // Get Graphics object from chart
            Graphics graph = e.ChartGraphics.Graphics;

            // Convert X and Y values to screen position
            float pixelYMax = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.Y,max);
            float pixelXMax = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.X,xMax);
            float pixelYMin = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.Y,min);
            float pixelXMin = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.X,xMin);

            PointF point1 = PointF.Empty;
            PointF point2 = PointF.Empty;

            // Set Maximum and minimum points
            point1.X = pixelXMax;
            point1.Y = pixelYMax;
            point2.X = pixelXMin;
            point2.Y = pixelYMin;

            // Convert relative coordinates to absolute coordinates.
            point1 = e.ChartGraphics.GetAbsolutePoint(point1);
            point2 = e.ChartGraphics.GetAbsolutePoint(point2);

            // Draw connection line
            graph.DrawLine(new Pen(Color.Yellow,3), point1,point2);
        }
    }
}

private void chart1_PrePaint(object sender, System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs e)
{
    if(sender is ChartArea){

        ChartArea area = (ChartArea)sender;
        if(area.Name == "Default")
        {
            double max;
            double min;
            double xMax;
            double xMin;

            // Find Minimum and Maximum values
            FindMaxMin( out max, out min, out xMax, out xMin );

            // Get Graphics object from chart
            Graphics graph = e.ChartGraphics.Graphics;

            // Convert X and Y values to screen position
            float pixelYMax = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.Y,max);
            float pixelXMax = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.X,xMax);
            float pixelYMin = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.Y,min);
            float pixelXMin = (float)e.ChartGraphics.GetPositionFromAxis("Default",AxisName.X,xMin);

            // Specify width of triangle
            float width = 3;

            // Set Maximum points
            PointF [] points = new PointF[3];
            points[0].X = pixelXMax - width;
            points[0].Y = pixelYMax - width - 2;
            points[1].X = pixelXMax + width;
            points[1].Y = pixelYMax - width - 2;
            points[2].X = pixelXMax;
            points[2].Y = pixelYMax - 1;

            // Convert relative coordinates to absolute coordinates.
            points[0] = e.ChartGraphics.GetAbsolutePoint(points[0]);
            points[1] = e.ChartGraphics.GetAbsolutePoint(points[1]);
            points[2] = e.ChartGraphics.GetAbsolutePoint(points[2]);

            // Draw Maximum trangle
            graph.FillPolygon(new SolidBrush(Color.Red), points);

            // Set Minimum points
            points = new PointF[3];
            points[0].X = pixelXMin - width;
            points[0].Y = pixelYMin + width + 2;
            points[1].X = pixelXMin + width;
            points[1].Y = pixelYMin + width + 2;
            points[2].X = pixelXMin;
            points[2].Y = pixelYMin + 1;

            // Convert relative coordinates to absolute coordinates.
            points[0] = e.ChartGraphics.GetAbsolutePoint(points[0]);
            points[1] = e.ChartGraphics.GetAbsolutePoint(points[1]);
            points[2] = e.ChartGraphics.GetAbsolutePoint(points[2]);

            // Draw Minimum triangle
            graph.FillPolygon(new SolidBrush(Color.Blue), points);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接