使用双缓冲打破Graphics.PageScale

时间:2015-01-11 22:37:03

标签: c# .net winforms graphics

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一样被忽略。

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

1 个答案:

答案 0 :(得分:1)

  

通过缩放和翻译每个数据点,手动缩放和翻译我的地图?它可以通过双缓冲来抵消大部分速度增益。

您可以在绘图处理程序外部缩放地图(每次重新计算视图时);这不应该导致太多的性能损失,特别是如果你使用整数而不是浮点数 整数乘法非常快。