Как сохранить C# Control плюс дополнительный текст на диск?
У меня есть программа на C#, которая является консольным приложением, но использует объект Chart из System.Windows.Forms.DataVisualization.Charting
без прикрепления Chart
к Form
,
В основном мне нужно создать граф пончик на Chart
управления, напечатайте текст внутри центра пончика, затем сохраните график и текст в файл на диске.
Если я создам TextAnnotation
в PrePaint
событие, затем сохраните диаграмму на диск с DrawToBitmap
наложенный текст не отображается в файле на диске, даже если я использую различные комбинации Chart.Flush
а также Chart.Update
и т.д. Из того, что я могу сказать, событие запускается и TextAnnotation
код выполняется.
С другой стороны, если я вообще не использую события, вместо этого получаю Graphics
объект из Chart.CreateGraphics
, затем Graphics.DrawString
распечатать текст, затем Graphics.Flush
а также Chart.DrawToBitmap
, текст по-прежнему не отображается.
Я предполагаю, что это потому, что Chart.DrawToBitmap
не знает о дополнительных материалах, нарисованных Chart.CreateGraphics
хотя я предполагал Graphics.Flush
позаботится об этом.
Как лучше всего сохранить график и текст?
РЕДАКТИРОВАТЬ: добавлен код в соответствии с просьбой:
static void Main(string[] args)
{
String[] labels = { "Green", "Red", "Yellow", "Dark Red", "Blue" };
Color[] colours = { Color.Green, Color.Red, Color.Yellow, Color.DarkRed, Color.Blue };
Random rng = new Random();
Chart chart = new Chart();
chart.Size = new Size(320, 320);
ChartArea area = new ChartArea();
Series series = new Series();
chart.ChartAreas.Add(area);
series.ChartArea = area.Name;
series.ChartType = SeriesChartType.Doughnut;
series.IsValueShownAsLabel = true;
int total = 0;
for (int i = 0; i != labels.Length; i++)
{
int value = rng.Next(0, 50);
DataPoint p = new DataPoint(0, value);
total += value;
p.Color = colours[i];
p.Label = String.Empty;
p.Font = new Font("Microsoft Sans Serif", 10, FontStyle.Bold);
series.Points.Add(p);
}
series.Tag = total;
chart.Series.Add(series);
chart.Refresh();
using (Graphics g = chart.CreateGraphics())
{
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();
}
String chartFilename = "chart.bmp";
String chartPath = Path.Combine("C:\\Temp", chartFilename);
using (Bitmap bmp = new Bitmap(chart.Width, chart.Height))
{
chart.DrawToBitmap(bmp, chart.Bounds);
bmp.Save(chartPath);
}
System.Diagnostics.Process.Start("mspaint.exe", chartPath);
}
1 ответ
Я подозреваю, что график тянется поверх вашего ярлыка. Когда вы вызываете DrawToBitmap, диаграмма будет учитывать только те визуальные элементы, о которых она знает, а не элементы, нарисованные поверх.
Вам необходимо изменить порядок рисования. т.е.
- Нарисуйте диаграмму в растровое изображение
- С растровым изображением в руке с предварительно отрисованным графиком, нарисуйте метки поверх
Код:
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 ниже в комментариях к:
"ссылка
System.Drawing.Imaging
, иметьPixelFormat
а такжеImageFormat
имеется в наличии. В этот момент изображение сохраняется как с расширением.bmp, а это файл.png (по умолчанию)"