首页 > 开发 > 综合 > 正文

C#的双缓存技术

2024-07-21 02:26:34
字体:
来源:转载
供稿:网友

protected override void onpaint(painteventargs e)
  {

   system.drawing.bitmap b = new bitmap(this.width,this.height);//双缓冲技术,先将所有要画的画在该图片中,再调用gs画出该图片.
   graphics g = graphics.fromimage((system.drawing.image)b);
   //

在这里画你所需要画的

//
   e.graphics.drawimage((system.drawing.image)b,0,0);
   g.dispose();

base.onpaint (e);
  
  }

 

其中要用到的一个技术就是双缓存技术,双缓冲技术是为了解决界面闪烁而采用的一项技术,就是将要绘制的界面先绘制在内存中一个虚拟的、和正在显示的界面同样大小的一个区域上,界面变化时将这个内存中的图象一次性绘制到屏幕上。graphics gxoff;if (m_bmpoffscreen == null) //要双缓冲的位图。m_bmpoffscreen = new bitmap(clientsize.gxoff = graphics.gxoff.//绘制一些位图。//从内存位图绘制。}在上面的代码中,我们通过调用 graphics 类的静态 fromimage 方法在与我们的控件大小相同的空位图中创建了一个 graphics 对象。

======================================

通常,双缓存逻辑如下所示:

protected override void onpaint(painteventargs e ){graphics gxoff; //屏幕外的图像   if (m_bmpoffscreen == null) //要双缓冲的位图   {      m_bmpoffscreen = new bitmap(clientsize.width, clientsize.height);   }            gxoff = graphics.fromimage(m_bmpoffscreen);   gxoff.clear(this.backcolor);   //绘制一些位图   gxoff.drawimage(bmpparent, 0, 0, bmprect, graphicsunit.pixel);      //边界矩形rectangle rc = this.clientrectangle;   rc.width--;   rc.height--;               //绘制边界   gxoff.drawrectangle(new pen(color.black), rc);   //从内存位图绘制   e.graphics.drawimage(m_bmpoffscreen, 0, 0);   base.onpaint( e );}
在上面的代码中,我们通过调用 graphics 类的静态 fromimage 方法在与我们的控件大小相同的空位图中创建了一个 graphics 对象。我们在内存中的 graphics 对象上进行所有的绘图,完成后,将整个准备好的位图覆盖到控件的图形上即可。

添加这段代码
public void refresh()
{
setstyle(controlstyles.supportstransparentbackcolor,true);
setstyle(controlstyles.allpaintinginwmpaint, true);
setstyle(controlstyles.userpaint, true);
setstyle(controlstyles.doublebuffer, true);
refresh();
}

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表