使用双缓冲会中断 Graphics.PageScale

本文关键字:中断 Graphics PageScale 缓冲 | 更新日期: 2023-09-27 18:37:04

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

我错过了什么?双缓冲不允许使用这些方法吗?那我该怎么办?通过缩放和转换每个数据点来手动缩放和平移我的地图?它可以击败双缓冲带来的大多数速度增益。

使用双缓冲会中断 Graphics.PageScale

通过缩放和转换每个数据点来手动缩放和平移我的地图?它可以击败双缓冲带来的大多数速度增益。

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