使用双缓冲中断 Graphics.PageScale

Using double buffering breaks Graphics.PageScale

UserControl 设置了以下样式:

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);

我有 OnPaint 事件处理程序,它设置 Graphics.PageScaleGraphics.TranslateTransform() 来设置我的地图位置和比例:

protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    if (Splines == null) return;
    var pens = new[] {
        new Pen(TrackColor),
        new Pen(TrackColor),
        new Pen(RoadColor),
        new Pen(RiverColor),
        new Pen(CrossColor)
    };
    var b = Splines.Bounds;
    Graphics g = e.Graphics;
    g.PageScale = _CurrentScale;
    g.TranslateTransform(-b.Left, -b.Top);
    foreach (var s in Splines) {
        if (s.L) g.DrawLine(pens[s.T], s.A, s.D);
        else g.DrawBezier(pens[s.T], s.A, s.B, s.C, s.D);
    }
    foreach (var p in pens) p.Dispose();
}

如果没有双缓冲,它可以按预期工作,但速度很慢。使用双缓冲它根本不起作用,我只得到背景。

当我禁用 Graphics.TranslateTransform() - 我绘制了未缩放的地图。像 Graphics.PageScale 被忽略了。

我错过了什么?双缓冲不允许使用这些方法吗?所以我该怎么做?通过缩放和平移每个数据点来手动缩放和平移我的地图?它可以抵消双缓冲带来的大部分速度增益。

Scale and translate my map manually, by scaling and translating each data point? It could defeat most speed gain from double buffering.

您可以在绘制处理程序之外缩放地图(每次重新计算视图时);这不会对性能造成太大影响,尤其是当您使用整数而不是浮点数时。
整数乘法非常快。