【问题标题】:Draw on MSChart control在 MSChart 控件上绘图
【发布时间】:2013-05-07 02:43:33
【问题描述】:

我有一个简单的折线图,我想通过围绕该线绘制一个矩形(理想情况下是一个具有透明度的填充矩形...)来突出显示该图的某些部分。我不知道这是否可以通过 MS 图表控件实现?

【问题讨论】:

  • 使用控件的 PostPaint 事件。

标签: c# charts mschart rectangles


【解决方案1】:

我建议您下载code samples from MS 并查看注释部分。在那里,您将找到实现您所描述的所需的所有文档:

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

【讨论】:

  • 太棒了!您现在是否有想法偏移矩形以使左下角成为锚点?
  • 最后我没有使用 AnchorOffset 属性,因为行为不连贯(设置 x 偏移也会导致 y 中的偏移......??)。相反,我使用 X 和 Y 属性设置位置而不进行锚定,这在我的情况下不是问题。
  • 您现在是否有想法偏移矩形以使左下角成为锚点? - 我认为您可以设置一个negativeHeight 来实现这一点。跨度>
【解决方案2】:

你的意思是:

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))

alpha0255,因此您的 alpha 的值 128 将为您提供 50% 不透明度。

【讨论】:

  • 好吧,我的意思是使用控件 System.Windows.Forms.DataVisualiztion.Charting.Chart 并覆盖一个矩形。
【解决方案3】:

当您想在图表上绘图时,您可以添加 LineAnnotation 或 RectangleAnnotation。但是,如果您想要更多控制权,您可以使用图表的 PrePaint 和 PostPaint 事件。如果你会画画,那么你可以画任何东西。同样使用它会使图表“打印”和“导出”看起来与您绘制的相同。当图表在屏幕上的位置发生变化时,在它上面画会看起来很有趣,所以总是在上面画。

假设你有一个交易图表,你需要画一条线来说明你在哪里获利,或者画一条正方形来说明你在哪里“做某事”tzhen只需添加从哪里到你想去的坐标和你一起去......

MS Chart sample project 显示如何使用以下代码执行此操作(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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多