У меня есть 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
был проигнорирован.
Что мне не хватает? Не разрешены ли эти методы с двойной буферизацией? И что же мне делать? Масштабировать и переводить мою карту вручную, путем масштабирования и перевода каждой точки данных? Это может привести к наибольшему выигрышу скорости от двойной буферизации.
Я сделал масштабирование и перевод «вручную» внутри 'OnPaint' (чтобы сохранить память), и это достаточно быстро. Basicaly 'OnPaint' в режиме двойной буферизации вызывается только после вызова' Invalidate' и 'Invalidate', если, скажем, изменяется размер управления, что требует пересчета и перевода. Я впечатлен тем, как быстро WinForms может рисовать 2D-графику. – Harry