2015-01-11 3 views
0

У меня есть UserControl с folowing стили набор:Использование двойной буферизации ломает Graphics.PageScale

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

У меня есть OnPaint обработчик событий, который устанавливает Graphics.PageScale и Graphics.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

Я сделал масштабирование и перевод «вручную» внутри 'OnPaint' (чтобы сохранить память), и это достаточно быстро. Basicaly 'OnPaint' в режиме двойной буферизации вызывается только после вызова' Invalidate' и 'Invalidate', если, скажем, изменяется размер управления, что требует пересчета и перевода. Я впечатлен тем, как быстро WinForms может рисовать 2D-графику. – Harry

Смежные вопросы