2016-01-20 80 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

到目前爲止好

當鼠標移動,其用意是,鼠標指針變爲圖形的colou r並顯示鼠標位置的座標。

因此在鼠標移動中 爲了節省時間和內存,我將保存的圖像繪製到活動圖形上,而不是重繪所有圖形。

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

這很有趣,嘗試''保存內存',並最終出現OutOfMemory錯誤:)我會看看克隆()行。 –

+0

謝謝Thomas!這就是訣竅! 將clone()行更改爲 graph_canvas.Image = new Bitmap(static_graph); 並像這樣構建static_graph位圖: graph_canvas.DrawToBitmap(static_graph,new Rectangle(new Point(graph_canvas.Top,graph_canvas.Left),graph_canvas.Size)); – Blob

回答

0

的問題可能出在Clone()呼叫周圍,每次移動鼠標時需要越來越多的內存。我建議你改變:

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

做到了! 謝謝 – Blob

+0

當然,對不起,我認爲我的代表太低而無法接受答案。因爲它是投票的答案... – Blob