Рисовать графики с помощью мыши
Я строю программу-график, которая отображает до 12 различных графиков. Все графики должны быть видны одновременно
Должна быть возможность изменить активный график с помощью мыши.
Я строю график так:
using (Graphics G = Graphics.FromImage(graph_canvas.Image))
{
chart.draw_statics(G);
}
static_graph = graph_canvas.Image;
chart.draw_statics (G) содержит несколько функций для рисования легенд, сетки,... и 11 неактивных графиков
Я сохраняю это изображение в static_graph
Все идет нормально
Когда мышь движется, предполагается, что указатель мыши изменит цвет графика и отобразит координаты положения мыши.
поэтому, чтобы сэкономить время и память, я беру сохраненное изображение и рисую на нем активный график, а не перерисовываю все графики.
private void graph_canvas_MouseMove(object sender, MouseEventArgs e)
{
Point mouse_pos = e.Location;
chart.set_mouse_pos(mouse_pos);
graph_canvas.Image = (Image)static_graph.Clone();
using (Graphics G = Graphics.FromImage(graph_canvas.Image))
{
chart.draw_actives(G);
}
graph_canvas.Invalidate();
}
public void draw_actives(Graphics surface)
{
G = surface;
draw_mouse();
}
private void draw_mouse()
{
G.DrawLine(mouse_pen, new PointF(mouse_pos.X - 10, mouse_pos.Y), new PointF(mouse_pos.X + 10, mouse_pos.Y));
G.DrawLine(mouse_pen, new PointF(mouse_pos.X, mouse_pos.Y-10), new PointF(mouse_pos.X, mouse_pos.Y+10));
}
когда форма в полноэкранном режиме я получаю сообщение об ошибке
Первое случайное исключение типа "System.OutOfMemoryException" произошло в System.Drawing.dll
1 ответ
Проблема может быть вокруг Clone()
вызов, который требует все больше и больше памяти при каждом перемещении мыши. Я предлагаю вам поменять на:
graph_canvas.Image = new Bitmap(static_graph);