Рисовать графики с помощью мыши

Я строю программу-график, которая отображает до 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);
Другие вопросы по тегам