1

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

一切正常,只是滚动有问题。它有一个糟糕的闪烁问题。

我研究了以下内容:

C#图形闪烁

当你想刷新表面时打电话Invalidate()(帮助很大,但仍然有点滞后)

还要将DoubleBuffered属性设置为 True (这个问题我收到一条ArgumentException消息“参数无效。”。但我可以DoubleBuffered在我的主窗体上设置为 true)

我的设计细节

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

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

我也在以同样的方式进行命中测试。

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

PS:这是我的第一篇文章,请告诉我我是怎么做的?

4

3 回答 3

1

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

另请参阅本文;什么可能导致双缓冲杀死我的应用程序?

于 2012-07-06T11:44:26.137 回答
0

您闪烁的声音似乎是由绘制图像所需的处理量引起的。

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

然后仅在您的模型更改时更新位图。

于 2012-07-06T12:09:46.597 回答
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;
 }
于 2014-09-28T09:10:36.680 回答