快速平稳地滚动图像

时间:2015-05-13 21:04:31

标签: c# .net winforms

使用滚动条在浏览器中滚动图像时 - 图像快速平滑地滚动。另一方面,使用Graphics.DrawImage进行紧密循环,每次迭代将位置的X坐标递增1 - 返回慢动作。 (即使在控制DoubleBuffered之后它也有些生涩。)

如何像浏览器一样快速渲染?

修改

void DoNow()
{
    Rectangle rec1 = new Rectangle(Point.Empty, panel1.BackgroundImage.Size);
    Rectangle rec2 = new Rectangle(Point.Empty, panel1.BackgroundImage.Size);

    using (Graphics g = Graphics.FromImage(panel1.BackgroundImage))
    {
        for (int i = 0; i < 100; i++)
        {
            rec2.Location = new Point(rec2.Location.X + 1, rec2.Location.Y);
            g.DrawImage(image, rec1, rec2, GraphicsUnit.Pixel);
            panel1.Refresh();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

从评论中可以看出,我的问题的答案是浏览器使用Winforms无法使用的硬件加速。 (如果我错了,请随时纠正我。)

答案 1 :(得分:0)

最简单的解决方案是使用Panel对象,滚动条设置为Auto。将图片框作为子对象放置,并将大小模式设置为“自动”。图片框将扩展为您指定给它的图像的大小。由于图片框将扩展为大于面板,因此将显示面板的滚动条。使用面板滚动图像时,它将是平滑的。

如果您仍想自己手动提供绘图,则会出现“闪烁”,因为Invalidate方法会自动执行在OnPaint事件期间未执行的背景擦除。您需要子类化您正在绘制的父控件并覆盖OnPaintBackground事件。如下所示:

protected override void OnPaintBackground(PaintEventArgs pevent)
{
   // base.OnPaintBackground(pevent);
}

另外,请记住在OnPaint事件期间执行所有绘图并使用e.Graphics对象。