谁能给一个用双缓冲播放一个文件夹下的图片的程序
谢谢。
------解决方案--------------------
到网上搜双缓冲,都会搜到两段被无数人转载的双缓冲的代码,但是由于其解释不是很详细,造成了阅读的困难,尤其是对于GDI的新手来说。于是,我将该代码研究了一下,写一个稍微详细的注释,仅供参考。
在构造函数里添加
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
依然是写在 override OnPaint里
protected override void OnPaint(PaintEventArgs e)//双缓冲画图
{
Image i= new Bitmap(Image.FromFile("sample.png"));//建立一个画布
Graphics g = Graphics.FromImage(i);//把画布加载到画刷里
Rectangle rect = e.ClipRectangle;//当前Form的大小矩形
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;//创建图形缓冲区
BufferedGraphics myBuffer = currentContext.Allocate(g, e.ClipRectangle);//为双缓冲提供图形缓冲区
myBuffer.Graphics.SmoothingMode = SmoothingMode.HighQuality;
myBuffer.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
myBuffer.Graphics.Clear(this.BackColor);
Rectangle Pic = new Rectangle(StartPosition.X, StartPosition.Y, Width, Height);//你想在Form里画出图形的其实位置,长何宽
myBuffer.Graphics.DrawImage(i, rect , Pic, GraphicsUnit.Pixel);//在内存里画图
e.Graphics.DrawImage(i, Back);//画到Form中
myBuffer.Render(e.Graphics);
myBuffer.Dispose();
g.Dispose();
base.OnPaint(e);
}
好了,如果对注释还不是很清楚的话,可以修改Rectangle 的参数进行深刻体会
另外顺便说一下Graphics,Image,Bitmap之间的关系:
Bitmap是创建一张图片,Image是将Bitmap所创建的图片加载到画布上,Graphics是在Image上进行画图
如果图片要不停刷新的画,双缓冲的优势是比较大的,顾名思义,双缓冲就是把要画的图片先在内存中一次画好,然后整体画到Form中。而不用双缓冲的话,则是每在图片上处理一次,Form都要刷新一次,这样执行起来浪费资源,效率降低。
------解决方案--------------------帮忙顶下~~