简单记录下双缓冲

最近认识园子一兄弟,跟他聊天时发现彼此都是那种毕业刚满一年
乱七八糟地使用了DONET,乱七八糟地学习C#,乱七八糟地编写WINFORM
一年了,处于迷茫期
偶也是这样!我想大多人都一样,都在想,要不要去学模式,学了也看不懂,应用不上,那我要学什么呢!

回想起以前高考时,到考前两三个月时,我依旧是那种差生,天生就是差生的料!其实也实在不是因为我不努力,只是头脑简单,四肢发达而已,太贪玩了
那时我选修科是物理,广东的朋友可能比较清楚,反正那时就很烂,可我真的有在学,只是学得不好,我记得老师那时跟我说:要不,你就把这一年来做过的题都认真的复习一次,或许从中你就获取一些,基础是重要的,现在每个人都在研习那些高难度的,你就算了,认真打好基础就行了!还记得高考那时我会做的,基本全对了!嘿嘿!

而这句打好基础,也成了我到现在奉行的
后来结果并不理想,依然没考上,只上了集大大专,不过挺好了,已完成我的目标,物理500多分,感觉够了,嘿嘿!

老婆每次在我焦躁时总提醒我他们专业的一句:量变才有质变
而现在,我也在考虑!我是否把去年一年所做过的,总结一下!先来个双缓冲吧!

DONET的双缓冲其实在网上搜下,资料确实不多,可能是做WINFORM的人太少了吧!汗!但还是能找到解决的办法!
一:使用FRAMEWORK提供的
二:自已实现.......................................................(感觉好像是废话)

前提是:    Application.EnableVisualStyles();  一般都开启了
一:
有些控件有doublebuffer属性,则直接设置就可以了,有些没有,那则必须继承下来,将其DOUBLEBUFFER设置成TRUE
或者在构造函数里通过SETSTYLE属性设置
 this.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true);

这样就完成了一个设置控件的双缓冲了,效果好了点了!嘿嘿!一般不是很特别的情况,这都能解决

二:
即是自已写代码,原理即是,先在内存缓冲区把所要改变的图画下来,再把其直接显示至界面,这过程是很短的,所以显示就很平滑了,内存很快嘛!也由于操作系统不是也说,双缓冲是几种缓冲模式中较快的
但是画完记得把其资源DISPOSE掉
这里面FW也提供一种代码级的解决方法
提供了一个叫BufferedGraphicsContext

  BufferedGraphicsContext context = BufferedGraphicsManager.Current;
  context.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
  bufferedGraphics = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));

然后即是在计时器里,把要画的东西画上
下面是一段动画,旋转的,没啥特别,只是为了说明双缓冲,
  angle++;
            if(angle>359)
            {
                angle = 0;
            }
此即时取内存里的来画画
  Graphics g = bufferedGraphics.Graphics;
  g.Clear(Color.Blue);此背景色也可不清除,会出现种经常见的效果,懒得去写代码了,嘿嘿!
  System.Drawing.Drawing2D.Matrix matrix = new Matrix();
  matrix.Rotate(angle, MatrixOrder.Prepend);顺时针转
 matrix.Translate(this.ClientSize.Width / 2, this.ClientSize.Height / 2, MatrixOrder.Append);

   g.Transform = matrix;
   g.FillRectangle(Brushes.IndianRed, -100, -100, 200, 200);
   bufferedGraphics.Render(Graphics.FromHwnd(this.Handle));
画好后再将内存里的图像,画到具有某窗口句柄的窗口上

为什么要传个窗口句柄呢!还想不清楚,估计是以前WIN32的GDI存下来的,其实WINDOWS都是围绕句柄来的,前段时间做过语音的获取,包括GOOGLE TALK的语音分配函数,也都是要!随便传个真的窗口句柄都行,至于为什么要传,还是没想通,望相告!

感觉WINFORM的委托机制某些应用也即像发消息,只是有队列,比较安全,就像SENDMESSAGE POSTMESSAGE,愚见,也望相告!

通过这两个方法,一段能解决部分由于双缓冲而引起的界面闪烁问题
还有一段更绝的,不使用bufferedGraphics,原理是一样的,改天再把代码贴出来,格机的时候忘了扔那去了!嘿嘿!

一直以来都想去试下WPF,没机会也没时间,希望这个项目忙完能有空出来,嘿嘿!是WPF好呢!还是ASP.NET好呢!还是继承学习WINFORM,哈哈,又乱想了

...忘了贴图了

一直转的

posted @ 2008-06-28 21:14  yellowyu  阅读(902)  评论(4编辑  收藏  举报