仅重绘窗格的一部分

Redraw only a part of the pane

我正在使用 ZedGraph 在我的应用程序上显示曲线(具有 10k+ 个点)。

我添加了垂直条以允许用户查看一个点的值(一种十字准线)。每次用户移动鼠标时,整个控件都会重绘:

bool stackedGraphControl1_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
{
    DrawCursors(e.Location);
    Refresh();
    return false;
}

超过 2 条曲线,计算机变得迟钝。一种解决方案是仅绘制垂直条(删除 Refresh() 调用并仅绘制垂直条)。这要快得多,但图形结果很有趣:

但用处不大。我明白了,所有的竖条都是一遍又一遍地绘制而没有被删除。

有没有办法只重绘(即:删除和绘制)条形图(位于我窗格的 GraphObjList 中)?

过去我通过覆盖 ZedGraphControl 的 OnPaint 来创建分层绘图效果来实现此功能。

将 ZedGraph 绘制到中间位图或 BufferedGraphics。保存此位图以供将来绘制,并在其他内容发生变化时使位图无效(轴值、添加的曲线)

未来的 OnPaint 调用此 Bitmap 到图形对象,并在其上手动绘制任何 GraphObjs。

MouseMove 事件仅更新指标的属性并强制使用缓存的 zedgraph 图像重绘。