2016-01-20 2 views
1

Я создаю программу диаграммы, которая отображает до 12 разных графиков. Все графики должны быть видны одновременно.рисовать диаграммы с мышь ввода

Должен быть возможно изменить активный график с помощью мыши.

я построить диаграмму, как это:

using (Graphics G = Graphics.FromImage(graph_canvas.Image)) 
{ 
    chart.draw_statics(G); 
} 
static_graph = graph_canvas.Image; 

chart.draw_statics (G) содержит несколько Funtions рисовать легенды, сетки, ... и 11 неактивных график

сохраняет это изображение в static_graph

до сих пор так хорошо

при перемещении мыши, намерение состоит в том, что указатель мыши на прим графике в r и отображает координаты положения мыши.

поэтому в mousemove , чтобы сэкономить время и память, я беру сохраненное изображение и рисую активный график, а не перерисовывая все графики.

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

Это забавно, чтобы попытаться 'спасти [...] memory' и в конечном итоге с OutOfMemory ошибки :) Я хотел бы посмотреть вокруг линии Clone(). –

+0

Спасибо Томас! Это сделал трюк! Изменена линия clone() на graph_canvas.Image = new Bitmap (static_graph); и постройте растровое изображение static_graph следующим образом: graph_canvas.DrawToBitmap (static_graph, новый Rectangle (новая точка (graph_canvas.Top, graph_canvas.Left), graph_canvas.Size)); – Blob

ответ

0

В проблема может быть вокруг вызова Clone(), который требует все больше и больше памяти при каждом перемещении мыши. Я предлагаю вам изменить для:

graph_canvas.Image = new Bitmap(static_graph); 
+0

сделал трюк! спасибо – Blob

+0

Конечно, извините, я думал, что мой представитель был слишком низким, чтобы принять ответ. поскольку он должен был проголосовать за ответ ... – Blob

 Смежные вопросы

  • Нет связанных вопросов^_^