C#滚动自定义图形以减少闪烁的更好方法

时间:2012-07-06 11:38:41

标签: c# scroll flicker reduce graphic

我正忙着开发一个C#win表单应用程序,它以层次结构绘制数据库结构的图形表示。

一切正常,我只是滚动问题。它有一个不好的闪烁问题。

我研究了以下内容:

C# graphics flickering

当你想要刷新表面时调用Invalidate()(已经帮了很多但仍然有点滞后)

另外要将DoubleBuffered属性设置为True(问题是这样,我得到一个ArgumentException抛出消息“参数无效。”但我可以将DoubleBuffered设置为true主要形式)

我的设计细节

我有两个班级NodeLink他们都有GraphicsPath个成员,他们都有一个public void Draw(Graphics g)方法来吸引自己。

我还有一个用户控件调用StructureMap,它覆盖了protected override void OnPaint(PaintEventArgs e)方法,循环遍历调用它的绘图函数的每个Node。循环很简单,因为父节点通过Link对象链接到子节点。我所要做的就是调用父节点的draw方法,并重新绘制其所有子节点。

我也以同样的方式进行Hit测试。

有没有更好的方法?为什么我的用户控件上的DoubleBuffered设置为true?

PS:这是我的第一篇文章,让我知道我是怎么做的?

3 个答案:

答案 0 :(得分:1)

DoubleBuffered ArgumentException可能是由于您在某处处理图形对象而引起的。

另请参阅本文; What could cause Double Buffering to kill my app?

答案 1 :(得分:0)

您的闪烁声音是由绘制图像所需的处理量造成的。

缓解这种情况的一种方法是将模型绘制到屏幕外位图,然后使用绘画/滚动等将该位图绘制到屏幕上。

然后,只有在模型更改时才更新位图。

答案 2 :(得分:0)

使用位图作为背景图像将减少闪烁。也许是这样的:

 private Bitmap _backBuffer;
 private void Form1_Paint(object sender, PaintEventArgs e)
 {
      if (_backBuffer == null)
        {
            _backBuffer = new Bitmap(Form1.Width, Form1.Height, PixelFormat.Format32bppRgb);
        }
        Graphics g = Graphics.FromImage(_backBuffer);

        g.SmoothingMode = SmoothingMode.HighQuality;

        drawSomething(g);

        //Copy the back buffer to the screen
        e.Graphics.DrawImageUnscaled(_backBuffer, 0, 0);
        Form1.BackgroundImage = _backBuffer;
 }