我UserControl
设置了下列样式:
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
一样被忽略。
我错过了什么?双缓冲不允许这些方法吗?所以我该怎么做?通过缩放和翻译每个数据点,手动缩放和翻译我的地图?它可以通过双缓冲来抵消大部分速度增益。
答案 0 :(得分:1)
通过缩放和翻译每个数据点,手动缩放和翻译我的地图?它可以通过双缓冲来抵消大部分速度增益。
您可以在绘图处理程序外部缩放地图(每次重新计算视图时);这不应该导致太多的性能损失,特别是如果你使用整数而不是浮点数 整数乘法非常快。