使用鼠标输入绘制图表
draw charts with mouse input
我正在构建一个最多可显示 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
到目前为止一切顺利
当鼠标移动时,其目的是使鼠标指针变为图形的颜色并显示鼠标位置的坐标。
所以在 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));
}
当表单处于全屏模式时,我收到一条错误消息
A first chance exception of type 'System.OutOfMemoryException'
occurred in System.Drawing.dll
问题可能与 Clone()
调用有关,每次移动鼠标时它需要越来越多的内存。我建议你换成:
graph_canvas.Image = new Bitmap(static_graph);
我正在构建一个最多可显示 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
到目前为止一切顺利
当鼠标移动时,其目的是使鼠标指针变为图形的颜色并显示鼠标位置的坐标。
所以在 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));
}
当表单处于全屏模式时,我收到一条错误消息
A first chance exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll
问题可能与 Clone()
调用有关,每次移动鼠标时它需要越来越多的内存。我建议你换成:
graph_canvas.Image = new Bitmap(static_graph);