如何将C#控件以及其他文本保存到磁盘?

时间:2018-09-18 04:17:52

标签: c# .net microsoft-chart-controls

我有一个C#程序,它是一个控制台应用程序,但是使用了System.Windows.Forms.DataVisualization.Charting中的Chart对象,而没有将Chart附加到Form

基本上,我需要在Chart控件上生成一个甜甜圈图,在甜甜圈中心内打印一些文本,然后将图形和文本保存到磁盘上的文件中。

如果我在TextAnnotation事件中创建了PrePaint,然后使用DrawToBitmap将图表保存到磁盘,即使我使用了覆盖文本,也不会在磁盘上的文件中显示Chart.FlushChart.Update的各种组合,等等。据我所知,事件正在触发,TextAnnotation代码正在运行。

另一方面,如果我根本不使用事件,则从Graphics获取一个Chart.CreateGraphics对象,然后从Graphics.DrawString获取文本,然后从{{1} }和Graphics.Flush,仍不会显示该文本。

我猜测这是因为Chart.DrawToBitmap不知道用Chart.DrawToBitmap绘制的多余内容,即使我以为Chart.CreateGraphics会解决这个问题。

保存图形和文本的最佳方法是什么?

编辑:根据要求添加了代码:

Graphics.Flush

1 个答案:

答案 0 :(得分:2)

我怀疑图表在您的标签上方绘制。当您调用DrawToBitmap时,图表将仅考虑其知道的视觉效果,而不考虑之后绘制的元素。

您需要颠倒绘图顺序。即

  1. 将图表绘制到位图中
  2. 将位图与预渲染的图表放在手中,在顶部绘制标签

代码:

using (Bitmap bmp = new Bitmap(chart.Width, chart.Height))
{
    chart.DrawToBitmap(bmp, chart.Bounds); // draw chart into bitmap first!

    using (Graphics g = Graphics.FromImage(bmp)) // <--- new
    {
        // now draw label
        String str = series.Tag.ToString();
        Font font = new Font("Microsoft Sans Serif", 32, FontStyle.Bold);
        SizeF strSize = g.MeasureString(str, font);

        int strX = 100; int strY = 100;

        g.DrawString(str, font, new SolidBrush(Color.Black), strX, strY);
        g.DrawRectangle(new Pen(Color.Black), new Rectangle(strX, strY, (int)strSize.Width, (int)strSize.Height));

        g.Flush();
    }

    bmp.Save(chartPath);
}

编辑:请确保遵循以下评论中的Jimi's建议:

  

”引用System.Drawing.Imaging,以使PixelFormatImageFormat可用。目前,图像以.bmp扩展名保存,而它是.png文件。 (默认)“