日期:2014-05-18  浏览次数:20843 次

100求教GDI闪屏问题
我用C#做了个类似CAD的绘图软件.当我绘制的图形较多时,平移和缩放视图屏幕闪的厉害.窗体中我已经启用了双缓冲等东东,但是还是闪.
  this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
  this.SetStyle(ControlStyles.DoubleBuffer, true);
  this.SetStyle(ControlStyles.UserPaint, true);
  this.SetStyle(ControlStyles.ResizeRedraw, true);
  this.UpdateStyles();

其中绘图主要思想是将所有绘制的图形保存到一个List当中,每当重绘的时候在OnPaint函数当中遍历这个List中的所有实体,然后绘制.请问各位大虾有没有什么好的方法解决闪屏问题,谢谢!

------解决方案--------------------
使用双缓冲,应该不会闪烁。闪烁就是对屏幕更新过频繁了。要么是没缓存绘制屏幕操作,要么就是对屏幕更新图片过快。
------解决方案--------------------
使用begin ,end控制会不会好些
那些自动生成的代码都是那样的
------解决方案--------------------
“主要是数据量比较大的时候的绘制问题,图元画多了会很卡”,
我估计问题处在刷新上面,你每画一个图元,应该调用Control.Invalidate 方法 (Rectangle),精确计算刷新曲线,是重绘的图元最少, 去刷新显示控件,而不是Control.Invalidate 方法 () ,这会导致整个图面无效并导致重绘控件,相当于把全部图元重画。
------解决方案--------------------
这些个软件应该对硬件有要求的把,像3dmax啊 哎配置都比开发高多了
------解决方案--------------------
当绘制到一定程度的时候 将绘制好的东西保存成图片,新的再在图片上绘制,这样就不会闪了
不过如果想做撤销这种功能就要考虑好思路了。

希望能够帮到你
------解决方案--------------------
实现只显示屏幕区域的部分,屏幕外看不到就不要显示。
当放大缩小时考虑小的就不用画了,当放大到一定程度可以显示。
缓存释放不用的
希望能帮到你。
顺便问下,你这个类似cad的画图软件,能不能实现跟cad的dwg文件的转换?
还有实现的是层的概念吗?
------解决方案--------------------
画在内存图片中,再开个线程处理画图
------解决方案--------------------
把图像画在一个bitmap中,使用Graphic对象来绘制这个bitmap,然后画好以后贴到屏幕上去。