我正忙着开发一个C#win表单应用程序,它以层次结构绘制数据库结构的图形表示。
一切正常,我只是滚动问题。它有一个不好的闪烁问题。
我研究了以下内容:
当你想要刷新表面时调用Invalidate()
(已经帮了很多但仍然有点滞后)
另外要将DoubleBuffered
属性设置为True(问题是这样,我得到一个ArgumentException
抛出消息“参数无效。”但我可以将DoubleBuffered
设置为true主要形式)
我的设计细节
我有两个班级Node
和Link
他们都有GraphicsPath
个成员,他们都有一个public void Draw(Graphics g)
方法来吸引自己。
我还有一个用户控件调用StructureMap
,它覆盖了protected override void OnPaint(PaintEventArgs e)
方法,循环遍历调用它的绘图函数的每个Node
。循环很简单,因为父节点通过Link
对象链接到子节点。我所要做的就是调用父节点的draw方法,并重新绘制其所有子节点。
我也以同样的方式进行Hit测试。
有没有更好的方法?为什么我的用户控件上的DoubleBuffered
设置为true?
PS:这是我的第一篇文章,让我知道我是怎么做的?
答案 0 :(得分:1)
DoubleBuffered ArgumentException可能是由于您在某处处理图形对象而引起的。
答案 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;
}